什么';这是将FlowDocument转换为PDF的最佳方式

本文关键字:转换 PDF 方式 最佳 FlowDocument 什么 | 更新日期: 2023-09-27 18:23:53

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

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

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

谢谢你的帮助!

什么';这是将FlowDocument转换为PDF的最佳方式

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

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

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

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

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

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

http://xamltopdf.codeplex.com/

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

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

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

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

您可以在这里找到更多信息

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

当我需要这样做时,我将FlowDocument保存为XPS文件,最后用PDFSharp转换为PDF,并删除了XPS文件

var test = (IDocumentPaginatorSource)flowDoc;
XpsDocument xpsDocument = new XpsDocument(xpsFileLocation, FileAccess.ReadWrite);
XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(xpsDocument);
writer.Write(test.DocumentPaginator);
xpsDocument.Close();            
PdfSharp.Xps.XpsConverter.Convert(xpsFileLocation, pdfFileLocation, 0);
File.Delete(xpsFileLocation);

希望这能帮助

您可能需要考虑Seberix开发的名为"Report Writer for.NET"的产品(http://www.siberix.com/)。它的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();

现在,字节可以保存到数据库表或其他什么表中。

另一个选项是FlowDocumentConverter。这在NuGet包中提供,但每个文档都有10页的限制。