2010-03-16 48 views
8

我正在寻找.NET GUI组件(与PDFsharp不同),允许预览PDF 1页文档
基本上我需要类似于PictureBox的地方,我可以加载位图并显示它。在C#中预览PDF

如果该组件允许缩放和移动图片,那将会很棒。
首选免费软件解决方案:)

+1

要跑这条赛道,我们将停止发布在stackoverflow上,因为我们几乎可以在谷歌中找到所有东西... 相信我 - 我之前做过研究。我感兴趣的组件海报尝试过,发现有用/灵活,并可以建议使用它。 – Maciej

回答

5

另一种选择是在GUI中使用WebBrowser控件。它将使用浏览器来渲染PDF,但我会这样做,而不是混淆Adobe Reader ActiveX组件。

如果您不想在客户端上提供任何类型的PDF阅读器,也可以通过GhostScript将其转换为图形文件并将其显示为位图。

+1

好主意! 你可以给我一些提示,我怎样才能打开它在webbrowser? 我将webbrowser.URL设置为例如“file:// c:/temp/test.pdf”,但它不起作用 - 它将Acro Reader作为单独的进程打开... (与IExplore ...相同) – Maciej

+0

OKAY我在这里找到解决方案:http://kb2.adobe.com/cps/331/331025.html – Maciej

2

您可以使用Acrobat Reader附带的ActiveX组件。

How to render pdfs using C#

+3

是的,你可以,但最终用户必须安装Adobe Reader ... – Rowan

+0

阅读器是免费的,所以这对我来说没什么大不了的... – Maciej

1

ImageGear for .NET

不是免费的。可以说比你关心的范围更大。我希望这有些帮助。

+0

看起来很有趣,但是在我的情况下,每个运行时客户端的定价是不可接受的。 – Maciej

0

Quick PDF Library,我公司的PDF SDK,将帮助您呈现PDF文件。这不是免费软件,但是该许可证允许使用它免版税分发已编译的应用程序。寻找用于渲染PDF文件的免费/开源组件比其他基本的PDF操作任务稍微复杂一点,因为渲染PDF文件可能相当困难。

以下是一些C#示例源代码,演示如何在窗体上的图片框中呈现PDF。

private void Form1_Load(object sender, EventArgs e) 
{ 
    QuickPDFAX0718.PDFLibrary pdf = new QuickPDFAX0718.PDFLibrary(); 

    qp.UnlockKey("......Licence Key......"); 

    // Open PDF File 
    int Handle = qp.DAOpenFile("C:\\sample.pdf", null); 

    // Get Total Number of Pages in a PDF File 
    int PageCount = qp.DAGetPageCount(Handle); 

    int PageNo = 1; 

    // It will get Reference of page 1 from PDF file 
    int PageRefNo = qp.DAFindPage(Handle, PageNo); 

    // You can change this parameter for Zoom In/Zoom Out purpose 
    int Zoom = 76; 
    double pageWidth = qp.DAGetPageWidth(Handle, PageRefNo)/Zoom; 
    double pageHeight = qp.DAGetPageHeight(Handle, PageRefNo)/Zoom; 

    // DPI use for rendering the page. Increase DPI will increate quality of image 
    int dpi = 92; 

    // Calculate Dimension of final output image 
    Bitmap b = new Bitmap(Convert.ToInt32(pageWidth * dpi), Convert.ToInt32(pageHeight * dpi)); 

    // This will Draw render image on GDI 
    using (Graphics g = Graphics.FromImage(b)) 
    { 
    IntPtr dc = g.GetHdc(); 
    qp.DARenderPageToDC(Handle, PageRefNo, dpi, (int)dc); 
    g.ReleaseHdc(dc); 
    } 

    // Assigne rendered image to PictureBox Control which will display PDF on Windows Form. 
    pictureBox1.Image = b; 
    pictureBox1.BorderStyle = BorderStyle.Fixed3D; 
} 

库不包含内置功能,帮助您用变焦,但因为你是渲染PDF作为BMP图像,你可以很容易打理的变焦。

+0

看起来不错。但更容易和更便宜的是使用@ bryanjonker的方法:) – Maciej

+0

更容易,更便宜,但不一定是您的最终用户。 ;-) – Rowan

2

问题是比较旧的,但提出的解决方案有显著的缺点:

  • WebBrowser控件依赖于IE浏览器,它可以显示PDF文档(这是真的只有在安装了Adobe Reader)
  • GhostScript的是根据AGPL许可的,并且它需要在闭源/商业项目中使用相当昂贵的许可证。

幸运的是,有免费的替代方案:popPLT工具(基于xpdf代码库),它们是在GPL下许可的,可用作控制台实用程序。从.NET代码它可以用System.Diagnostics.Process执行。

为了简化poppler的工具的使用,我们已经开发NReco.PdfRenderer .NET包装嵌入poppler的Windows可执行文件(他们正在提取在第一次使用)和渲染PDF页面的图像提供了简单的API:

var pdfToImg = new NReco.PdfRenderer.PdfToImageConverter(); 
Image firstPageImg = pdfToImg.GenerateImage("test.pdf", 1); 

组件不是免费的,但其定价非常合理。

+0

System.Diagnostics.Process仍然需要安装Adobe Reader才能使文件关联起作用,但为了简单起见,需要使用+1。 – OldDog

+0

@OldDog System.Diagnostics.Process不需要Adobe Reader,而poppler工具(pdftoppm)不依赖于Adobe Reader。它产生的图像(PNG或JPG),可以显示为任何其他图像文件。 –

+0

澄清我只是指System.Diagnostics.Process,它依赖于.PDF文件关联。在Windows 10之前,没有本机Windows PDF阅读器。即使使用Windows 10,它也使用IE(Edge)作为原生读卡器,我同意这是一个缺点。根据你的建议,我目前正在使用System.Diagnostics.Process,由于Adobe Reader是很好的编写和相当普遍使用,并且是免费的,它适合我的需求,因为它基本上是单一的语句简单。如果你说你可以使用poppler,那么我们只是不同意这个关联。 – OldDog