我正在开发构建 FlowDocuments 并将其导出为各种格式的应用程序。我们可以轻松导出到 XPS,并且可以使用 Microsoft Print to PDF 驱动程序导出 PDF,但后者存在局限性,导致用户体验较差。也就是说,它提供自己的“另存为”对话框,并且在打印大型文档时不会在完成时提供任何通知。因此,我正在寻找将 FlowDocuments 或 XPS 文档转换为 PDF 的替代方案。
大多数来源(下面链接的选择)建议使用
PDFSharp
库,使用 PdfSharp.Xps.XpsConverter.Convert
方法将 XPS 转换为 PDF,代码示例类似于以下内容:
public void SaveAsPdf(FlowDocument flowDoc, string path)
{
using var stream = new MemoryStream();
using var package = Package.Open(stream, FileMode.Create);
using var xpsDoc = new XpsDocument(package);
var xpsDocWriter = XpsDocument.CreateXpsDocumentWriter(xpsDoc);
xpsDocWriter.Write(((IDocumentPaginatorSource)flowDoc).DocumentPaginator);
using var pdfXpsDoc = PdfSharp.Xps.XpsModel.XpsDocument.Open(stream);
PdfSharp.Xps.XpsConverter.Convert(pdfXpsDoc, path, 0);
}
但是,无论我尝试安装什么 NuGet 包,我都无法解析
PdfSharp.Xps
命名空间。我尝试在 Github 上的各种代码存储库中搜索 XpsConverter
类,但我似乎找不到任何代码。据我所知,XPS 功能是 PDF Sharp 1.31 版本中的测试版,但已包含在 1.32 版本中,但现在还没有包含在内。如果可以避免的话,我宁愿不在我们的解决方案中使用测试版代码。其中许多文章已经有 10 年历史了,我怀疑这些信息可能已经过时了。
因此,我想知道,从 2023 年开始,如何将 FlowDocument 或 XPS 文档转换为 PDF,而不受上述 Microsoft Print to PDF 驱动程序的可用性限制。可接受的答案包括使用第三方库,但理想情况下它们是开源的、稳定的并且可以通过 NuGet 轻松访问。示例代码也将受到欢迎。
来源
我想我已经明白了。有几件事让我困惑:
我发现以下 NuGet 包提供了
XpsConverter
类:XpsToPdf。上面的任何来源都没有提到这个包,可能是因为这个包是在 2020 年首次发布的。我很感激它现在存在。
问题中我的示例代码也有错误。我从
System.IO.FileFormatException: 'Archive file cannot be size 0.'
中得到了 PdfSharp.Xps.XpsModel.XpsDocument.Open
异常。结果我需要在数据写入流之前关闭 Package
和 XpsDocument
对象。因此正确的代码示例是:
public void SaveAsPdf(FlowDocument flowDoc, string path)
{
using var stream = new MemoryStream();
using (var package = Package.Open(stream, FileMode.Create))
using (var xpsDoc = new XpsDocument(package))
{
var xpsDocWriter = XpsDocument.CreateXpsDocumentWriter(xpsDoc);
xpsDocWriter.Write(((IDocumentPaginatorSource)flowDoc).DocumentPaginator);
}
using var pdfXpsDoc = PdfSharp.Xps.XpsModel.XpsDocument.Open(stream);
PdfSharp.Xps.XpsConverter.Convert(pdfXpsDoc, path, 0);
}
总而言之,回答原来的问题: