将PDF查看器添加到WPF应用程序

时间:2016-05-24 12:39:31

标签: c# wpf visual-studio xaml pdf

我是WPF的新手,我正在尝试将PDF查看器添加到我的WPF应用程序中,但似乎无法解决如何做到这一点...我已经尝试过以下几个教程/示例在网上发现,但由于各种原因它们似乎不适合我...

例如,我尝试按照以下教程进行操作:https://documentation.devexpress.com/#WPF/CustomDocument114328 在设计时添加PDF查看器 - 它说

  

从DX.15.2中拖动PdfViewerControl:数据& “分析工具箱”选项卡并将其拖放到主窗口

但是,我似乎在工具箱中没有Data & Analytics标签...有一个Data标签,但是它只有指针,图表,ListView等项目。有吗我需要做些什么才能在Visual Studio中添加/启用Data & Analytics工具栏?

我尝试了以下教程: https://documentation.devexpress.com/#WPF/CustomDocument114329通过代码添加PDF查看器 - 它说

  

打开Solution Explorer,右键单击References并选择Add Reference ...以添加PDF Viewer Library。

     

然后,找到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 ItemsCOM Components ......

有人能指出一个更清晰的教程,或者解释如何在我的WPF应用程序中添加PDF查看器吗?我正在使用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以外的其他内容吗?

5 个答案:

答案 0 :(得分:9)

正如@NawedNabiZada已经提出的,一种经过验证的直接方法是使用嵌入式InternetExplorer来显示Adobe PDF Reader ActiveX控件。因此,它假设您在Windows上运行并安装了Adobe PDF Reader

然后创建一个包含以下控件的用户控件,窗口等:

<WebBrowser x:Name="pdfWebViewer"></WebBrowser>

在构造函数中导航到空白页面:

dfWebViewer.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及更高版本)。

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

答案 1 :(得分:4)

对于任何绊脚石的人来说,需要比WebBrowser更多的控制:使用Windows 10 API制作自己的PDF查看器非常容易。我写了blog如何做到这一点。您可以轻松地向其添加其他功能,例如在其顶部绘制(签名)等。

该代码可在github上找到。

但是对于超级高级功能,您可能需要其中一个昂贵的库。

答案 2 :(得分:2)

cefsharp Web浏览器也可以。

它包含PDF的嵌入式模块,因此您不需要Acrobat-Reader或任何其他ActiveX。

Get-Started CefSharp in WPF

答案 3 :(得分:0)

对于WPF pdf查看器,您可以使用http://pdfprinting.net/

答案 4 :(得分:0)

@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 复制源代码:
主窗口.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 中的 References 下的那个 框架位置。

项目应该编译并运行

从引用中删除 Windows,它无法找到并且是没有 需要更长的时间。