Adding the contents of a RadDocument to a table cell when exporting

8 posts, 0 answers
  1. Martin
    Martin avatar
    17 posts
    Member since:
    May 2014

    Posted 03 Jun 2014 Link to this post

    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);
                    }
                }
            }
  2. Petya
    Admin
    Petya avatar
    975 posts

    Posted 05 Jun 2014 Link to this post

    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.
    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.
     
  3. UI for WPF is Visual Studio 2017 Ready
  4. Martin
    Martin avatar
    17 posts
    Member since:
    May 2014

    Posted 10 Jun 2014 in reply to Petya Link to this post

    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?
  5. Petya
    Admin
    Petya avatar
    975 posts

    Posted 13 Jun 2014 Link to this post

    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.
    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.
     
  6. Martin
    Martin avatar
    17 posts
    Member since:
    May 2014

    Posted 15 Jun 2014 in reply to Petya Link to this post

    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: 





  7. Petya
    Admin
    Petya avatar
    975 posts

    Posted 17 Jun 2014 Link to this post

    Hello Martin,

    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.
     
  8. Martin
    Martin avatar
    17 posts
    Member since:
    May 2014

    Posted 18 Jun 2014 in reply to Petya Link to this post

    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:


  9. Petya
    Admin
    Petya avatar
    975 posts

    Posted 23 Jun 2014 Link to this post

    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
     
    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.
     
Back to Top
UI for WPF is Visual Studio 2017 Ready