2023 年如何使用 C# .NET 将 FlowDocument 或 XPS 转换为 PDF

问题描述 投票:0回答:1

我正在开发构建 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 轻松访问。示例代码也将受到欢迎。

来源

c# .net pdf flowdocument xps
1个回答
0
投票

我想我已经明白了。有几件事让我困惑:

  1. 标准 PDFSharp NuGet 包不提供任何 XPS 转换功能。
  2. 我的代码示例中有一个错误。

我发现以下 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);
}

总而言之,回答原来的问题:

  1. 安装 NuGet 包 XpsToPdf,作者:Thomas Hoevel 和 Nathan Jones。
  2. 使用上面的代码示例将 FlowDocument 转换为 XPS,然后转换为 PDF。
© www.soinside.com 2019 - 2024. All rights reserved.