如何使用C#渲染pdf

Gar*_*rth 48 c# pdf drawing rendering

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

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

谢谢.

Pad*_*ddy 54

谷歌开源了它与福昕软件合作的优秀PDF渲染引擎--PDF.

有一个名为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);
    }
Run Code Online (Sandbox Code Playgroud)

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

将PdfRenderer控件添加到WinForms

  • 我知道这是一个老线程,但值得评论.如果您正在处理一个密切的源项目并且需要处理pdf,那么这就是您想要的库.其他一切都需要付费许可才能使用. (9认同)
  • **到目前为止,这是关于winforms应用程序中pdf查看器问​​题的最佳答案**.我想知道为什么它没有被标记为这篇文章的答案!谢谢@Paddy,这是一个很好的帮助! (5认同)
  • 为了让它在 winforms 上工作,我必须安装软件包 https://www.nuget.org/packages/PdfiumViewer.Native.x86_64.v8-xfa/ 和 https://www.nuget.org/packages /PdfiumViewer.Native.x86.v8-xfa/ ,然后将 /bin/debug/x86 和 /bin/debug/x64 文件夹复制到根文件夹,按照此处的讨论:https://github.com/pvginkel/ PdfiumViewer/问题/83 (4认同)

Ren*_*uis 43

如果Adobe ActiveX不是您正在寻找的内容,还有其他一些选择(因为Acrobat必须存在于用户计算机上而您自己无法发送).

要创建PDF预览,首先要看一下StackOverflow上有关该主题的其他讨论:

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

  • 您可以在其他答案中获得商业渲染器(PDFViewForNet,PDFRasterizer.NET,ABCPDF,ActivePDF,XpdfRasterizer等).
    大多数都相当昂贵,特别是如果你关心的只是做一个简单的预览/缩略图.

  • 除了Omar Shahine的代码片段之外,还有一篇CodeProject文章展示了如何使用Adobe ActiveX,但它可能已经过时,很容易被新版本破坏,而且它的合法性也很模糊(基本上它可以在内部使用,但你可以运送它,你不能在服务器上使用它来生成PDF的图像.

  • 您可以查看SumatraPDF的源代码,是一个用于Windows的OpenSource PDF查看器.

  • 还有Poppler,一个使用Xpdf作为渲染引擎的渲染引擎.所有这些都很棒,但它们需要相当多的承诺才能使它们与.Net一起工作和接口,并且它们往往是在GPL下分发的.

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

  • 当该工具作为命令行实用程序与 System.Diagnostics.Process 一起执行时,可以从 .NET 应用程序轻松使用 Poppler 选项 - 在这种情况下,GPL 许可证不是在封闭源项目中使用 poppler 的障碍。最近我创建了 [C# wrapper for poppler](https://www.nuget.org/packages/NReco.PdfRenderer/),它为 PDF 渲染提供了非常简单的 API。 (3认同)

Oma*_*ine 12

以下是我对另一个问题的回答.

首先,您需要参考Adobe Reader ActiveX控件

Adobe Acrobat浏览器控件类型库1.0

%programfiles&\ Common Files\Adob​​e\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;
    }
}
Run Code Online (Sandbox Code Playgroud)

确保在表单关闭时释放ActiveX控件

this.axAcroPDF1.Dispose();
this.axAcroPDF1 = null;
Run Code Online (Sandbox Code Playgroud)

否则Acrobat可能会被遗弃.


小智 6

PdfiumViewer很棒,但是System.Drawing与WinForms 紧密耦合。因此,我围绕PDFium创建了自己的包装器:PDFiumSharp

页面可以呈现为PDFiumBitmap,然后可以将其保存到磁盘或作为流公开。这样,任何能够从流中加载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();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)