I can't figure out how to add the contents of a RadDocument (with styling) to a table cell when exporting to PDF. Any advice on how I should go about solving this?
private void RadButton_Click(object sender, RoutedEventArgs e)
{
var span = new Span();
span.Text = "Span1";
var paragraph = new Paragraph();
paragraph.Inlines.Add(span);
var tableCell1 = new TableCell();
tableCell1.Blocks.Add(paragraph);
var tableCell2 = new TableCell();
tableCell2.Blocks.Add(Editor.Document); // THIS WON'T COMPILE, BUT HOW TO FIX?
var tableRow = new TableRow();
tableRow.Cells.Add(tableCell1);
tableRow.Cells.Add(tableCell2);
var table = new Table();
table.AddRow(tableRow);
var section = new Section();
section.Blocks.Add(table);
var document = new RadDocument();
document.Sections.Add(section);
var saveFileDialog = new SaveFileDialog();
saveFileDialog.DefaultExt = ".pdf";
saveFileDialog.Filter = "Portable Document Format (*.pdf) | *.pdf";
var result = saveFileDialog.ShowDialog();
if (result == true)
{
using (var saveFileStream = saveFileDialog.OpenFile())
{
var provider = new PdfFormatProvider();
provider.Export(document, saveFileStream);
}
}
}
private void RadButton_Click(object sender, RoutedEventArgs e)
{
var span = new Span();
span.Text = "Span1";
var paragraph = new Paragraph();
paragraph.Inlines.Add(span);
var tableCell1 = new TableCell();
tableCell1.Blocks.Add(paragraph);
var tableCell2 = new TableCell();
tableCell2.Blocks.Add(Editor.Document); // THIS WON'T COMPILE, BUT HOW TO FIX?
var tableRow = new TableRow();
tableRow.Cells.Add(tableCell1);
tableRow.Cells.Add(tableCell2);
var table = new Table();
table.AddRow(tableRow);
var section = new Section();
section.Blocks.Add(table);
var document = new RadDocument();
document.Sections.Add(section);
var saveFileDialog = new SaveFileDialog();
saveFileDialog.DefaultExt = ".pdf";
saveFileDialog.Filter = "Portable Document Format (*.pdf) | *.pdf";
var result = saveFileDialog.ShowDialog();
if (result == true)
{
using (var saveFileStream = saveFileDialog.OpenFile())
{
var provider = new PdfFormatProvider();
provider.Export(document, saveFileStream);
}
}
}
7 Answers, 1 is accepted
0
Hello Martin,
You can create a DocumentFragment from the document and insert it in the specific cell. For this purpose you can take advantage of the RadDocumentEditor class. Please check the snippet below.
I hope this helps.
Regards,
Petya
Telerik
You can create a DocumentFragment from the document and insert it in the specific cell. For this purpose you can take advantage of the RadDocumentEditor class. Please check the snippet below.
var span =
new
Span();
span.Text =
"Span1"
;
var paragraph =
new
Paragraph();
paragraph.Inlines.Add(span);
var tableCell1 =
new
TableCell();
tableCell1.Blocks.Add(paragraph);
var tableCell2 =
new
TableCell();
var tableRow =
new
TableRow();
tableRow.Cells.Add(tableCell1);
tableRow.Cells.Add(tableCell2);
var table =
new
Table();
table.AddRow(tableRow);
var section =
new
Section();
section.Blocks.Add(table);
var document =
new
RadDocument();
document.Sections.Add(section);
document.MeasureAndArrangeInDefaultSize();
document.CaretPosition.MoveToStartOfDocumentElement(tableCell2);
RadDocumentEditor editor =
new
RadDocumentEditor(document);
editor.Document.CaretPosition.MoveToStartOfDocumentElement(tableCell2);
editor.InsertFragment(
new
DocumentFragment(Editor.Document));
this
.radRichTextBox.Document = editor.Document;
var saveFileDialog =
new
Microsoft.Win32.SaveFileDialog();
saveFileDialog.DefaultExt =
".pdf"
;
saveFileDialog.Filter =
"Portable Document Format (*.pdf) | *.pdf"
;
var result = saveFileDialog.ShowDialog();
if
(result ==
true
)
{
using
(var saveFileStream = saveFileDialog.OpenFile())
{
var provider =
new
PdfFormatProvider();
provider.Export(editor.Document, saveFileStream);
}
}
I hope this helps.
Regards,
Petya
Telerik
Check out Telerik Analytics, the service which allows developers to discover app usage patterns, analyze user data, log exceptions, solve problems and profile application performance at run time. Watch the videos and start improving your app based on facts, not hunches.
0
Martin
Top achievements
Rank 1
answered on 10 Jun 2014, 08:19 PM
I appreciate your answer, but is it possible without updating the editor before exporting?
I'd like for it to work without the following line, but removing it results in tableCell2 being empty.
this.radRichTextBox.Document = editor.Document; // IS IT POSSIBLE WITHOUT THIS LINE?
I'd like for it to work without the following line, but removing it results in tableCell2 being empty.
this.radRichTextBox.Document = editor.Document; // IS IT POSSIBLE WITHOUT THIS LINE?
0
Hello Martin,
Thanks for the follow-up.
You can specify the layout mode of the document you created and everything should work without the mentioned line.
Regards,
Petya
Telerik
Thanks for the follow-up.
You can specify the layout mode of the document you created and everything should work without the mentioned line.
var document =
new
RadDocument();
document.Sections.Add(section);
document.LayoutMode = DocumentLayoutMode.Paged;
document.MeasureAndArrangeInDefaultSize();
document.CaretPosition.MoveToStartOfDocumentElement(tableCell2);
Regards,
Petya
Telerik
Check out Telerik Analytics, the service which allows developers to discover app usage patterns, analyze user data, log exceptions, solve problems and profile application performance at run time. Watch the videos and start improving your app based on facts, not hunches.
0
Martin
Top achievements
Rank 1
answered on 15 Jun 2014, 10:19 PM
Thanks for the answer, but I've now run into another problem. I'm using the code in a web service that returns the generated PDF and I'm now getting the following error: The calling thread must be STA, because many UI components require this. Please tell me that this is solvable too? :-)
Stack trace:
System.InvalidOperationException was unhandled by user code
HResult=-2146233079
Message=The calling thread must be STA, because many UI components require this.
Source=PresentationCore
StackTrace:
at System.Windows.Input.InputManager..ctor()
at System.Windows.Input.InputManager.GetCurrentInputManagerImpl()
at System.Windows.Input.KeyboardNavigation..ctor()
at System.Windows.FrameworkElement.FrameworkServices..ctor()
at System.Windows.FrameworkElement.EnsureFrameworkServices()
at System.Windows.FrameworkElement..ctor()
at System.Windows.Shapes.Line..ctor()
at Telerik.Windows.Documents.UI.TextDecorations.DecorationProviders.LineDecoration.CreateDecorationUI(RectangleF currentRectangle, Color color)
at Telerik.Windows.Documents.FormatProviders.Pdf.PdfUnderlineDecorator.FlushSpans(PdfContentsWriter writer)
at Telerik.Windows.Documents.FormatProviders.Pdf.PdfUnderlineDecorator.AddSpanBox(PdfContentsWriter writer, SpanLayoutBox span)
at Telerik.Windows.Documents.FormatProviders.Pdf.PdfDocumentExporter.ExportSectionLayoutBox(SectionLayoutBox sectionBox, PdfContentsWriter writer)
at Telerik.Windows.Documents.FormatProviders.Pdf.PdfDocumentExporter.ExportPage(SectionLayoutBox sectionBox, PdfContentsWriter writer)
at Telerik.Windows.Documents.FormatProviders.Pdf.PdfDocumentExporter.<>c__DisplayClass1.<Export>b__0(PdfContentsWriter contentsWriter)
at Telerik.Windows.Documents.FormatProviders.Pdf.RadPdf.PdfContents.WriteContents(PdfWriter writer)
at Telerik.Windows.Documents.FormatProviders.Pdf.RadPdf.PdfStream.WriteToCore(PdfWriter writer)
at Telerik.Windows.Documents.FormatProviders.Pdf.RadPdf.PdfObject.WriteTo(PdfWriter writer)
at Telerik.Windows.Documents.FormatProviders.Pdf.RadPdf.PdfWriter.WritePdfObject(PdfObject obj)
at Telerik.Windows.Documents.FormatProviders.Pdf.PdfDocumentExporter.Export()
at Telerik.Windows.Documents.FormatProviders.Pdf.PdfFormatProvider.Export(RadDocument document, Stream output)
<removed this line for privacy concerns>
at System.Web.Http.Tracing.Tracers.BufferedMediaTypeFormatterTracer.<>c__DisplayClass7.<WriteToStream>b__6()
at System.Web.Http.Tracing.ITraceWriterExtensions.TraceBeginEnd(ITraceWriter traceWriter, HttpRequestMessage request, String category, TraceLevel level, String operatorName, String operationName, Action`1 beginTrace, Action execute, Action`1 endTrace, Action`1 errorTrace)
InnerException:
Stack trace:
System.InvalidOperationException was unhandled by user code
HResult=-2146233079
Message=The calling thread must be STA, because many UI components require this.
Source=PresentationCore
StackTrace:
at System.Windows.Input.InputManager..ctor()
at System.Windows.Input.InputManager.GetCurrentInputManagerImpl()
at System.Windows.Input.KeyboardNavigation..ctor()
at System.Windows.FrameworkElement.FrameworkServices..ctor()
at System.Windows.FrameworkElement.EnsureFrameworkServices()
at System.Windows.FrameworkElement..ctor()
at System.Windows.Shapes.Line..ctor()
at Telerik.Windows.Documents.UI.TextDecorations.DecorationProviders.LineDecoration.CreateDecorationUI(RectangleF currentRectangle, Color color)
at Telerik.Windows.Documents.FormatProviders.Pdf.PdfUnderlineDecorator.FlushSpans(PdfContentsWriter writer)
at Telerik.Windows.Documents.FormatProviders.Pdf.PdfUnderlineDecorator.AddSpanBox(PdfContentsWriter writer, SpanLayoutBox span)
at Telerik.Windows.Documents.FormatProviders.Pdf.PdfDocumentExporter.ExportSectionLayoutBox(SectionLayoutBox sectionBox, PdfContentsWriter writer)
at Telerik.Windows.Documents.FormatProviders.Pdf.PdfDocumentExporter.ExportPage(SectionLayoutBox sectionBox, PdfContentsWriter writer)
at Telerik.Windows.Documents.FormatProviders.Pdf.PdfDocumentExporter.<>c__DisplayClass1.<Export>b__0(PdfContentsWriter contentsWriter)
at Telerik.Windows.Documents.FormatProviders.Pdf.RadPdf.PdfContents.WriteContents(PdfWriter writer)
at Telerik.Windows.Documents.FormatProviders.Pdf.RadPdf.PdfStream.WriteToCore(PdfWriter writer)
at Telerik.Windows.Documents.FormatProviders.Pdf.RadPdf.PdfObject.WriteTo(PdfWriter writer)
at Telerik.Windows.Documents.FormatProviders.Pdf.RadPdf.PdfWriter.WritePdfObject(PdfObject obj)
at Telerik.Windows.Documents.FormatProviders.Pdf.PdfDocumentExporter.Export()
at Telerik.Windows.Documents.FormatProviders.Pdf.PdfFormatProvider.Export(RadDocument document, Stream output)
<removed this line for privacy concerns>
at System.Web.Http.Tracing.Tracers.BufferedMediaTypeFormatterTracer.<>c__DisplayClass7.<WriteToStream>b__6()
at System.Web.Http.Tracing.ITraceWriterExtensions.TraceBeginEnd(ITraceWriter traceWriter, HttpRequestMessage request, String category, TraceLevel level, String operatorName, String operationName, Action`1 beginTrace, Action execute, Action`1 endTrace, Action`1 errorTrace)
InnerException:
0
Hello Martin,
If you specify the apartment state of the thread to be STA you should no longer observe this exception.
Please note that in this case if the Editor RadRichTextBox from the content of which you are creating a fragment contains images, they will not be visible in the generated PDF output. In order to ensure images are visible you need to freeze their image sources prior the export (on the UI thread).
I hope this is helpful.
Regards,
Petya
Telerik
If you specify the apartment state of the thread to be STA you should no longer observe this exception.
var thread =
new
Thread(() =>
{
var span =
new
Span();
span.Text =
"Span1"
;
//...
using
(var saveFileStream = saveFileDialog.OpenFile())
{
var provider =
new
PdfFormatProvider();
provider.Export(editor.Document, saveFileStream);
}
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
Please note that in this case if the Editor RadRichTextBox from the content of which you are creating a fragment contains images, they will not be visible in the generated PDF output. In order to ensure images are visible you need to freeze their image sources prior the export (on the UI thread).
foreach
(var image
in
this
.Editor.Document.EnumerateChildrenOfType<ImageInline>())
{
image.ImageSource.Freeze();
}
I hope this is helpful.
Regards,
Petya
Telerik
Check out Telerik Analytics, the service which allows developers to discover app usage patterns, analyze user data, log exceptions, solve problems and profile application performance at run time. Watch the videos and start improving your app based on facts, not hunches.
0
Martin
Top achievements
Rank 1
answered on 18 Jun 2014, 12:02 PM
It works. Brilliant :-)
Almost there now. I also want to support exporting to docx, but changing the provider to DocxFormatProvider result in the following error. How to fix?
System.NotSupportedException was unhandled
HResult=-2146233067
Message=Stream does not support seeking.
Source=mscorlib
StackTrace:
at System.IO.BufferedStream.get_Position()
at Telerik.Windows.Zip.ZipArchiveEntry.WriteLocalFileHeader()
at Telerik.Windows.Zip.ZipArchiveEntry.OpenForWriting()
at Telerik.Windows.Zip.ZipArchiveEntry.Open()
at Telerik.Windows.Zip.ZipPackage.AddStream(Stream stream, String fileNameInZip, ZipCompression method, DateTime dateTime, CompressionType compressionType)
at Telerik.Windows.Zip.ZipPackage.AddStream(Stream stream, String fileNameInZip, ZipCompression method, DateTime dateTime)
at Telerik.Windows.Documents.FormatProviders.OpenXml.Docx.Export.DocxExporter.AddPartToPackage(Stream partStream, String partPath)
at Telerik.Windows.Documents.FormatProviders.OpenXml.Docx.Export.ParagraphExporter.ExportImageFile(IImageDocumentElement imageInline, String imageID)
at Telerik.Windows.Documents.FormatProviders.OpenXml.Docx.Export.ParagraphExporter.ExportImageInline(ImageInline imageInline)
at Telerik.Windows.Documents.FormatProviders.OpenXml.Docx.Export.ParagraphExporter.ExportInline(Paragraph paragraph, Inline inline)
at Telerik.Windows.Documents.FormatProviders.OpenXml.Docx.Export.ParagraphExporter.Export(Paragraph paragraph)
at Telerik.Windows.Documents.FormatProviders.OpenXml.Docx.Export.MainDocumentExporter.ExportParagraph(Paragraph paragraph)
at Telerik.Windows.Documents.FormatProviders.OpenXml.Docx.Export.MainDocumentExporter.ExportBlock(Block block)
at Telerik.Windows.Documents.FormatProviders.OpenXml.Docx.Export.TableExporter.ExportTableCell(Table table, TableCellData cellData, MainDocumentExporter exporter)
at Telerik.Windows.Documents.FormatProviders.OpenXml.Docx.Export.TableExporter.Export(MainDocumentExporter exporter, Table table)
at Telerik.Windows.Documents.FormatProviders.OpenXml.Docx.Export.MainDocumentExporter.ExportTable(Table table)
at Telerik.Windows.Documents.FormatProviders.OpenXml.Docx.Export.MainDocumentExporter.ExportBlock(Block block)
at Telerik.Windows.Documents.FormatProviders.OpenXml.Docx.Export.MainDocumentExporter.Export()
at Telerik.Windows.Documents.FormatProviders.OpenXml.Docx.Export.DocxExporter.AddXmlContentToPackage(DocxPartExporterBase exporter)
at Telerik.Windows.Documents.FormatProviders.OpenXml.Docx.Export.DocxExporter.AddXmlContentWithRelationsToPackage(DocxPartExporterBase exporter)
at Telerik.Windows.Documents.FormatProviders.OpenXml.Docx.Export.DocxExporter.Export()
at Telerik.Windows.Documents.FormatProviders.OpenXml.Docx.DocxFormatProvider.Export(RadDocument document, Stream output)
...
...
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:
Almost there now. I also want to support exporting to docx, but changing the provider to DocxFormatProvider result in the following error. How to fix?
System.NotSupportedException was unhandled
HResult=-2146233067
Message=Stream does not support seeking.
Source=mscorlib
StackTrace:
at System.IO.BufferedStream.get_Position()
at Telerik.Windows.Zip.ZipArchiveEntry.WriteLocalFileHeader()
at Telerik.Windows.Zip.ZipArchiveEntry.OpenForWriting()
at Telerik.Windows.Zip.ZipArchiveEntry.Open()
at Telerik.Windows.Zip.ZipPackage.AddStream(Stream stream, String fileNameInZip, ZipCompression method, DateTime dateTime, CompressionType compressionType)
at Telerik.Windows.Zip.ZipPackage.AddStream(Stream stream, String fileNameInZip, ZipCompression method, DateTime dateTime)
at Telerik.Windows.Documents.FormatProviders.OpenXml.Docx.Export.DocxExporter.AddPartToPackage(Stream partStream, String partPath)
at Telerik.Windows.Documents.FormatProviders.OpenXml.Docx.Export.ParagraphExporter.ExportImageFile(IImageDocumentElement imageInline, String imageID)
at Telerik.Windows.Documents.FormatProviders.OpenXml.Docx.Export.ParagraphExporter.ExportImageInline(ImageInline imageInline)
at Telerik.Windows.Documents.FormatProviders.OpenXml.Docx.Export.ParagraphExporter.ExportInline(Paragraph paragraph, Inline inline)
at Telerik.Windows.Documents.FormatProviders.OpenXml.Docx.Export.ParagraphExporter.Export(Paragraph paragraph)
at Telerik.Windows.Documents.FormatProviders.OpenXml.Docx.Export.MainDocumentExporter.ExportParagraph(Paragraph paragraph)
at Telerik.Windows.Documents.FormatProviders.OpenXml.Docx.Export.MainDocumentExporter.ExportBlock(Block block)
at Telerik.Windows.Documents.FormatProviders.OpenXml.Docx.Export.TableExporter.ExportTableCell(Table table, TableCellData cellData, MainDocumentExporter exporter)
at Telerik.Windows.Documents.FormatProviders.OpenXml.Docx.Export.TableExporter.Export(MainDocumentExporter exporter, Table table)
at Telerik.Windows.Documents.FormatProviders.OpenXml.Docx.Export.MainDocumentExporter.ExportTable(Table table)
at Telerik.Windows.Documents.FormatProviders.OpenXml.Docx.Export.MainDocumentExporter.ExportBlock(Block block)
at Telerik.Windows.Documents.FormatProviders.OpenXml.Docx.Export.MainDocumentExporter.Export()
at Telerik.Windows.Documents.FormatProviders.OpenXml.Docx.Export.DocxExporter.AddXmlContentToPackage(DocxPartExporterBase exporter)
at Telerik.Windows.Documents.FormatProviders.OpenXml.Docx.Export.DocxExporter.AddXmlContentWithRelationsToPackage(DocxPartExporterBase exporter)
at Telerik.Windows.Documents.FormatProviders.OpenXml.Docx.Export.DocxExporter.Export()
at Telerik.Windows.Documents.FormatProviders.OpenXml.Docx.DocxFormatProvider.Export(RadDocument document, Stream output)
...
...
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:
0
Hello Martin,
I'm afraid it is hard to say what might be causing this based only on the stack trace. Would it be possible to open a support ticket and send us a sample project showing the error?
We are looking forward to hearing from you.
Regards,
Petya
Telerik
I'm afraid it is hard to say what might be causing this based only on the stack trace. Would it be possible to open a support ticket and send us a sample project showing the error?
We are looking forward to hearing from you.
Regards,
Petya
Telerik
Check out Telerik Analytics, the service which allows developers to discover app usage patterns, analyze user data, log exceptions, solve problems and profile application performance at run time. Watch the videos and start improving your app based on facts, not hunches.