如何将现有的 PDF 查看器添加到我的 WPF 项目?

问题描述 投票:0回答:2

我正在使用 WPF 和 C# 开发一个应用程序。我目前正在考虑添加功能,以便能够在我的应用程序中加载和查看 PDF 文件(以及具有自定义扩展名的文件)。

我已经设法在我的应用程序中显示 PDF 文件,使用

System.Windows.Controls.WebBrowser
显示文档,但是,这并没有让我对文档进行我想要的控制...

例如,当使用

WebBrowser
查看文档时,用户可以保存/打印文档,或者在这些文档上选择和复制文本等,但由于我将使用它来显示一些机密信息,所以我想要在我正在显示的文档上“禁用”这些功能。

基本上,我想在应用程序中在屏幕上显示文档,但不允许用户与文档进行任何其他交互。

我知道这不会阻止用户对内容进行屏幕截图/照片,但至少我会尽我所能确保信息保密。

但是,通过使用

WebBrowser
显示 PDF 文件(正如我已经完成的那样),用户会自动使用
WebBrowser
提供的内置功能(保存、打印、突出显示文本、复制),并且我找不到禁用这些功能的方法。

我似乎想使用 PDF 查看器控件来显示 PDF,而不是 Web 浏览器,并且我决定尝试使用名为 PDFSharp 的开源控件(https://sourceforge.net/projects/pdfsharp /?source=typ_redirect)。我已经下载了 MoonPDF 的源代码,但我不确定现在如何将其合并到我的应用程序中......?

我已经下载了源文件,但似乎在任何地方都没有

.sln
文件,因此我无法自行构建/运行 PDF 查看器...我将如何在我的应用程序中使用它?我不希望能够“创建 PDF 查看器的实例”以在我的应用程序中使用 - 以便我可以将其“作为对象添加”到我的应用程序的 GUI - 我该怎么做?

编辑

我对我的应用程序进行了更改以使用 MoonPdf 查看器 - 构建了 MoonPdf,并将 DLL 复制到我的项目中,我编辑了 XAML 以使用这些库:

<Window ...
        xmlns:mpp="clr-namespace:MoonPdfLib;assembly=MoonPdfLib"
        ...>
    <DockPanel>
        ...
        <Grid x:Name="host" DockPanel.Dock="Top" Margin="0,0,0,0">
            <mpp:MoonPdfPanel x:Name="PdfPanel" ... />
        </Grid>
    </DockPanel>
</Window>

我的.cs文件如下:

public partial class MainWindow:Window{
    String docFP = "C:\\...\\abc.pdf";
    public MainWindow(){
        InitializeComponent();
        try{
            host.Children.Add(PdfPanel);
            host.Opacity = 200;
            PdfPanel.OpenFile(docFP, null);
        }catch(Exception e){
            Console.WriteLine("browser is visible/ not: " + host.Visibility);
        }
    }

private void Window_Loaded_1(object sender, RoutedEventArgs e){
    host.Children.Add(PdfPanel);
}

private void openFileMenuItem_click(object sender, RoutedEventArgs e){
    // Working code for opening an 'open file' dialog, selecting the file, and loading it.
}
...

但是,当我当前运行代码时,应用程序会打开,但应直接在代码中打开和显示的 PDF 不会显示,如果我尝试加载 PDF,请使用调用

openFileMenuItem_click(...)
的菜单项函数,我的代码崩溃了,我得到一个 BadImageFormatException ,上面写着:

BadImageFormatException 未处理

MoonPdfLib.dll 中发生“System.BadImageFormatException”类型的未处理异常

但我知道我尝试打开的文件没有任何问题,因为我可以在 Adobe 中毫无问题地打开和查看它...

有什么想法为什么应用程序不会自动加载和显示我在代码中引用的 PDF,或者为什么当我尝试使用“加载文件”功能加载它时遇到异常?

c# wpf pdf open-source reader
2个回答
2
投票

.sln 文件只是解决方案。您可以创建自己的解决方案。或者您可以从here获取moonPDF并构建它。在你自己的项目中你必须引用它。 一旦引用它,您就可以将其添加到您的窗口中,如下所示:

<Window xmlns:mpp="clr-namespace:MoonPdfLib;assembly=MoonPdfLib" ...>
  <mpp:MoonPdfPanel Background="LightGray" ViewType="SinglePage" PageDisplay="ContinuousPages" PageMargin="0,2,4,2" AllowDrop="True"/>
</Window>

编辑:

下载 MOONPDF:https://github.com/reliak/moonpdf

1: 进入 src 文件夹并打开 MoonPdf.sln

2:该解决方案包含3个项目,您只需要

MouseKeyboardActivityMonitor
MoonPdfLib

MoonPdf
是一个 WPF 应用程序,您可以使用它作为示例来研究应该如何实现它,但这不是必需的。

3:编译/构建

MoonPdfLib
,即使它给出错误,它仍然会创建必要的DLL。

4:查看

BIN/RELEASE
BIN/DEBUG
文件夹,应该有一些DLL的

5:将它们复制到您的项目中并引用 MoonPdfLib.dll

编辑编辑:

这是二进制文件:https://sourceforge.net/projects/moonpdf/

您不必自己编译/构建项目。


0
投票

看看这个项目:

https://sourceforge.net/projects/laila-pdf/

它包括一个增强的 WPF PDF 查看器,具有平滑滚动、缩放、搜索功能、文本选择和复制以及基本 PDF 表单支持。它还包括一个 PDF 打印机对象。

但是,如果您愿意,您可以只向用户提供缩放工具,其余功能将保持隐藏。

它是免费且开源的,基于 Chrome Pdfium 库。

© www.soinside.com 2019 - 2024. All rights reserved.