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

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

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

谢谢。

【问题讨论】:

    标签: c# pdf drawing rendering


    【解决方案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、iOS 和 Android 上获得一致的输出。

    我是 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-xfanuget.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 预览,请先查看 StackOverflow 上有关该主题的其他一些讨论:

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

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

          • 除了 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/

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2019-02-13
                • 2014-03-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多