您如何建议我将FlowDocument转换为PDF以附加到电子邮件?
FlowDocument是动态的,而不是静态的。
我希望能够将PDF作为byte []存储在内存中,而不是存储在磁盘上,但这是可以协商的。
感谢您的帮助!
答案 0 :(得分:4)
我假设您希望以编程方式而不是手动过程进行此操作。
方法1:安装Amyuni或PrimoPDF等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。
您可以找到更多信息here
答案 2 :(得分:2)
答案 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。