将FlowDocument转换为PDF的最佳方法是什么?

时间:2012-02-07 18:57:25

标签: c# .net wpf pdf flowdocument

您如何建议我将FlowDocument转换为PDF以附加到电子邮件?

FlowDocument是动态的,而不是静态的。

我希望能够将PDF作为byte []存储在内存中,而不是存储在磁盘上,但这是可以协商的。

感谢您的帮助!

6 个答案:

答案 0 :(得分:4)

我假设您希望以编程方式而不是手动过程进行此操作。

方法1:安装AmyuniPrimoPDF等PDF驱动程序。将具有所需PrintTicket /页面大小的FlowDocument打印到打印驱动程序。您从中获得的PDF应该是一个相当不错的转换。其中一些驱动程序(如Amyuni)具有SDK,您可以通过编程方式控制此过程。

方法2:使用不带“另存为”对话框的XPS驱动程序以编程方式打印到XPS;在Windows DDK中有一个示例,您可以相当容易地构建自己。然后使用XPS到PDF转换器,例如NiXPS或Adobe SDK(这么贵,我不会发布链接)或GhostXPS将XPS直接转换为PDF。

方法3:使用This one之类的方法将流文档直接转换为XPS,然后使用XPS到PDF转换器,例如上面提到的那些。

免责声明:我不为这些公司或其竞争对手工作。我已经使用了Adobe SDK,Amyuni打印机和各种XPS技巧并取得了相当不错的成功。没有方法可以100%准确转换。

答案 1 :(得分:3)

我知道有两种选择。

第一种是使用名为NiPDF的专有库,或者您也可以使用Word Interop。

  1. 使用Open XML SDK
  2. 将FlowDocument保存到DOCX文件
  3. 使用Word Interop从某个临时商店
  4. 加载已保存的文档
  5. WdSaveFormat设置为wdFormatPDF
  6. 再次保存文档(请记住将文件重命名为PDF)
  7. 您可以找到更多信息here

答案 2 :(得分:2)

免责声明:我是XamlToPDF图书馆的作者,但它可以免费用于任何类型。

http://xamltopdf.codeplex.com/

它非常容易创建PDF,它也支持表格和图像。

答案 3 :(得分:0)

您可能需要考虑Seberix(http://www.siberix.com/)上名为“Report Writer for .NET”的产品。它的API类似于FlowDocument中的代码,我认为当你说“动态而不是静态”时你想要它。 (但我确信也存在差异。魔鬼在细节中。)

创建了Siberix.Report.Report对象后,

Siberix.Report.Report report = CreateMyPdfReport();  //You write this
Stream stream = new MemoryStream();
report.Publish(stream, Siberix.Report.FileFormat.PDF);
byte[] bytes = stream.ToArray();

现在可以将字节保存到数据库表或其他任何内容。

答案 4 :(得分:0)

我设法使用PDFCreator打印机驱动程序。您需要安装驱动程序才能工作,因此对某些人来说可能不是理想的解决方案。有一个COM接口可用。代码或多或少看起来像这样:

        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");

答案 5 :(得分:0)

要查看的另一个选项是FlowDocumentConverter。这在NuGet package中可用,但每个documentation的页面限制为10。