【发布时间】:2010-10-05 20:31:26
【问题描述】:
我想使用 C# 以图形方式加载和绘制 pdf 文件。我不需要编辑它们或任何东西,只需以给定的缩放级别渲染它们。
我发现的 pdf 库似乎专注于生成。我该怎么做?
谢谢。
【问题讨论】:
我想使用 C# 以图形方式加载和绘制 pdf 文件。我不需要编辑它们或任何东西,只需以给定的缩放级别渲染它们。
我发现的 pdf 库似乎专注于生成。我该怎么做?
谢谢。
【问题讨论】:
我想在这里提到 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 开发人员之一,所以我非常喜欢它。请尝试一下,您可能也会喜欢它。
【讨论】:
您可以将 NuGet 包 CefSharp.WinForms 添加到您的应用程序,然后将 ChromiumWebBrowser 控件添加到您的表单。 在代码中你可以写:
chromiumWebBrowser1.Load(filePath);
这是我找到的最简单的解决方案,它完全免费并且独立于用户的计算机设置,就像使用默认 WebBrowser 控件时一样。
【讨论】:
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 的控件:
【讨论】:
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();
}
}
}
}
【讨论】:
withTransparency 设置为 false,当我希望它使用 BGR 和 24 位色深时,它最终会使用 BGRx 和 32 位色深。
var pdfiumBitmap = new PDFiumBitmap((int)scaledWidth, (int)scaledHeight, BitmapFormats.FPDFBitmap_BGR, IntPtr.Zero, 0);cs.chromium.org/chromium/src/third_party/pdfium/public/…
这看起来是正确的:http://code.google.com/p/lib-pdf/
【讨论】:
如果 Adobe ActiveX 不是您正在寻找的东西,还有其他一些选择(因为 Acrobat 必须存在于用户计算机上并且您不能自己发布)。
要创建 PDF 预览,请先查看 StackOverflow 上有关该主题的其他一些讨论:
在最后两个中我谈到了一些你可以尝试的事情:
您可以获得商业渲染器(PDFViewForNet、PDFRasterizer.NET、ABCPDF、ActivePDF、XpdfRasterizer 和其他答案中的其他...)。
不过大多数都相当昂贵,特别是如果您只关心制作简单的预览/缩略图。
除了 Omar Shahine 的代码 sn-p 之外,还有一个 CodeProject article 显示如何使用 Adobe ActiveX,但它可能已经过时,很容易被新版本破坏,并且其合法性是模糊的(基本上它可以供内部使用,但您不能发布它,也不能在服务器上使用它来生成 PDF 图像)。
您可以查看SumatraPDF 的源代码,这是一个适用于 Windows 的开源 PDF 查看器。
还有Poppler,一个使用Xpdf作为渲染引擎的渲染引擎。 所有这些都很棒,但它们需要相当多的承诺才能使它们工作并与 .Net 交互,并且它们往往是根据 GPL 分发的。
您可能需要考虑使用 GhostScript 作为解释器,因为呈现页面是一个相当简单的过程。
缺点是您需要重新打包它以将其与您的应用一起安装,或者使其成为先决条件(或至少是安装过程的一部分)。
这不是一个很大的挑战,而且肯定比不得不将其他渲染引擎与 .Net 合作更容易。
我做了一个小项目,您可以在 Developer Express forums 上找到它作为附件。
请注意 GhostScript 的许可要求。
如果你不能离开,那么商业软件可能是你唯一的选择。
【讨论】:
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 问题。如果你想走这条路,首先要非常仔细地检查合法性。
【讨论】:
这是我对另一个问题的回答。
首先你需要引用 Adobe 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 可能会被遗弃。
【讨论】:
我用过的最简单的库是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 是一个很好的入门教程。
【讨论】:
您可以在 google 上搜索 PDF viewer component,并找到一些点击率。
如果您真的不需要将它们嵌入到您的应用程序中 - 您可以只需要 Acrobat Reader 或 FoxIt(或捆绑它,如果它符合各自的许可条款)和 shell out 即可。它没有那么酷,但它可以免费完成工作。
【讨论】:
使用网络浏览器控件。这需要安装 Adobe 阅读器,但很可能您仍然拥有它。将控件的 UrL 设置为文件位置。
【讨论】:
来自 ceTe 软件的动态 PDF 查看器可能会满足您的需求。我用过他们的生成器软件,非常满意。
【讨论】: