如何使用 C# 渲染 PDF

Posted

技术标签:

【中文标题】如何使用 C# 渲染 PDF【英文标题】:How to render pdfs using C# 【发布时间】:2010-10-05 20:31:26 【问题描述】:

我想使用 C# 以图形方式加载和绘制 pdf 文件。我不需要编辑它们或任何东西,只需以给定的缩放级别渲染它们。

我发现的 pdf 库似乎专注于生成。我该怎么做?

谢谢。

【问题讨论】:

【参考方案1】:

我想在这里提到 Docotic.Pdf 库。可以convert PDF to image in C# and VB.NET。也可以render and print PDF documents.

库是 100% 管理的,没有外部依赖。它不依赖于 System.Drawing.dll 或 GDI+。您将在 Windows、Linux、macOS、iosandroid 上获得一致的输出。

我是 Docotic.Pdf 开发人员之一,所以我非常喜欢它。请尝试一下,您可能也会喜欢它。

【讨论】:

【参考方案2】:

您可以将 NuGet 包 CefSharp.WinForms 添加到您的应用程序,然后将 ChromiumWebBrowser 控件添加到您的表单。 在代码中你可以写:

chromiumWebBrowser1.Load(filePath);

这是我找到的最简单的解决方案,它完全免费并且独立于用户的计算机设置,就像使用默认 WebBrowser 控件时一样。

【讨论】:

【参考方案3】:

Google 已经开源了其使用 Foxit Software 编写的优秀 PDF 渲染引擎 PDFium。

有一个名为 PdfiumViewer 的 C# nuget 包,它提供了一个围绕 PDFium 的 C# 包装器,并允许显示和打印 PDF。

我已经使用过它,并且对渲染质量印象深刻。


PDFium 直接处理流,因此不需要将任何数据写入磁盘。

这是我在 WinForms 应用中的示例

    public void LoadPdf(byte[] pdfBytes)
    
        var stream = new MemoryStream(pdfBytes);
        LoadPdf(stream)
    

    public void LoadPdf(Stream stream)
    
        // Create PDF Document
        var pdfDocument = PdfDocument.Load(stream);

        // Load PDF Document into WinForms Control
        pdfRenderer.Load(pdfDocument);
    

编辑:在WinForm中获取pdfRenderer控件:将PdfiumViewerNuGet包添加到项目中;在 Windows 资源管理器中打开项目包文件夹并将PdfiumViewer.dll 文件拖到Toolbox 窗口中;可以添加一个名为 PdfRenderer 的控件:

【讨论】:

我知道这是一个旧线程,但值得评论。如果您正在处理一个封闭源项目并且需要处理 pdf,那么这就是您想要的库。其他一切都需要付费许可才能使用。 到目前为止,这是有关 winforms 应用程序中 pdf 查看器问题的最佳答案。我想知道为什么它没有被标记为这篇文章的答案!谢谢@Paddy,这是一个很大的帮助! 注意:当前的pdfium.dll不能加载到.NET 4.0项目中 确认即使在存档状态下这仍然有效,我从 NuGet(pdfiumViewer 和 pdfvium 本机)获得的包 - 在 WPF 应用程序中(GitHub 代码中有一个示例,这让我碰到由于 pdfium.dll 导致的运行时异常 - 但本机 NuGet 下载很好地为您打包 - 并且示例中的代码有效) 为了让它在 winforms 上工作,我必须安装包 nuget.org/packages/PdfiumViewer.Native.x86_64.v8-xfa 和 nuget.org/packages/PdfiumViewer.Native.x86.v8-xfa 然后将 /bin/debug/x86 和 /bin/debug/x64 文件夹复制到根文件夹,根据这里的讨论:github.com/pvginkel/PdfiumViewer/issues/83【参考方案4】:

PdfiumViewer 很棒,但与 System.Drawing 和 WinForms 的耦合相对紧密。出于这个原因,我创建了自己的 PDFium 包装器:PDFiumSharp

页面可以渲染到PDFiumBitmap,而PDFiumBitmap又可以保存到磁盘或暴露as a stream。这样,任何能够从流中加载 BMP 格式图像的框架都可以使用该库来显示 pdf 页面。

例如在 WPF 应用程序中,您可以使用以下方法来呈现 pdf 页面:

using System.Linq;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using PDFiumSharp;

static class PdfRenderer

    public static ImageSource RenderPage(string filename, int pageIndex, string password = null, bool withTransparency = true)
    
        using (var doc = new PdfDocument(filename, password))
        
            var page = doc.Pages[pageIndex];
            using (var bitmap = new PDFiumBitmap((int)page.Width, (int)page.Height, withTransparency))
            
                page.Render(bitmap);
                return new BmpBitmapDecoder(bitmap.AsBmpStream(), BitmapCreateOptions.None, BitmapCacheOption.OnLoad).Frames.First();
            
        
    

【讨论】:

您能否举例说明如何创建/使用具有较低颜色深度的 PDFiumBitmap?如果我将withTransparency 设置为 false,当我希望它使用 BGR 和 24 位色深时,它最终会使用 BGRx 和 32 位色深。 实际上,我能够在底层 pdfium 代码中找到文档 cmets 并弄清楚。 var pdfiumBitmap = new PDFiumBitmap((int)scaledWidth, (int)scaledHeight, BitmapFormats.FPDFBitmap_BGR, IntPtr.Zero, 0);cs.chromium.org/chromium/src/third_party/pdfium/public/…【参考方案5】:

这看起来是正确的:http://code.google.com/p/lib-pdf/

【讨论】:

【参考方案6】:

如果 Adob​​e ActiveX 不是您正在寻找的东西,还有其他一些选择(因为 Acrobat 必须存在于用户计算机上并且您不能自己发布)。

要创建 PDF 预览,请先查看 *** 上有关该主题的其他一些讨论:

How can I take preview of documents? Get a preview jpeg of a pdf on windows? .NET open PDF in winform without external dependencies PDF Previewing and viewing

在最后两个中我谈到了一些你可以尝试的事情:

您可以获得商业渲染器(PDFViewForNet、PDFRasterizer.NET、ABCPDF、ActivePDF、XpdfRasterizer 和其他答案中的其他...)。 不过大多数都相当昂贵,特别是如果您只关心制作简单的预览/缩略图。

除了 Omar Shahine 的代码 sn-p 之外,还有一个 CodeProject article 显示如何使用 Adob​​e ActiveX,但它可能已经过时,很容易被新版本破坏,并且其合法性是模糊的(基本上它可以供内部使用,但您不能发布它,也不能在服务器上使用它来生成 PDF 图像)。

您可以查看SumatraPDF 的源代码,这是一个适用于 Windows 的开源 PDF 查看器。

还有Poppler,一个使用Xpdf作为渲染引擎的渲染引擎。 所有这些都很棒,但它们需要相当多的承诺才能使它们工作并与 .Net 交互,并且它们往往是根据 GPL 分发的。

您可能需要考虑使用 GhostScript 作为解释器,因为呈现页面是一个相当简单的过程。 缺点是您需要重新打包它以将其与您的应用一起安装,或者使其成为先决条件(或至少是安装过程的一部分)。 这不是一个很大的挑战,而且肯定比不得不将其他渲染引擎与 .Net 合作更容易。 我做了一个小项目,您可以在 Developer Express forums 上找到它作为附件。 请注意 GhostScript 的许可要求。 如果你不能离开,那么商业软件可能是你唯一的选择。

【讨论】:

Poppler 选项可以很容易地从 .NET 应用程序中使用,当该工具通过 System.Diagnostics.Process 作为命令行实用程序执行时 - 在这种情况下,GPL 许可证不会阻止 poppler 在封闭中使用 -源项目。最近我创建了C# wrapper for poppler,它为 PDF 渲染提供了非常简单的 API。【参考方案7】:

ABCpdf 会为您完成这些以及许多其他事情。

它不仅可以将您的 PDF 呈现为各种格式(例如 JPEG、GIF、PNG、TIFF、JPEG 2000;矢量 EPS、SVG、Flash 和 PostScript),而且还可以在各种颜色空间中呈现(例如灰度、RGB、CMYK)和位深度(例如,每个分量 1、8、16 位)。

这只是它会做的一些事情!

更多详情见:

http://www.websupergoo.com/abcpdf-8.htm

哦,您可以通过免费许可方案获得免费许可。

使用 Acrobat 进行 PDF 呈现存在 EULA 问题。如果你想走这条路,首先要非常仔细地检查合法性。

【讨论】:

【参考方案8】:

这是我对另一个问题的回答。

首先你需要引用 Adob​​e Reader ActiveX 控件

Adobe Acrobat 浏览器控件类型库 1.0

%programfiles&\Common Files\Adobe\Acrobat\ActiveX\AcroPDF.dll

然后你只需将它从工具箱拖到你的 Windows 窗体中。

并使用类似这样的代码来初始化 ActiveX 控件。

private void InitializeAdobe(string filePath)

    try
    
        this.axAcroPDF1.LoadFile(filePath);
        this.axAcroPDF1.src = filePath;
        this.axAcroPDF1.setShowToolbar(false);
        this.axAcroPDF1.setView("FitH");
        this.axAcroPDF1.setLayoutMode("SinglePage");
        this.axAcroPDF1.Show();
    
    catch (Exception ex)
    
        throw;
    

确保在表单关闭时处理 ActiveX 控件

this.axAcroPDF1.Dispose();
this.axAcroPDF1 = null;

否则 Acrobat 可能会被遗弃。

【讨论】:

只是提醒其他遇到此问题的人 - github.com/pvginkel/PdfiumViewer 不再维护。 对于那些使用 WPF 的人 - 不幸的是,虽然有一个关于如何在 WPF 中嵌入 ActiveX 控件的教程,但如果你有一个 64 位应用程序,我无法让它工作,因为 32 位总是会调用控件的版本,导致 System.BadImageFormatException 回复 PdfiumViewer 的维护状态 - 尽管它已存档,但即使使用我正在处理的 .Net Core 3.1 (WPF) 构建它仍然有效。并在另一个答案上重复 cmets - 这是唯一一个使用 Apache 2.0 许可证的开源包,它不像 GPL 等那样具有限制性 - 虽然没有尝试过 PDFiumSharp - 可能值得一试!【参考方案9】:

我用过的最简单的库是Paolo Gios's 库。基本上是

Create GiosPDFDocument object
Create TextArea object
Add text, images, etc to TextArea object
Add TextArea object to PDFDocument object
Write to stream

This 是一个很好的入门教程。

【讨论】:

我认为 Garth 想要的只是渲染 pdf;不是你上面显示的。【参考方案10】:

您可以在 google 上搜索 PDF viewer component,并找到一些点击率。

如果您真的不需要将它们嵌入到您的应用程序中 - 您可以只需要 Acrobat Reader 或 FoxIt(或捆绑它,如果它符合各自的许可条款)和 shell out 即可。它没有那么酷,但它可以免费完成工作。

【讨论】:

【参考方案11】:

使用网络浏览器控件。这需要安装 Adob​​e 阅读器,但很可能您仍然拥有它。将控件的 UrL 设置为文件位置。

【讨论】:

我不明白为什么您需要使用浏览器控件,因为它本身使用可直接访问的 Adob​​e ActiveX 插件。您只是添加了一层复杂性和潜在问题,显然根本没有充分的理由。 另一方面,浏览器控件使用起来非常简单,并且可以随时使用。【参考方案12】:

来自 ceTe 软件的动态 PDF 查看器可能会满足您的需求。我用过他们的生成器软件,非常满意。

http://www.dynamicpdf.com/

【讨论】:

以上是关于如何使用 C# 渲染 PDF的主要内容,如果未能解决你的问题,请参考以下文章

如何从字节数组 c# MVC .NET Core 在 iframe 中显示 pdf

如何在 Android 中渲染 PDF 文件

如何在 grails 中使用渲染插件

如何使用 C# 打印 PDF

如何使用 C# 合并包含所有者密码的 PDF 文档

如何在 C# 上使用预览为 android 创建 PDF 查看器