【问题标题】:What's the best way to convert a FlowDocument into PDF将 FlowDocument 转换为 PDF 的最佳方法是什么
【发布时间】:2012-02-29 05:28:27
【问题描述】:

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

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

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

感谢您的帮助!

【问题讨论】:

  • 哦,在这种情况下我完全可以使用 3rd 方控件。
  • This question 及其答案提供了另一种略显老套的解决方案。

标签: c# .net wpf pdf flowdocument


【解决方案1】:

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

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

方法 2: 使用 XPS 驱动程序以编程方式打印到 XPS,无需另存为对话框;在 Windows DDK 中有一个示例,您可以很容易地自己构建。然后使用 XPS 到 PDF 转换器,例如 NiXPS 或 Adob​​e SDK(太贵了我不会发布链接)或 GhostXPS 将 XPS 直接转换为 PDF。

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

免责声明:我不为任何这些公司或其竞争对手工作。我使用了 Adob​​e SDK、Amyuni 打印机和各种 XPS 技巧,并取得了相当大的成功。没有任何方法能以 100% 的准确率进行转换。

【讨论】:

  • Amyuni PDF Creator .Net 也可以从 XPS 转换为 PDF,另外,它不需要安装虚拟打印机。 免责声明:我确实为 Amyuni Technologies 工作
  • 我推荐方法 3。FlowDocument 到 XPS 可以在几乎不丢失格式的情况下完成。从 XPS 到 PDF 质量可能会因使用的工具而异。
【解决方案2】:

免责声明:我是 XamlToPDF 库的作者,但它对任何类型的使用都是免费的。

http://xamltopdf.codeplex.com/

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

【讨论】:

  • @PeterTaylor 不,它没有!!
  • 我的错:只有测试项目依赖于 AxAcroPDFLib。
  • 这个解决方案似乎不支持 Image 对象,但对我来说效果很好。
【解决方案3】:

据我所知,您有两个选择。

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

  1. 使用Open XML SDK 将 FlowDocument 保存到 DOCX 文件
  2. 使用 Word Interop 从某个临时存储区加载保存的文档
  3. WdSaveFormat 设置为 wdFormatPDF
  4. 再次保存文档(记得将文件重命名为 PDF)

您可以找到更多信息here

【讨论】:

  • NiPdf 仅适用于 FixedDocuments。我需要一个包含 FlowDocument 的解决方案。
  • 该网站具有误导性,NiPDF 允许您将视觉对象转换为 PDF...没有什么能阻止您获取 FlowDocument 视觉对象
  • 注意第 1 步,这很麻烦!
  • 我最终使用了 NiPDF。像冠军一样工作。
  • 实际上是通过将您自己的 FlowDoc 写入 OpenXML 解析器/转换器来完成的。 :-)
【解决方案4】:

我设法使用 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");

【讨论】:

  • 新版本完全不同,我用witch做了一个包装器,你可以这样做new PdfCreatorComWrapper().CreatePdf(DocumentPaginator, filename);包装器源可用on GitHub
【解决方案5】:

您可能需要考虑 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();

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

【讨论】:

    【解决方案6】:

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

    【讨论】:

    • 它首先将 XPS 文件写入 temp 文件夹,然后使用免费社区版 Spire.PDF 将 XPS 文件转换为 PDF。社区版限制为 10 页。
    猜你喜欢
    • 2017-08-22
    • 1970-01-01
    • 2010-09-21
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多