将 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 组件选项卡并选择 Adob​​e PDF Reader(这会将 AcroPDF.DLL 添加到工具箱中)。

但我似乎找不到它所说的 Choose Toolbox ItemsCOM 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 添加到 &lt;Grid&gt;,并将其指向我要显示的 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 中的 Adob​​e PDF Reader Addon 才能正常工作。 Acrobat Reader XI 存在各种问题,最好使用 DC 版本。要启用 Adob​​e PDF,请转到 IE 设置、加载项并找到 Adob​​e PDF Reader 并启用它(AR XI 及更高版本)。

对我来说,与您链接的代码项目文章相比,这是首选方式。

【讨论】:

我试过这样做(但导航到我想立即查看的文件的位置,而不是about:blank),但是当我运行我的应用程序时,System.Windows.Controls.WebBrowser 我已添加到我的应用程序中显示一个页面说明 Navigation to the webpage was canceled,我收到一个“文件下载”弹出窗口,询问我是否要打开或保存我试图在我的应用程序中显示的 .pdf 文件...任何为什么会这样?我现在将更新我的 OP,以显示我在做什么。 @someone2088 您是否安装了 Adob​​e Reader?你可以简单地试试这个,只写PDF文件路径或者把它拖到IE的url框中。 谢谢 - 没有意识到我需要安装 Adob​​e 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 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

.net PDF 查看器控件 [关闭]

如何为选定的 pdf 查看器打开 pdf 到 iphone?

WPF/Silverlight 问题:如何添加 A-Z 列表项查看器?

保存为PDF时,WPF DataGrid GridLines不可见

如何在android中为pdf查看器制作注释,如突出显示、删除线、下划线、绘制、添加文本等?

使用 UploadFromFile 将文件上传到 Azure