NullReferenceException when inserting a document containing a table with a document variable having a line break (\n) in its value.
 
	
 
	
 
	
		 
	
		 
	
 
	
Latest version 2024.2.426:
Old version 2022.3.906:
Use the following code:
        static void Main(string[] args)
        {
            Console.WriteLine("Test from 2022.3.906 to 2024.2.426.");
            string html = @"<html>
                <head>
                    <style type=""text/css"">
                            h1 {
                               background-color: red;
                              }
                            #highlight1{
                                background-color: blue;
                             }
                           .highlight2{
                                background-color: yellow;
                             }
                     </style>
                </head>
                <body>
                   <h1>H1 - This Works </h1>
                   <h2 id=""highlight1"">H2 with id selector.  This works too.</h2>
                   <h3 class=""highlight2"">H3 with class selector.  This didn't work</h3>
                </body>
                </html>";
            Telerik.Windows.Documents.Flow.FormatProviders.Html.HtmlFormatProvider html_provider = new Telerik.Windows.Documents.Flow.FormatProviders.Html.HtmlFormatProvider();
            RadFlowDocument document = html_provider.Import(html);
            string html_output = "output.html";
            using (Stream output = File.Create(html_output))
            {
                html_provider.Export(document, output);
            }
            Process.Start(new ProcessStartInfo() { FileName = html_output, UseShellExecute = true });
        }When importing a RTF document with bullet lists and exporting the RadFlowDocument back to RTF format the following result is observed:
- the bullet's left offset is changed
- the bullets color is also changed
Workaround: use the Telerik.Windows.Documents.FormatProviders.Rtf.RtfFormatProvider available in the Telerik.Windows.Documents.FormatProviders.Rtf.dll
In a WPF project targeting .NET 6, the following code snippet results in an error:
        public MainWindow()
        {
            InitializeComponent();
            Telerik.Windows.Documents.Flow.FormatProviders.Html.HtmlFormatProvider provider = new Telerik.Windows.Documents.Flow.FormatProviders.Html.HtmlFormatProvider();
            RadFlowDocument document = provider.Import("<html><body><h1>My First Heading</h1><p>My first paragraph.</p></body></html>");
        }System.IO.FileNotFoundException: 'Could not load file or assembly 'System.Text.Encoding.CodePages, Version=7.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. The system cannot find the file specified.'
Workaround: edit the .csproj file and include the required package reference:
	<ItemGroup>
		<PackageReference Include="Telerik.Windows.Documents.Flow" Version="2024.2.426" />
		<PackageReference Include="System.Text.Encoding.CodePages" Version="7.0.0" />
	</ItemGroup>
	<ItemGroup>
		<FunctionsPreservedDependencies Include="System.Text.Encoding.CodePages.dll" />
	</ItemGroup>
 
	
Styles with names only different in spaces are treated as one.
Workaround:
var rtf = File.ReadAllText(fileName);
rtf = this.RenameStyleDifferentInOnlySpaces(rtf);
var document = provider.Import(rtf);
...
private string RenameStyleDifferentInOnlySpaces(string rtf)
{
    HashSet<string> styles = new HashSet<string>();
    string pattern = @"{\\(?:\*\\c)?s([0-9]+)[^}]*\n?[^}]*\\[^' ]* ?'?([^;]*)";
    var matches = Regex.Matches(rtf, pattern);
    foreach (Match match in matches)
    {
        string styleName = match.Groups[2].Value.Replace(" ", string.Empty);
        if (styles.Contains(styleName))
        {
            styleName = this.ReplaceOldStyleName(ref rtf, styles, match).Replace(" ", string.Empty);
        }
        styles.Add(styleName);
    }
    return rtf;
}
private string ReplaceOldStyleName(ref string rtf, HashSet<string> styles, Match match)
{
    string oldStyleName = match.Groups[2].Value;
    StringBuilder styleNameBuilder = new StringBuilder(oldStyleName + "0");
    while (styles.Contains(styleNameBuilder.ToString().Replace(" ", string.Empty)))
    {
        styleNameBuilder.Append("0");
    }
    string oldMatch = match.Groups[0].Value;
    string newMatch = oldMatch.Replace(oldStyleName, styleNameBuilder.ToString());
    rtf = rtf.Replace(oldMatch, newMatch);
    return styleNameBuilder.ToString();
}
StackOverflowException when importing a document with style based on itself.
Use the following code to strip the faulty "based on" definition from the RTF:
RtfFormatProvider provider = new RtfFormatProvider();
var rtf = File.ReadAllText(ofd.FileName);
rtf = this.ReplaceSelfBasedOnStyle(rtf);
this.flowDocument = provider.Import(rtf);
...
private string ReplaceSelfBasedOnStyle(string rtf)
{
    string pattern = @"{[\n]*\\s[0-9]+[^;]* \\\w* (Normal);}";
    var matches = Regex.Matches(rtf, pattern);
    foreach (Match match in matches)
    {
        string oldValue = match.Value;
        string newValue = oldValue.Replace(@"\sbasedon0 ", string.Empty);
        rtf = rtf.Replace(oldValue, newValue);
    }
    return rtf;
}