[英]Add a PDF viewer to a WPF application
我是 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读取器(这将添加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>
将WebBrowser
添加到 C# 中的<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
以外的东西?
正如@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 软件都使用这种方法,不仅包括 SAP 客户端的 WPF 应用程序,而且有一个隐藏的问题,请参阅这个问题。
必须启用 Internet Explorer 中的 Adobe PDF Reader Addon 才能正常工作。 Acrobat Reader XI 存在各种问题,最好使用 DC 版本。 要启用 Adobe PDF,请转到 IE 设置、加载项并找到 Adobe PDF Reader 并启用它(AR XI 及更高版本)。
对我来说,与您链接的代码项目文章相比,这是首选方式。
@LanderV 的回答效果很好。 唯一的挑战是他在github上的解决方案使用 VS2014 和 .NET Framwork 4.7.1,而我使用的是 Visual Studio 2019 和 .NET 5。我花了一天时间才让 Framwork 4.7 解决方案在我的 PC 上运行,但是让它在 .NET 5 下运行非常容易。 我在这里解释了两种配置的步骤。
.NET 5
如果您想知道发生了什么,请阅读docs.microsoft.com:将桌面现代化为 uwp 。
在 VS 中创建一个新的 WPF .Net 5 解决方案。
在 WPF 项目文件中,更改
<TargetFramework>net5.0-windows</TargetFramework>
至
<TargetFramework>net5.0-windows10.0.19041.0</TargetFramework>
如果您 PC 上的 Windows 是不同的版本,请相应地更改 19041。 您可能会收到有关不正确的 .json 文件的错误消息,但请清理解决方案,重新构建它,应该不会再出现错误。
现在只需从 Githup 复制源代码:
主窗口.xaml
主窗口.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,它找不到并且不再需要。
对于WPF pdf查看器,您可以使用http://pdfprinting.net/
发布带有@GeersJ 评论的答案以获得更好的可见性。
微软现在用WebView2做到这一点。
到目前为止,这种方法是最简单的,并且可能是大多数开发人员正在寻找的前进方向。
在 OP 的上下文中,解决方案看起来像
<wv2:WebView2 Name="webView" Source="C:\sample.pdf"/>
添加 xmlns
xmlns:wv2="clr-namespace:Microsoft.Web.WebView2.Wpf;assembly=Microsoft.Web.WebView2.Wpf"
为此,您需要 nuget 包:
<PackageReference Include="Microsoft.Web.WebView2" Version="X.X.X.X" />
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.