在WPF应用程序中显示PDF

28

有什么想法可以在 WPF Windows 应用程序中显示 PDF 文件吗?


我正在使用以下代码运行浏览器,但是 Browser.Navigate 方法没有任何反应!

WebBrowser browser = new WebBrowser();
browser.Navigate("http://www.google.com");
this.AddChild(browser); // this is the System.Windows.Window

你想在WPF中显示PDF吗? - Aaron Fischer
你是要在Acrobat中外部启动还是需要一个设计时控件来在应用程序内显示? - Gulzar Nazim
1
我使用了将PDF导出为XpsDocument,并使用WPF的DocumentViewer控件进行显示,而不是使用WebBrowser控件。 - hertzogth
9个回答

18

1
当我尝试执行相同的操作时,出现了一个错误:“无法加载文件或程序集'Interop.AcroPDFLib,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'或其某个依赖项。系统找不到指定的文件。” - joshua
非常好,谢谢。我用了它,它很有效! - Hamoudy
非常感谢您与社区分享这个。希望所有的答案都能以视频格式呈现! :) - B.K.
3
博客文章的链接已失效。 - Jonas Sourlier
使用Acrobat PDF Lib,但问题是并不是每个人都安装了这个插件。 - EgoistDeveloper

13

您可以在表单上简单地托管一个Web浏览器控件,并使用它来打开PDF。

.NET 3.51中有一个新的本机WPF“WebBrowser”控件,或者您可以在WPF应用程序中托管Windows.Forms浏览器。


需要在最终用户的计算机上安装Acrobat Reader吗? - Rasto
在这种情况下,最终用户需要安装并在IE中注册某种PDF阅读器软件。我建议使用Foxit Reader而不是Adobe,它更快且不会安装间谍软件。 - Guy Starbuck
11
+1;迄今为止最简单的解决方案是: <WebBrowser Source="file://c:\path\to\my.pdf" /> - jeroenh
+1 那个最简单,棒极了。 - joshua
2
2016年更新,我不再推荐使用Foxit(现在已经臃肿),我使用Sumatra PDF。但是Windows 10 Edge浏览器现在具有内置的PDF支持,因此在Windows上安装任何第三方PDF软件可能是不必要的。 - Guy Starbuck

9

哎呀,这是针对WinForms应用程序的。不是针对WPF的。我还是发布一下吧。

尝试这个

private AxAcroPDFLib.AxAcroPDF axAcroPDF1;
this.axAcroPDF1 = new AxAcroPDFLib.AxAcroPDF();
this.axAcroPDF1.Dock = System.Windows.Forms.DockStyle.Fill;
this.axAcroPDF1.Enabled = true;
this.axAcroPDF1.Name = "axAcroPDF1";
this.axAcroPDF1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axAcroPDF1.OcxState")));
axAcroPDF1.LoadFile(DownloadedFullFileName);
axAcroPDF1.Visible = true;

即使用户系统中没有安装Acrobat Reader,这是否仍然有效? - Rasto
1
注意:如果您的应用程序已构建为64位应用程序,则此方法将无法正常工作。您需要强制将应用程序构建为32位应用程序。(如果您尝试在WPF中使用WindowsFormHost控件执行此操作,则存在相同的问题) - Raj Rao

9

为该项目添加了 GitHub 链接。 - B.K.
请注意,MoonPDF将PDF页面显示为图像。如果您想选择文本,则可能与此相关。 - Chuck Dee

8
只需要使用框架和网页浏览器即可,像这样:

只需使用框架和Web浏览器即可

Frame frame = new Frame();
WebBrowserbrowser = new WebBrowser();
browser.Navigate(new Uri(filename));
frame.Content = browser;

当你不再需要它时,请执行以下操作进行清理:

WebBrowser browser = frame.Content as WebBrowser;
browser.Dispose();
frame.Content = null;

如果您不清理它,那么根据您使用的.NET版本,可能会出现内存泄漏问题。如果我没有清理,我在.NET 3.5中看到了严重的内存泄漏问题。


8
以下代码需要安装Adobe Reader并将Pdf扩展连接到它。 它只是运行它:
String fileName = "FileName.pdf";
System.Diagnostics.Process process = new System.Diagnostics.Process(); 
process.StartInfo.FileName = fileName;
process.Start();
process.WaitForExit();

1
披露:这是商业软件,我在这家公司工作。
我知道已经有一个答案被接受了,但以下解决方案不需要Adobe Reader/Acrobat,而且是WPF解决方案——而不是Winforms。我也意识到这是一个老问题,但它刚刚被更新,所以我想它仍然是实际的。 PDFRasterizer.NET 3.0允许您呈现到WPF FixedDocument。它保留所有矢量图形(PDF图形被转换为更多或更少等效的WPF元素)。这可能是最接近您需求的。
using (FileStream file = new FileStream(path, FileMode.Open, FileAccess.Read))
{
  pdfDoc = new Document(file);

  ConvertToWpfOptions convertOptions = new ConvertToWpfOptions();
  RenderSettings renderSettings = new RenderSettings();
  ...

  FixedDocument wpfDoc = pdfDoc.ConvertToWpf(renderSettings, convertOptions, 0, 9, summary);
}

你可以将wpfDoc传递给WPF DocumentViewer等组件,以快速实现查看器。

0
你也可以使用FoxitReader。它是免费的,并带有一个ActiveX控件,在安装了FoxitReader应用程序后会在Web浏览器(IE和其他浏览器)中注册。 因此,在系统上安装FoxitReader之后,放置一个WebBrowser控件并将其Source属性设置为指向PDF文件的文件路径即可。

-1

2
iText 是一个很好的工具,但它不支持渲染 PDF。 - yms

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