从Winform显示pdf文件

时间:2010-02-08 07:34:00

标签: c# winforms pdf

我只是用C#(windows窗体)

创建一个简单的计算器

我创建了一个“用户帮助”,这是一个pdf文件,如果用户点击WinForm中的“帮助”按钮,我想要显示该pdf文件。假设Adobe Reader已预先安装在用户的计算机上....

如何在winForm按钮上单击打开pdf文件?

我不打算在用户的硬盘上提供此pdf文件。这意味着我必须将这个pdf嵌入到计算器(winForm)中,并且必须在按钮点击时显示它。

请指导我在winForm中显示嵌入文件的最佳做法。

11 个答案:

答案 0 :(得分:22)

您可以参考Adobe Reader ActiveX控件并将其与您的应用程序捆绑在一起。

只需从“COM组件”选项卡中向工具箱添加AcroPDF.PDF.1(右键单击工具箱,然后单击Choose Items...),然后将实例拖到Winform上,让设计人员为您创建代码。或者,在添加必要的引用后,您可以使用以下代码:

AxAcroPDFLib.AxAcroPDF pdf = new AxAcroPDFLib.AxAcroPDF();
pdf.Dock = System.Windows.Forms.DockStyle.Fill;
pdf.Enabled = true;
pdf.Location = new System.Drawing.Point(0, 0);
pdf.Name = "pdfReader";
pdf.OcxState = ((System.Windows.Forms.AxHost.State)(new System.ComponentModel.ComponentResourceManager(typeof(ViewerWindow)).GetObject("pdfReader.OcxState")));
pdf.TabIndex = 1;

// Add pdf viewer to current form        
this.Controls.Add(pdf);

pdf.LoadFile(@"C:\MyPDF.pdf");
pdf.setView("Fit");
pdf.Visible = true;

答案 1 :(得分:11)

如果计算机上安装了PDF阅读器,您可以使用WebBrowser control并让IE为您加载PDF阅读器。

然而,上次我尝试这个时,我必须先将PDF文件写入磁盘,所以我可以将WebBrowser控件指向它。

答案 2 :(得分:7)

Google代码上有一个C#pdf viewer项目。 http://code.google.com/p/pdfviewer-win32/ 有一个查看器,它有一个可用的库,它使用mupdf和xpdf在winforms程序中呈现pdf文档。我目前正在开发一个用户控件库供人们使用,并放入他们的程序中以获取pdf查看功能。它的效果非常好。

答案 3 :(得分:7)

如果要在应用程序中显示pdf,WebBrowser控件可能优于Adobe Reader控件,因为它可以在PDF Reader中打开文件,或者IE默认打开pdf。您只需将WebBrowser控件添加到现有或新表单,然后导航到pdf文件。

永远不要假设用户的计算机上安装了Adobe或任何其他第三方控件或库,请始终使用可执行文件打包它们,否则您可能会遇到问题。

Adob​​e Reader控件显然不能与.NET集成为内在的Windows组件。作为一项规则,我总是倾向于使用内置的.Net控件来控制第三方供应商。至于将文件嵌入实际可执行文件中;直到微软决定任何旧的PDF可以加入CLS并编译成MSIL之后才会发生。在.NET中开发任何应用程序时所拥有的代码可以编译为中间MSIL,以便在运行时由CLR转换为本机代码并在操作系统中执行。

WebBrowser1.Navigate("SomePDF.pdf");

答案 4 :(得分:6)

我会把它放在我的程序文件夹中,在我的“开始菜单”文件夹中添加一个链接,以便直接访问(无需启动我的工具),只需点击某个点击事件System.Diagnostics.Process.Start(@".\Manual.pdf");

更新

好的,现在我们来一个全新的问题:如何在我的应用程序中嵌入一个文件并启动它?

对于这个问题,你会在这里找到几个答案,但这里是简短的版本:

  1. 右键单击您的项目,然后选择添加 - 现有项目
  2. 选择您的文件(不要双击
    • 点击“添加”按钮旁边的小箭头,然后选择添加为链接
  3. 双击Properties - Resources.resx
  4. 单击“添加资源”旁边的小箭头,然后选择“添加现有文件”
  5. 在打开的对话框中再次选择相同的文件
  6. 现在,您可以从byte[]
  7. 访问代码中的文件Properties.Resources.NameOfResource

    通过这些步骤,您可以在结构中引用文件。如果您愿意,将pdf文件的副本放入项目中的子文件夹资源中,只需跳过上面列表中的第一点和第二点。

    要让您的pdf现在打开,您必须将byte []写入磁盘(可能带有Path.GetTempFileName())并使用Adobe Reader启动它。 (不要忘记在使用后删除文件)

答案 5 :(得分:6)

如果您的用户在其计算机上安装了Adobe Reader(或任何其他PDF阅读器),则可以使用:

System.Diagnostics.Process.Start(
       "My-PDF-file.pdf");

希望这有帮助。

注意:显然,如果用户没有安装任何PDF Reader应用程序,这将失败。

答案 6 :(得分:5)

我建议将您的pdf文件转换为Microsoft帮助文件,这样您就不需要安装Adobe Reader(它有问题,而且安全问题太多)。您不能指望用户拥有此功能。

回复首发评论:

是的,您需要将帮助文件创建为HTML文档而不是pdf。没有简单的方法将pdf转换为HTML。

答案 7 :(得分:4)

也许可以将Adobe的Reader作为ActiveX组件嵌入到表单中。但这意味着您必须确保在客户端计算机上安装了Reader才能使其正常工作。

如果不必严格嵌入,您只需启动PDF文件,并允许用户打开它的任何查看器。

答案 8 :(得分:3)

如何打开具有相对路径的PDF文件

在这种情况下,创建的应用程序必须在多台PC上运行。要引用不在网络中但在程序文件夹本身中的文件,请使用以下代码片段:

首先包括以下图书馆:

using System.IO;

然后使用按钮图片框无论创建ClickEvent并使用以下代码段:

    private void pictureBox2_Click(object sender, EventArgs e)
    {
        //get current folderpath of the .exe
        string ProgramPath = AppDomain.CurrentDomain.BaseDirectory;
        //jump back relative to the .exe-Path to the Resources Path
        string FileName = string.Format("{0}Resources\\Master_Thesis_Expose.pdf", Path.GetFullPath(Path.Combine(ProgramPath, @"..\..\")));

        //Open PDF
        System.Diagnostics.Process.Start(@"" + FileName + "");

    }

|拇指向上|

答案 9 :(得分:3)

取出嵌入式文件应该不是问题。这不依赖于.pdf格式,您可以在那里寻找单独的解决方案。

为了显示,除非你知道安装了Acrobat或类似的东西(好吧,即使Edge现在可以打开这些文件),或者如果你想显示嵌入在WinForms应用程序中的文件,还有

Codeproject解决方案

https://www.codeproject.com/Articles/37458/PDF-Viewer-Control-Without-Acrobat-Reader-Installe

用VB编写,依赖于大量(部分商业化,如果你的解决方案是商业化的)库。

<强> PdfiumViewer

https://github.com/pvginkel/PdfiumViewer

很棒,也可以通过NuGet获得。

none

这是一个一体化的显示解决方案,并附带更友好的Apache 2.0许可证。

编辑,添加示例代码,为了您的方便:)我包含以下内容

The PdfiumViewer library primarily consists out of three components:
•The  PdfViewer  control. This control provides a host for the  PdfRenderer  control and has a default toolbar with limited functionality;
•The  PdfRenderer  control. This control implements the raw PDF renderer. This control displays a PDF document, provides zooming and scrolling functionality and exposes methods to perform more advanced actions;
•The  PdfDocument  class provides access to the PDF document and wraps the Pdfium library.

这会动态生成表单,当然您也可以使用设计器。

答案 10 :(得分:-1)

AxAcroPDF1.LoadFile("C:ShippingForm.pdf")
AxAcroPDF1.src = "C:ShippingForm.pdf"
AxAcroPDF1.setShowToolbar(False)
AxAcroPDF1.setView("fitH")
AxAcroPDF1.setLayoutMode("SinglePage")
AxAcroPDF1.setShowScrollbars(False)
AxAcroPDF1.Show()