我想用C#以图形方式加载和绘制pdf文件.我不需要编辑它们或任何东西,只需在给定的缩放级别渲染它们.
我发现的pdf库似乎专注于生成.我该怎么做呢?
谢谢.
谷歌开源了它与福昕软件合作的优秀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); }
编辑:在WinForm中获取pdfRenderer控件:将PdfiumViewer
NuGet包添加到项目中; 在Windows资源管理器中打开项目包文件夹并将PdfiumViewer.dll
文件拖到Toolbox
窗口上; 一个名为的控件PdfRenderer
可以添加:
如果Adobe ActiveX不是您正在寻找的内容,还有其他一些选择(因为Acrobat必须存在于用户计算机上而您自己无法发送).
要创建PDF预览,首先要看一下StackOverflow上有关该主题的其他讨论:
如何预览文件?
在Windows上预览pdf的jpeg?
.NET在winform中打开PDF而没有外部依赖性
PDF预览和查看
在最后两个中,我谈到了一些你可以尝试的事情:
您可以在其他答案中获得商业渲染器(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的许可证要求.
如果你不能离开,那么商业软件可能是你唯一的选择.
以下是我对另一个问题的回答.
首先,您需要参考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可能会被遗弃.
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(); } } } }