What's the best way to convert a FlowDocument into PDF

11,970

Solution 1

You have two options that I know of.

The first is to use a proprietary library called NiPDF, alternatively you can use Word Interop.

  1. Save the FlowDocument to a DOCX file using Open XML SDK
  2. Use Word Interop to load the saved document from some temporary store
  3. Set the WdSaveFormat to wdFormatPDF
  4. Save the document again (remember to rename the file to PDF)

You can find further info here

Solution 2

Disclaimer: I am writer of XamlToPDF Library, however it is free for any type of use.

http://xamltopdf.codeplex.com/

Its very easy to create PDF, it supports Tables and images as well.

Solution 3

I am assuming you want this to occur programmatically rather than as a manual process.

Method 1: Install a PDF driver such as Amyuni or PrimoPDF. Print your FlowDocument with the desired PrintTicket / page size, to the print driver. The PDF you get from it should be a fairly good conversion. Some of these drivers (such as Amyuni) have SDKs that you can control this process programmatically.

Method 2: Print to XPS programmatically using an XPS driver without a Save As dialog; there's a sample for this in the Windows DDK you can build yourself fairly easily. Then use an XPS to PDF converter such as NiXPS or the Adobe SDK (so expensive I won't post a link) or GhostXPS to convert the XPS directly to PDF.

Method 3: Convert the flow document directly into XPS using methods like This one and then use an XPS to PDF converter such as the ones mentioned above.

Disclaimer: I don't work for any of these companies or their competitors. I've used the Adobe SDK, the Amyuni printer, and various XPS tricks with fairly good success. No method will convert with 100% accuracy.

Solution 4

I managed to get this working with the PDFCreator printer driver. You need to install the driver for this to work, so it may not be an ideal solution for some people. There is a COM interface available. The code more or less looks something like this:

        PDFCreator.clsPDFCreator _PDFCreator;
        PDFCreator.clsPDFCreatorError pErr;


        if (_PDFCreator.cStart(parameters, false))
        {
            _PDFCreator.cClearCache();
            _PDFCreator.set_cOption("UseAutosave", 1);
            _PDFCreator.cPrinterStop = false;
        }

        _PDFCreator.set_cOption("AutosaveFilename", file);
        _PDFCreator.set_cOption("AutosaveDirectory", folder);

    PrintDialog printDialog = new PrintDialog();                          
    printDialog.PrintDocument(((IDocumentPaginatorSource)flowDoc).DocumentPaginator, "Report");
Share:
11,970
Joe
Author by

Joe

Owner and Software Developer at Infocraft@iddJoe

Updated on July 19, 2022

Comments

  • Joe
    Joe almost 2 years

    How would ya'll recommend that I convert a FlowDocument to PDF to be attached to an EMail?

    The FlowDocument is dynamic, not static.

    I would prefer to be able to store the PDF in memory as a byte[], rather than on disk, but that is negotiable.

    Thanks for your help!

  • Joe
    Joe over 12 years
    NiPdf only works on FixedDocuments. I need a solution that takes in a FlowDocument.
  • Stefan Z Camilleri
    Stefan Z Camilleri over 12 years
    The site is misleading, NiPDF allows you to convert a visual to PDF... there's nothing stopping you from grabbing the FlowDocument visual
  • yms
    yms over 12 years
    Amyuni PDF Creator .Net can also convert from XPS to PDF, as a plus, it does not need a virtual printer to be installed. Disclaimer: I do work for Amyuni Technologies
  • user1055201
    user1055201 over 12 years
    Watch out for step 1, it's a doosy!
  • user1055201
    user1055201 over 12 years
    I recommend Method 3. FlowDocument to XPS can be done with little loss of formatting. From XPS to PDF quality will likely vary based on tool used.
  • Joe
    Joe over 12 years
    I ended up using NiPDF. Worked like a champ.
  • user1055201
    user1055201 about 12 years
    actually it is done by writing your own FlowDoc to OpenXML parser/converter. :-)
  • Akash Kava
    Akash Kava over 5 years
    @PeterTaylor no, it does not !!
  • Peter Taylor
    Peter Taylor over 5 years
    My bad: it's only the test project which has a dependency on AxAcroPDFLib.
  • Scott
    Scott about 5 years
    This solution does not seem to support Image objects, but otherwise worked well for me.
  • Louis Somers
    Louis Somers almost 5 years
    It first writers an XPS file to the temp folder and then uses the free community version of Spire.PDF to convert the XPS file to PDF. The community version is limited to 10 pages.
  • Louis Somers
    Louis Somers almost 5 years
    The new version is quite different, I made a wrapper with witch you can do this new PdfCreatorComWrapper().CreatePdf(DocumentPaginator, filename); The wrapper source is available on GitHub.