如何使用C#呈现PDF
我想用C#加载和绘制PDF文件。 我不需要编辑它们或任何东西,只需在给定的缩放级别渲染它们即可。
我发现的pdf库似乎集中在一代。 我如何做到这一点?
谢谢。
如果Adobe ActiveX不是您要查找的内容(因为Acrobat必须存在于用户机器上,并且您不能自己发货),还有其他一些select。
为了创buildPDF预览,首先看看关于StackOverflow主题的其他讨论:
- 我如何预览文件?
- 预览在Windows上的PDF格式的JPEG?
- .NET在Winform中打开PDF,没有外部依赖
- PDF预览和查看
在最后两篇中,我会谈谈几件你可以尝试的事情:
-
你可以得到一个商业渲染器( PDFViewForNet , PDFRasterizer.NET , ABCPDF , ActivePDF , XpdfRasterizer和其他答案…)。
大多数都是相当昂贵的,尤其是如果你所关心的是做一个简单的预览/缩略图。 -
除了Omar Shahine的代码片段之外,还有一篇CodeProject文章展示了如何使用Adobe ActiveX,但它可能已经过时,很容易被新版本破坏,而且其合法性也很模糊(基本上它可以用于内部使用,但是可以不会出货,你不能在服务器上使用它来生成PDF图像)。
-
你可以看看SumatraPDF的源代码, SumatraPDF是一个用于windows的OpenSource PDF查看器。
-
还有Poppler ,一个使用Xpdf作为渲染引擎的渲染引擎。 所有这些都是很好的,但是他们需要相当的承诺,使它们能够与.Net协同工作,并且倾向于在GPL下分发。
-
您可能要考虑使用GhostScript作为解释器,因为渲染页面是一个相当简单的过程。
缺点是您需要重新打包才能将其安装到您的应用程序中,或者将其作为先决条件(或至less是安装过程的一部分)。
这不是一个很大的挑战,而且它比其他渲染引擎与.Net合作更容易。
我做了一个小型项目,您可以在Developer Express论坛上find它作为附件。
请注意GhostScript的许可要求。
如果你不能离开那么商业软件可能是你唯一的select。
Google已经开源了它与福昕软件(Foxit Software)合作的优秀的PDF渲染引擎 – PDFium 。
有一个名为PdfiumViewer的C#nuget软件包,它提供了PDFium的C#封装,并允许显示和打印PDF。
我已经使用它,并且对渲染的质量印象深刻。
PDFium直接与数据stream协同工作,因此不需要将任何数据写入磁盘。
这是我从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资源pipe理器中打开项目包文件夹并将PdfiumViewer.dll
文件拖到Toolbox
窗口; 一个名为PdfRenderer
将可用来添加:
这是我从另一个问题的答案。
首先您需要参考Adobe Reader ActiveX控件
Adobe Acrobat浏览器控件types库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; } }
确保您的窗体closures时您处置的ActiveX控件
this.axAcroPDF1.Dispose(); this.axAcroPDF1 = null;
否则Acrobat可能会被搁置。
ABCpdf会为你做这个以及许多其他的事情。
它不会渲染你的PDF格式(如JPEG,GIF,PNG,TIFF,JPEG 2000;vectorEPS,SVG,Flash和PostScript),但它也可以在各种颜色空间(如灰色, RGB,CMYK)和位深度(例如,每个组件1,8,16位)。
这只是一些它会做的!
有关更多详情,请参阅
http://www.websupergoo.com/abcpdf-8.htm
哦,你可以通过免费的许可证scheme获得免费许可证。
使用Acrobat进行PDF呈现有EULA问题。 如果你想走下这条路,首先要非常小心地检查合法性。
PdfiumViewer是伟大的,但相对紧密耦合到System.Drawing
和WinForms。 出于这个原因,我创build了自己的PDFium封装: PDFiumSharp
页面可以呈现为PDFiumBitmap ,而后者又可以保存到磁盘或作为stream暴露。 这样,任何能够从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(); } } } }
来自ceTe软件的dynamicPDF查看器可能会做你正在寻找的东西。 我使用了他们的发生器软件,对此非常满意。
使用networking浏览器控件。 这需要安装Adobe阅读器,但最有可能的是你有它。 将控件的UrL设置为文件位置。
你可以谷歌PDF阅读器组件 ,并提出了多个点击。
但是,如果您不需要将它们embedded到您的应用程序中,则只需要Acrobat Reader或FoxIt(如果它符合各自的许可条款,则将其捆绑在一起), 然后将其提供给它。 这不是很酷,但它完成了免费的工作。
我使用的最简单的库是Paolo Gios的图书馆。 基本上是这样
Create GiosPDFDocument object Create TextArea object Add text, images, etc to TextArea object Add TextArea object to PDFDocument object Write to stream
这是一个很好的教程,让你开始。
免责声明:我为Atalasoft工作
我们有一个可以为.NET做这个的PDF Rasterizer
这看起来是正确的: http : //code.google.com/p/lib-pdf/