在C#中预览PDF

10
我正在寻找一个.NET GUI组件(不同于PDFsharp),它可以预览PDF单页文档。基本上,我需要类似于PictureBox的东西,可以加载位图并显示出来。
如果该组件允许缩放和移动图片,则更好。最好是免费软件解决方案 :)

2
按照这个方向,我们将停止在stackoverflow上发布问题,因为我们几乎可以在google上找到所有的答案......相信我 - 我之前进行了调查。我对发帖者尝试过并且发现有用/灵活的组件感兴趣,并可以建议使用它们。 - Maciej
5个回答

6
另一个选项是在您的GUI中使用WebBrowser控件。它将使用浏览器来呈现PDF,但我会选择这条路线,而不是玩弄Adobe Reader ActiveX组件。
如果您不想在客户端上提供任何类型的PDF阅读器,您还可以通过GhostScript将其转换为图形文件,并将其显示为位图。

1
好主意!你能给我一些提示,如何在 web 浏览器中打开它吗? 我将 webbrowser.URL 设置为“file://c:/temp/test.pdf”,但它不起作用 - 它会打开 Acro Reader 作为单独的进程...(和 IExplore 一样...) - Maciej
如果您不想依赖于IE/Edge MS浏览器,也可以使用CEFSharp Chromium浏览器来进行.NET编程。https://cefsharp.github.io/ - tinmac

2

2
问题相当老,但提出的解决方案具有显着缺点:
  • WebBrowser控件依赖于IE,以及它能否显示PDF文档(仅当安装了Adobe Reader时才为真)
  • GhostScript在AGPL下许可,并且在闭源/商业项目中使用需要相当昂贵的许可证。

幸运的是,存在免费的替代品:基于xpdf代码库的poppler工具,其受GPL许可并可用作控制台实用程序。从.NET代码中,可以使用System.Diagnostics.Process执行它。

为了简化poppler工具的使用,我们开发了NReco.PdfRenderer .NET包装器,其中嵌入了poppler windows二进制文件(它们在首次使用时被提取),并提供了简单的API,用于将PDF页面渲染为图像:

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

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


System.Diagnostics.Process仍需要安装Adobe Reader才能使文件关联工作,但是为简单起见得到+1分。 - OldDog
@OldDog,System.Diagnostics.Process不需要Adobe Reader,而poppler工具(pdftoppm)也不依赖于Adobe Reader。它生成的图像(png或jpg)可以像其他任何图像文件一样显示。 - Vitaliy Fedorchenko
为了澄清,我只是指System.Diagnostics.Process,它依赖于.PDF的文件关联。在Windows 10之前,没有本地的Windows PDF阅读器。即使在Windows 10中,它也使用IE(Edge)作为本地阅读器,我同意这是一个缺点。根据您的建议,我目前正在使用System.Diagnostics.Process,并且由于Adobe Reader在我看来编写良好且广泛使用,而且免费,因此由于其基本单语句简洁性,它非常适合我的需求。如果您说您可以使用poppler,则我们对关联有不同看法。 - OldDog

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图像,因此您可以相当轻松地处理缩放。


看起来确实不错。但对我来说,使用@bryanjonker的方法更简单、更便宜 :) - Maciej
对你来说更容易和更便宜,但不一定对最终用户如此。;-) - Rowan

0

.NET的ImageGear

非免费。可以说比你关心的范围更广。希望它能在某种程度上有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接