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

Nob*_*fer 10 c# pdf wpf xaml visual-studio

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

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

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

但是,我似乎没有Data & Analytics工具箱中的Data选项卡...有一个选项卡,但只有指针,图表,ListView等项目.我需要做些什么来添加/启用Data & AnalyticsVisual中的 工具栏工作室?

我尝试按照以下教程: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谈论......

任何人都可以向我指出一个更清晰的教程,或解释我如何将PDF查看器添加到我的WPF应用程序中?我正在使用Visual Studio 2015.

编辑

我试图通过执行以下操作在我的应用程序窗口中显示PDF文件:

添加a <Grid>以在XAML中将PDF显示到GUI:

<StackPanel>
    <Grid x:Name="browserHost" Height="300" Width="525" Margin="0,0,0,0"></Grid>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)

添加WebBrowser<Grid>在C#,并指出这对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);
    }
Run Code Online (Sandbox Code Playgroud)

但是目前,当我运行我的应用程序时,一旦加载,browser我添加到它的页面会显示一个页面:

导航到网页已取消

弹出一个对话框询问我是否要打开或保存文件(sample.pdf- 我试图在浏览器中显示的那个)...

为什么要尝试下载文件,而不是显示它?如何才能browser显示文件而不是尝试下载?或者我应该使用除此之外的其他东西System.Windows.Controls.WebBrowser

Voj*_*nal 11

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

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

<WebBrowser x:Name="pdfWebViewer"></WebBrowser>
Run Code Online (Sandbox Code Playgroud)

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

pdfWebViewer.Navigate(new Uri("about:blank"));
Run Code Online (Sandbox Code Playgroud)

要将PDF文档加载到该控件,请使用以下简单代码:

pdfWebViewer.Navigate(fullPathToPDF);
Run Code Online (Sandbox Code Playgroud)

许多Windows软件使用这种方法不仅包括WPF应用程序,包括SAP客户端,而且还有隐藏的问题,请参阅此问题.

必须启用Internet Explorer中的Adobe PDF Reader Addon才能使其正常工作.Acrobat Reader XI存在各种问题,最好使用DC版本.要启用Adobe PDF,请转到IE设置,加载项并查找Adobe PDF Reader并启用它(AR XI及更高版本).

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

  • @ someone2088您是否安装了Adobe Reader?您只需尝试编写PDF文件路径或将其拖入IE的URL框即可. (2认同)

fun*_*ies 10

发布带有 @GeersJ 评论的答案以获得更好的可见性。

微软现在通过WebView2做到了这一点。

这种方法是迄今为止最简单的,并且可能是大多数开发人员正在寻求的前进方向。

在OP的上下文中,解决方案看起来像

<wv2:WebView2 Name="webView" Source="C:\sample.pdf"/>
Run Code Online (Sandbox Code Playgroud)

添加 xmlns

xmlns:wv2="clr-namespace:Microsoft.Web.WebView2.Wpf;assembly=Microsoft.Web.WebView2.Wpf"
Run Code Online (Sandbox Code Playgroud)

为此,您需要 nuget 包:

<PackageReference Include="Microsoft.Web.WebView2" Version="X.X.X.X" />
Run Code Online (Sandbox Code Playgroud)


Lan*_*erV 7

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

该代码可在github上找到

但是,对于超高级功能,您可能需要这些花哨的昂贵库之一。

  • 我也将此评论放在您的博客文章中,但我也会将其放在这里:截至 2020 年 2 月,您可以使用“Microsoft.Windows.SDK.Contracts”nuget 包,而不是您描述的参考方法。 (4认同)
  • 很好的解决方案!但是,我使用的是 VS 2019 和 .NET 5,而 github 上的解决方案使用 VS2014 和 .NET Framwork 4.7.1。我费了很大的劲才让该框架版本在我的 PC 上运行,但要使其在 NET 5 中工作,只需复制代码即可。评论中没有足够的空间来解释步骤,所以我添加了自己的答案,甚至大多数只是从您那里复制的。 (2认同)