我想用C#以图形方式加载和绘制pdf文件。我不需要编辑它们或任何东西,只需在给定的缩放级别渲染它们。
我发现的pdf库似乎专注于生成。我该怎么做?
感谢。
答案 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
的控件可用于添加:
答案 1 :(得分:43)
如果Adobe ActiveX不是您正在寻找的内容,还有其他一些选择(因为Acrobat必须出现在用户计算机上,而您自己无法发货)。
要创建PDF预览,首先要看一下StackOverflow上有关该主题的其他讨论:
在最后两篇文章中,我谈到了一些你可以尝试的事情:
您可以在其他答案中获得商业渲染器(PDFViewForNet,PDFRasterizer.NET,ABCPDF,ActivePDF,XpdfRasterizer和其他人。 )。
大多数都是相当昂贵的,特别是如果你关心的只是做一个简单的预览/缩略图。
除了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控件
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可能会被遗弃。
答案 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查看器可能会满足您的需求。我已经使用了他们的发生器软件并对它非常满意。
答案 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执行此操作
答案 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。它并不酷,但它可以免费完成工作。