从Winform显示pdf文件

gsv*_*rdi 23 c# pdf winforms

我只是用C#创建一个简单的计算器(windows窗体)

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

如何在winForm中点击按钮打开pdf文件?

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

请指导我在winForm中显示嵌入文件的最佳实践.

Win*_*ith 22

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

只需AcroPDF.PDF.1从COM Components选项卡添加到Toolbox(右键单击工具箱并单击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;
Run Code Online (Sandbox Code Playgroud)

  • 如果您的用户选择使用第三方控件来阅读pdf文档,那就不太好了. (4认同)

Ian*_*ose 11

如果计算机上安装了一个PDF阅读器,您可以使用WebBrowser控件并让IE为您加载PDF阅读器.

但是我上次尝试这个时,我不得不首先将PDF文件写入磁盘,所以我可以将WebBrowser控件指向它.

  • 如果您的用户更喜欢Firefox,那就不太好了;-) (3认同)

Oli*_*ver 7

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

更新

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

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

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

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

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


Cor*_*ory 7

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


Sco*_*Net 7

如果你想显示你的应用程序中的PDF,WebBrowser控件可能是在ADOBE READER控制较好,因为它会在PDF阅读器中打开该文件非常流畅或任何IE使用的默认打开PDF文件.您只需将WebBrowser控件添加到现有或新窗体并导航到pdf文件.

永远不要假设用户在其计算机上安装了Adobe或任何其他第三方控件或库,始终将其与可执行文件打包在一起,否则您可能会遇到问题.

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

WebBrowser1.Navigate("SomePDF.pdf");
Run Code Online (Sandbox Code Playgroud)


Tom*_*mmy 6

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

System.Diagnostics.Process.Start(
       "My-PDF-file.pdf");
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

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


Sna*_*ake 5

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

在回复首发评论时:

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


And*_*iff 5

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

\n\n

对于显示,除非您知道安装了 Acrobat 或类似文件(现在甚至 Edge 也可以打开这些文件),或者如果您想显示嵌入在 WinForms 应用程序中的文件,则有

\n\n

代码项目解决方案

\n\n

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

\n\n

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

\n\n

Pdfium浏览器

\n\n

https://github.com/pvginkel/PdfiumViewer

\n\n

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

\n\n
The PdfiumViewer library primarily consists out of three components:\n\xe2\x80\xa2The  PdfViewer  control. This control provides a host for the  PdfRenderer  control and has a default toolbar with limited functionality;\n\xe2\x80\xa2The  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;\n\xe2\x80\xa2The  PdfDocument  class provides access to the PDF document and wraps the Pdfium library.\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n
data = File.ReadAllBytes(@"C:\\temp\\abc.pdf");\nPdfiumViewer.PdfDocument doc;\nusing (Stream stream = new MemoryStream(data))\n{\n    doc = PdfiumViewer.PdfDocument.Load(stream);\n    var viewer = new PdfiumViewer.PdfViewer();\n    viewer.Document = doc;\n    var form = new System.Windows.Forms.Form();\n    form.Size = new Size(600, 800);\n    viewer.Dock = System.Windows.Forms.DockStyle.Fill;\n    form.Controls.Add(viewer);\n    form.ShowDialog();\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n