如何使用C#渲染pdf

时间:2009-02-06 02:24:03

标签: c# pdf drawing rendering

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

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

感谢。

13 个答案:

答案 0 :(得分:50)

谷歌开源其优秀的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 控件:将PdfiumViewer NuGet包添加到项目中;在Windows资源管理器中打开项目包文件夹,然后将PdfiumViewer.dll文件拖到Toolbox窗口;名为PdfRenderer的控件可用于添加:

Adding PdfRenderer control to WinForms

答案 1 :(得分:43)

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

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

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

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

  • 除了Omar Shahine的代码片段外,还有一个CodeProject article显示了如何使用Adobe ActiveX,但它可能已过时,很容易被新版本破坏,其合法性也很模糊(基本上它可以内部使用,但你不能发货,你不能在服务器上使用它来生成PDF的图像。

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

  • 还有Poppler,一个使用Xpdf作为渲染引擎的渲染引擎。 所有这些都是伟大的,但他们需要相当多的承诺,使他们工作和与.Net接口,他们往往是在GPL下分发。

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

答案 2 :(得分:12)

以下是我在另一个问题上的答案。

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

Adob​​e 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;
    }
}

确保表单关闭后您处置ActiveX控件

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

否则Acrobat可能会被遗弃。

答案 3 :(得分:3)

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问题。如果你想沿着这条路走下去,请先仔细检查合法性。

答案 4 :(得分:3)

PdfiumViewer很棒,但与System.Drawing和WinForms相对紧密耦合。出于这个原因,我在PDFium:PDFiumSharp

周围创建了自己的包装器

页面可以呈现为PDFiumBitmap,而as a stream又可以保存到磁盘或公开http://www.pjsip.org/pjsip/docs/html/group__PJSUA__LIB__TRANSPORT.htm#gac07273ce5b82c2ddf8e15872068304d3。这样,任何能够从流中加载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();
            }
        }
    }
}

答案 5 :(得分:0)

来自ceTe软件的动态PDF查看器可能会满足您的需求。我已经使用了他们的发生器软件并对它非常满意。

http://www.dynamicpdf.com/

答案 6 :(得分:0)

使用网络浏览器控件。这需要安装Adobe阅读器,但无论如何你很可能已经安装了它。将控件的UrL设置为文件位置。

答案 7 :(得分:0)

我使用的最简单的lib是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是一个很棒的教程,可以帮助您入门。

答案 8 :(得分:0)

免责声明:我在Atalasoft工作

我们有一个PDF Rasterizer可以为.NET执行此操作

http://www.atalasoft.com/products/dotimage/pdfrasterizer/

答案 9 :(得分:0)

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

答案 10 :(得分:0)

您可以将NuGet包CefSharp.WinForms添加到您的应用程序,然后将ChromiumWebBroweser控件添加到您的窗体。 在代码中,您可以编写:

 Future<List<LegTile>> getLegislatures(List<Electorate> elecs) async {
        List<LegTile> legs = [];
        for (var elec in elecs) {
          final snap1 = await elec.c1District.get();
          print(snap1.data);
          final snap2 = await elec.c2District.get();
          print(snap2.data);
          final snap3 = await elec.legislature.get();
          print(snap3.data);
          final district1 = District.fromJson(snap1.data);
          final district2 = District.fromJson(snap2.data);
          final legislature = Legislature.fromJson(snap3.data);
          final LegTile legTile = LegTile(
              district1: district1, district2: district2, legislature: legislature);

          legs.add(legTile);
        }
        return legs;
      }

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

答案 11 :(得分:0)

我想在这里提一下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 的开发人员之一,所以我真的很喜欢它。请尝试一下,你可能也会喜欢它。

答案 12 :(得分:-1)

你可以google PDF viewer component,然后点击几下。

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