Corrupted document when exporting "Courier New" subset.
Workaround - fully embed the font:
var pdfFormatProvider = new PdfFormatProvider();
pdfFormatProvider.ExportSettings.FontEmbeddingType = FontEmbeddingType.Full;
When imported in the WordsProcessing model, the current HTML doesn't respect the defined column width and all columns have identical width:
<colgroup>
<col span="1" style="width: 33.3302%;">
<col span="1" style="width: 17.5658%;">
<col span="1" style="width: 49.104%;">
</colgroup>Observed result:
Expected result:
Workaround: use the width property as follows:
<colgroup>
<col span="1" width="33.3302%">
<col span="1" width="17.5658%">
<col span="1" width="49.104%">
</colgroup>
<w:sdt>
<w:sdtPr>
<w:text w:multiLine="1"/>
</w:sdtPr>
<w:sdtContent>
<w:r>
<w:t>Line 1</w:t>
</w:r>
<w:r>
<w:br/>
</w:r>
<w:r>
<w:t>Line 2</w:t>
</w:r>
</w:sdtContent>
</w:sdt>Import/export strips w:colFirst and w:colLast from table's <w:permStart> elements.
Expected:
Actual:
The TextProperties.FontSize property specifies the font size for text fragments. The property is of type double. The measurement unit used for font size in RadPdfProcessing is Device Independent Pixels (DIPs). You can convert it to points or other units using the Unit class.
However, when using the TextProperties with widgets the font conversion is not correct. Let's consider the case that we build a PDF document with a TextBoxField occupying a specific rectangle. According to the set text value, we should calculate the appropriate font size so the whole content can fit in the widget's rectangle.
/// <summary>
/// Creates a TextBoxField with calculated font size for the given rectangle
/// </summary>
private static TextBoxField CreateTextBoxWithCalculatedFont(string name, string text, Rect rect, double fontSize, FontBase font)
{
TextBoxField field = new TextBoxField(name);
field.TextProperties.FontSize = Unit.DipToPoint(fontSize);
field.TextProperties.Font = font;
field.Value = text;
var widget = field.Widgets.AddWidget();
widget.Rect = rect;
widget.Border.Width = 0;
widget.TextProperties.FontSize = Unit.DipToPoint(fontSize);
widget.TextProperties.Font = font;
return field;
}
/// <summary>
/// Calculates the optimal font size for text to fit within a specific rectangle
/// </summary>
public static double CalculateFontSizeForRectangle(string text, Rect rect, FontBase font)
{
double fontSize = 0;
Size measuredSize = new Size(0, 0);
Size availableSize = rect.Size;
while (measuredSize.Width<availableSize.Width && measuredSize.Height< availableSize.Height)
{
fontSize++;
Block block = new Block();
block.TextProperties.FontSize = fontSize;
block.TextProperties.Font = font;
block.InsertText(text);
measuredSize = block.Measure();
}
return fontSize-1;
} // Example: Wide textbox with calculated font size
string wideText = "This is a wide textbox that demonstrates horizontal fitting of text content.";
Rect wideRect = new Rect(200, 500, 400, 30);
double wideFontSize = CalculateFontSizeForRectangle(wideText, wideRect, font);
TextBoxField wideTextBoxField = CreateTextBoxWithCalculatedFont("WideTextBox", wideText, wideRect, wideFontSize, font);
document.AcroForm.FormFields.Add(wideTextBoxField);
var wideWidget = wideTextBoxField.Widgets.First();
page.Annotations.Add(wideWidget);
wideWidget.RecalculateContent();
RadFlowDocumentEditor.InsertDocument throws NullReferenceException when inserting a document with incorrectly paired permission range elements.
Valid (Nested):
<w:permStart w:id="1"/>
<w:permStart w:id="2"/>
... content ...
<w:permEnd w:id="2"/>
<w:permEnd w:id="1"/>Invalid (Overlapped):
<w:permStart w:id="1"/>
<w:permStart w:id="2"/>
<w:permEnd w:id="1"/>
<w:permEnd w:id="2"/>Workaround - Remove all Permission Ranges before inserting:
var startPermissionRanges = contentDocument.EnumerateChildrenOfType<PermissionRangeStart>().ToList();
var endPermissionRanges = contentDocument.EnumerateChildrenOfType<PermissionRangeEnd>().ToList();
foreach (PermissionRangeStart rangeStart in startPermissionRanges)
{
rangeStart.Paragraph.Inlines.Remove(rangeStart);
}
foreach (PermissionRangeEnd rangeEnd in endPermissionRanges)
{
rangeEnd.Paragraph.Inlines.Remove(rangeEnd);
}
Paragraphs with a bulleted "Normal" style, but with bullets removed inline, revert to showing bullets after import/export with Telerik Document Processing (DPL)—is not the intended behavior. Inline overrides, such as manually removing bullets from specific paragraphs, should be preserved after processing:
Cached formula values are not respected for the AdditionExpression type.
GetResultValueAsString returns "#NAME?".
static void Main(string[] args)
{
Telerik.Windows.Documents.Flow.Model.RadFlowDocument document = CreateDocument();
Telerik.Windows.Documents.Flow.FormatProviders.Docx.DocxFormatProvider provider = new Telerik.Windows.Documents.Flow.FormatProviders.Docx.DocxFormatProvider();
string outputFilePath = "output.docx";
File.Delete(outputFilePath);
using (Stream output = File.OpenWrite(outputFilePath))
{
provider.Export(document, output, TimeSpan.FromSeconds(10));
}
Process.Start(new ProcessStartInfo() { FileName = outputFilePath, UseShellExecute = true });
}
//Not working example
private static RadFlowDocument CreateDocument()
{
int FullPercentWidth = 100;
var document = new RadFlowDocument();
var editor = new RadFlowDocumentEditor(document);
editor.InsertSection();
var header = document.Sections.First().Headers.Add().Blocks.AddParagraph();
header.TextAlignment = Alignment.Center;
editor.MoveToParagraphStart(header);
editor.InsertLine("Dissemination Label");
var br = new Break(document);
header.Inlines.Add(br);
editor.MoveToParagraphEnd(header);
editor.InsertText("Test");
editor.MoveToParagraphStart(document.Sections.First().Blocks.AddParagraph());
editor.InsertParagraph();
editor.InsertLine("First Header");
editor.InsertLine("Second Header");
editor.TableFormatting.StyleId = BuiltInStyleNames.TableGridStyleId;
document.StyleRepository.AddBuiltInStyle(BuiltInStyleNames.TableGridStyleId);
Table table = editor.InsertTable();
table.PreferredWidth = new TableWidthUnit(TableWidthUnitType.Percent, FullPercentWidth);
table.LayoutType = TableLayoutType.AutoFit;
TableRow headerRow = table.Rows.AddTableRow();
var cell = headerRow.Cells.AddTableCell();
var cellParagraph = cell.Blocks.AddParagraph();
_ = cellParagraph.Inlines.AddRun("ID");
var cell2 = headerRow.Cells.AddTableCell();
var cellParagraph2 = cell2.Blocks.AddParagraph();
_ = cellParagraph2.Inlines.AddRun("Title");
var cell3 = headerRow.Cells.AddTableCell();
var cellParagraph3 = cell3.Blocks.AddParagraph();
_ = cellParagraph3.Inlines.AddRun("Page Number");
for (var i = 0; i < 3; i++)
{
var dataRow = table.Rows.AddTableRow();
string id = "ID-" + i;
var cell4 = dataRow.Cells.AddTableCell();
var cellParagraph4 = cell4.Blocks.AddParagraph();
_ = cellParagraph4.Inlines.AddRun(id);
var cell5 = dataRow.Cells.AddTableCell();
var cellParagraph5 = cell5.Blocks.AddParagraph();
_ = cellParagraph5.Inlines.AddRun($"Fake Title {i}");
var cell6 = dataRow.Cells.AddTableCell();
var cellParagraph6 = cell6.Blocks.AddParagraph();
editor.MoveToParagraphStart(cellParagraph6);
editor.InsertField($"PAGEREF bookmark-{id}", string.Empty);
}
for (var i = 0; i < 3; i++)
{
var id = "ID-" + i;
var section = document.Sections.AddSection();
section.SectionType = SectionType.NextPage;
var header2 = document.Sections.Count == 1
? document.Sections.AddSection().Headers.Add().Blocks.AddParagraph()
: document.Sections.Last().Headers.Add().Blocks.AddParagraph();
editor.MoveToParagraphStart(header2);
editor.InsertLine("Dissemination Label");
editor.InsertBreak(BreakType.LineBreak);
editor.InsertLine("Fake Header");
editor.InsertText("Display name");
var table2 = new Table(document)
{
PreferredWidth = new TableWidthUnit(TableWidthUnitType.Percent, FullPercentWidth),
LayoutType = TableLayoutType.AutoFit
};
var headerRow2 = table2.Rows.AddTableRow();
headerRow2.CanSplit = false;
var headerCell = headerRow2.Cells.AddTableCell();
var headerParagraph = headerCell.Blocks.AddParagraph();
headerParagraph.Inlines.AddRun("Title").FontWeight = FontWeights.Bold;
headerParagraph.Spacing.SpacingAfter = 0;
headerCell.ColumnSpan = 3;
table2.LayoutType = TableLayoutType.FixedWidth;
var row = InsertRow(table2);
var cell7 = row.Cells.AddTableCell();
var cellParagraph7 = cell7.Blocks.AddParagraph();
_ = cellParagraph7.Inlines.AddRun("Stuff and things");
var cell8 = row.Cells.AddTableCell();
var cellParagraph8 = cell8.Blocks.AddParagraph();
_ = cellParagraph8.Inlines.AddRun($"Stuff and things-{id}");
editor.InsertBookmark($"bookmark-{id}");
_ = InsertRow(table2);
_ = InsertRow(table2);
document.Sections.Last().Blocks.Add(table2);
var table3 = new Table(document)
{
PreferredWidth = new TableWidthUnit(TableWidthUnitType.Percent, FullPercentWidth),
LayoutType = TableLayoutType.AutoFit
};
var fakeText = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed laoreet finibus nulla sit amet consectetur. Fusce dignissim sapien congue augue hendrerit, eu rutrum orci lacinia. Maecenas sit amet augue ut arcu consequat molestie ac pretium nulla. Donec venenatis rhoncus pulvinar. Aliquam vel est vitae lacus porta aliquam. Morbi aliquet vulputate turpis, ut vulputate elit accumsan at. Vivamus interdum dictum arcu vel euismod. Curabitur commodo eu nisi ut ultrices. Duis at auctor eros. Vivamus et metus ligula. Vestibulum feugiat velit a feugiat sodales. Sed vitae urna sodales, faucibus felis non, sagittis diam.\r\n\r\nPraesent turpis est, aliquet consectetur felis et, pharetra placerat ipsum. Sed at consectetur metus. Integer dictum iaculis libero, interdum vehicula ipsum convallis a. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pretium ac quam id finibus. Maecenas bibendum magna vel rhoncus eleifend. Etiam nec ante nulla. Etiam lacinia vulputate quam, et ullamcorper magna fermentum quis. Suspendisse potenti. Quisque quis nulla non velit lacinia laoreet. Fusce et lacinia enim, sit amet rhoncus eros. Etiam placerat fringilla nibh ac commodo.\r\n\r\nMorbi ac commodo elit. Sed a leo quis sem convallis volutpat eget et nunc. In laoreet eleifend ullamcorper. Phasellus pharetra molestie eleifend. Cras consequat risus ac est accumsan sagittis. Suspendisse facilisis ultrices ipsum, vitae porttitor augue tincidunt ac. Ut sagittis nisl tristique efficitur aliquam. Pellentesque molestie mauris id ipsum lacinia, a vehicula eros molestie. Aliquam quis sagittis tellus.";
for (var j = 0; j < 2; j++)
{
var row2 = InsertRow(table3);
var cell9 = row2.Cells.AddTableCell();
var cellParagraph9 = cell9.Blocks.AddParagraph();
_ = cellParagraph9.Inlines.AddRun(fakeText);
}
document.Sections.Last().Blocks.Add(table3);
}
FlowExtensibilityManager.NumberingFieldsProvider = new NumberingFieldsProvider();
foreach (var s in document.Sections)
{
s.Footers.Add();
Footer f = s.Footers.Default;
Paragraph paragraph = f.Blocks.AddParagraph();
paragraph.TextAlignment = Alignment.Right;
editor.MoveToParagraphStart(paragraph);
editor.InsertText("Page ");
editor.InsertField("PAGE", string.Empty);
editor.InsertText(" of ");
editor.InsertField("NUMPAGES", string.Empty);
var paragrpah2 = s.Blocks.AddParagraph();
editor.MoveToParagraphStart(paragrpah2);
}
document.UpdateFields();
return document;
}
private static TableRow InsertRow(Table table)
{
TableRow row = new TableRow(table.Document);
table.Rows.Add(row);
return row;
}When exporting a PDF page to an image with the SkiaImageFormatProvider the following error occurs:
System.IndexOutOfRangeException: 'Index was outside the bounds of the array.'