将 PDF 查看器添加到 WPF 应用程序
Posted
技术标签:
【中文标题】将 PDF 查看器添加到 WPF 应用程序【英文标题】:Add a PDF viewer to a WPF application 【发布时间】:2016-09-21 16:24:59 【问题描述】:我是 WPF 的新手,正在尝试将 PDF 查看器添加到我的 WPF 应用程序中,但似乎无法弄清楚如何去做...我尝试按照我拥有的几个教程/示例进行操作在网上找到的,但由于各种原因,它们似乎对我不起作用...
例如,我尝试按照以下教程进行操作:https://documentation.devexpress.com/#WPF/CustomDocument114328 在设计时添加一个 PDF 查看器 - 它说
将 PdfViewerControl 从 DX.15.2:Data & Analytics Toolbox 选项卡拖放到主窗口中
但是,我的工具箱中似乎没有 Data & Analytics
选项卡...有一个 Data
选项卡,但只有指针、图表、列表视图等项目。我需要什么在 Visual Studio 中添加/启用Data & Analytics
工具栏?
我尝试按照以下教程进行操作: https://documentation.devexpress.com/#WPF/CustomDocument114329 通过代码添加 PDF 查看器-它说
打开解决方案资源管理器,右键单击参考并选择添加参考...以添加 PDF 查看器库。
然后,找到 DevExpress.Data.v15.2、DevExpress.Pdf.v15.2.Core、DevExpress.Xpf.DocumentViewer.v15.2.Core 和 DevExpress.Xpf.PdfViewer.v15.2 程序集并激活他们的复选框。
但是当我转到Add Reference
时,我在任何地方都找不到它提到的程序集,如果我“搜索”它们,也找不到任何项目...
我是否缺少include
,或者我是否需要从某个地方导入一些库才能使用它们?
我试过的另一个是:http://www.codeproject.com/Articles/380019/Using-Adobe-Reader-in-a-WPF-app,上面写着:
将此控件添加到项目后,Windows 窗体设计器应该会以空白画布打开。您需要打开工具箱 (CTRL + W, X)。作为第一步,为自定义控件添加一个新选项卡是个好主意——这是工具箱上下文菜单中的一个选项。展开这个新选项卡后,从上下文菜单中选择“选择项目”。当出现选择工具箱项目对话框时,选择 COM 组件选项卡并选择 Adobe PDF Reader(这会将 AcroPDF.DLL 添加到工具箱中)。
但我似乎找不到它所说的 Choose Toolbox Items
或 COM Components
...
谁能给我指出一个更清晰的教程,或者解释我如何将 PDF 查看器添加到我的 WPF 应用程序中?我正在使用 Visual Studio 2015。
编辑
我尝试通过执行以下操作在我的应用程序窗口中显示 PDF 文件:
添加<Grid>
以在 XAML 中将 PDF 显示到 GUI:
<StackPanel>
<Grid x:Name="browserHost" Height="300" Width="525" Margin="0,0,0,0"></Grid>
</StackPanel>
在 C# 中将 WebBrowser
添加到 <Grid>
,并将其指向我要显示的 PDF 的位置:
System.Windows.Controls.WebBrowser browser = new System.Windows.Controls.WebBrowser();
public MainWindow()
InitializeComponent();
try
//browser.Navigate("C:\\...\\sample.pdf");
browserHost.Children.Add(browser);
//browser.Visible = true;
browser.Navigate("C:\\...\\sample.pdf");
browserHost.Opacity = 200;
catch(Exception e)
Console.WriteLine("browser is visible/ not: " + browserHost.Visibility);
private void Window_Loaded_1(object sender, RoutedEventArgs e)
/*Create the interop host control */
//System.Windows.Forms.Integration.WindowsFormsHost host = new System.Windows.Forms.Integration.WindowFormsHost();
/*Create the MaskedTextBox control */
//browser.Navigate("C:\\...\\sample.pdf");
//host.Child = browser;
browserHost.Children.Add(browser);
但目前,当我运行我的应用程序时,一旦加载,我添加到其中的browser
会显示一个页面,上面写着:
网页导航被取消
然后会弹出一个对话框询问我是否要打开或保存文件(sample.pdf
- 我试图在浏览器中显示的那个)...
为什么它试图下载文件,而不是显示它?我怎样才能让browser
显示文件而不是尝试下载它?还是我应该在这里使用System.Windows.Controls.WebBrowser
以外的其他东西?
【问题讨论】:
前两个控件是来自 devexpress 的商业控件,您必须购买并安装它们。 Adobe 的第三个是 Winforms 控件,它与 WPF 不直接兼容。您需要下载(并安装)一个 WPF PDF 控件,例如 github.com/reliak/moonpdf 或 wpfpdfviewer.codeplex.com 或者你可以使用System.Windows.Controls
中的WebBrowser
【参考方案1】:
正如@NawedNabiZada 已经建议的那样,一种尝试过且直接的方法是使用嵌入式InternetExplorer 来显示Adobe PDF Reader
ActiveX 控件。因此它假定您在 Windows 上运行并安装了 Adobe PDF Reader
。
然后您创建一个包含以下控件的用户控件、窗口等:
<WebBrowser x:Name="pdfWebViewer"></WebBrowser>
在构造函数中导航到空白页:
pdfWebViewer.Navigate(new Uri("about:blank"));
要将 PDF 文档加载到该控件,请使用以下简单代码:
pdfWebViewer.Navigate(fullPathToPDF);
这种方法被许多 Windows 软件使用,不仅 WPF 应用程序包括 SAP 客户端,但存在一个隐藏问题,请参阅 this question。
必须启用 Internet Explorer 中的 Adobe PDF Reader Addon 才能正常工作。 Acrobat Reader XI 存在各种问题,最好使用 DC 版本。要启用 Adobe PDF,请转到 IE 设置、加载项并找到 Adobe PDF Reader 并启用它(AR XI 及更高版本)。
对我来说,与您链接的代码项目文章相比,这是首选方式。
【讨论】:
我试过这样做(但导航到我想立即查看的文件的位置,而不是about:blank
),但是当我运行我的应用程序时,System.Windows.Controls.WebBrowser
我已添加到我的应用程序中显示一个页面说明 Navigation to the webpage was canceled
,我收到一个“文件下载”弹出窗口,询问我是否要打开或保存我试图在我的应用程序中显示的 .pdf
文件...任何为什么会这样?我现在将更新我的 OP,以显示我在做什么。
@someone2088 您是否安装了 Adobe Reader?你可以简单地试试这个,只写PDF文件路径或者把它拖到IE的url框中。
谢谢 - 没有意识到我需要安装 Adobe Reader,也没有想过要检查...
这对我来说非常有效,直到我意识到 WebBrowser 是 TopMost。我们有“弹出”的小部件等,所以这个控件只是与那些重叠。无论您尝试什么,它都会保持领先!
@FrederikMoller 它的行为不同,但我在 Grid 中将它与 AvalonDocks 一起使用,并且弹出窗口或下拉菜单通常会与它重叠。我可以切换到隐藏 WebBrowser 窗格等的其他选项卡。【参考方案2】:
对于遇到此问题并且需要比使用 WebBrowser 更多控制的任何人:使用 Windows 10 API 制作自己的 PDF 查看器非常容易。我写了一个blog 来说明如何做到这一点。您可以轻松地向其添加其他功能,例如在其顶部(签名)绘图等。
代码可在github获取。
但是,对于超高级功能,您可能需要其中一个昂贵的库。
【讨论】:
我也在你的博客文章中发表了这条评论,但我也会把它放在这里:你可以在 2020 年 2 月使用 'Microsoft.Windows.SDK.Contracts' nuget 包,而不是比你描述的参考方法。 很好的解决方案!但是,我使用的是 VS 2019 和 .NET 5,而您在 github 上的解决方案使用的是 VS2014 和 .NET Framwork 4.7.1。为了让框架版本在我的 PC 上运行,我费了一番周折,但是让它在 NET 5 中运行只是将代码复制过来。评论中没有足够的空间来解释这些步骤,所以我添加了我自己的答案,甚至大部分都是从你那里复制过来的。【参考方案3】:cefsharp Web 浏览器也可以。
它包含用于 PDF 的嵌入式模块,因此您不需要 Acrobat-Reader 或任何其他 ActiveX。
Get-Started CefSharp in WPF
【讨论】:
微软现在用WebView2来做这件事。【参考方案4】:@LanderV 的回答效果很好。唯一的挑战是他在github 上的解决方案使用VS2014 和.NET Framwork 4.7.1,而我使用的是Visual Studio 2019 和.NET 5。我花了一天时间才让Framwork 4.7 解决方案在我的PC 上运行,但是让它在 .NET 5 下运行非常容易。我在这里解释了两种配置的步骤。
.NET 5
如果你想知道发生了什么,请阅读docs.microsoft.com: modernize desktop to uwp。
在 VS 中创建一个新的 WPF .Net 5 解决方案。
在WPF项目文件中,更改
<TargetFramework>net5.0-windows</TargetFramework>
到
<TargetFramework>net5.0-windows10.0.19041.0</TargetFramework>
如果您 PC 上的 Windows 是不同的版本,请相应地更改 19041。您可能会收到有关 .json 文件不正确的错误消息,但请清理解决方案,重新构建它,应该不会再有错误了。
现在只需从 Githup 复制源代码: MainWindow.xaml MainWindow.xaml.cs PdfViewer.xaml PdfViewer.xaml.cs
现在您应该可以运行应用程序了。
.NET 框架 4.7.1
如果可以,请使用 .NET 5 或更高版本,如上所述,这会容易得多。要按原样运行 Github 代码,我必须执行以下步骤:
从https://github.com/LanderVe/WPF_PDFDocument克隆
下载 .NET Framework 4.7.1,开发包 https://dotnet.microsoft.com/download/dotnet-framework/net471
阅读帮助https://docs.microsoft.com/en-us/windows/apps/desktop/modernize/desktop-to-uwp-enhance
使用 NuGet 包管理器安装 Microsoft.Windows.SDK.Contracts
将出现关于 .dll 安装两次的错误消息。保留一个 在 nuget 位置,删除存储在 .NET 中的引用下的那个 框架位置。
项目应该编译并运行
从引用中删除 Windows,它找不到并且没有 需要更长的时间。
【讨论】:
以上是关于将 PDF 查看器添加到 WPF 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
如何为选定的 pdf 查看器打开 pdf 到 iphone?
WPF/Silverlight 问题:如何添加 A-Z 列表项查看器?
保存为PDF时,WPF DataGrid GridLines不可见