将PDF嵌入WPF应用程序

3

我正在尝试在WPF应用程序中嵌入/显示PDF。到目前为止,我已经尝试了以下解决方案,但都没有成功:

  1. 在一个 WindowsFormsHost 中托管一个 AxAcroPdf 控件来显示 PDF,类似于 这里 所示的内容。问题在于我的应用程序设置了 AllowsTransparency=True 以创建类似于 现代 UI 的样式,但这与 WindowsFormsHost 不协调(控件变得不可见)。

  2. WebBrowser 控件中显示 PDF。问题是一样的。

  3. AllowsTransparency=False,但这会使应用程序感觉缓慢。由于我故意使用 WPF 来增强我们的业务应用程序的外观和感觉,以使最终用户受益,这不能是一个解决方案。

  4. 使用第二个窗口并将 AllowsTransparency=False 设置为显示 WindowsFormsHost,并进行黑客攻击,使其看起来像主窗口的子控件,如 这里 所述。然而,我不喜欢代码后台方法,因为我正在使用 MVVM。

  5. 查找 WPF 的本地 PDF 控件。然而,我只找到了几个商业控件,现在不是一个选项。

我需要能够实现以下功能:
  • 在 WPF 应用程序中显示 PDF 或其表示形式(例如图像或转换为其他格式)。
  • 保持我的样式视觉完整和流畅(AllowsTransparency 必须保持为 True)。
  • 使用符合 MVVM 原则的方法(最好不要使用代码后台)。
  • 免费将其包含在我的应用程序中(用于商业用途)。
我完全开放手工制作解决方案、开源库甚至完全不同的方法。

这个问题被暂停了,因为它基于观点,但我所要求的实际上是一个众所周知的WPF bug的解决方法。我相信这个问题可以通过“事实、参考或特定的专业知识”来回答。事实上,已经有一个符合这个描述的答案了。难道我在寻求一个“强大或经过验证的方法”吗? - Benjamin Beaulieu
3个回答

4
我有两个解决方案:
  1. 打开您的.pdf文件,然后将其打印为.xps文件(您必须能够在代码中实现此操作),然后您可以将此文件嵌入您的应用程序中,并将其显示为xps文档。请参见: WPF中的文档 - MSDN - 微软(XPS)

  2. 使用一个免费库,我不是很确定它是否允许显示pdf,但可以生成它们,您可以查看EO-Pdf

希望这些提示有助于解决问题。

3
如果您愿意使用开源解决方案,我建议使用GhostScript。您可以将PDF(大部分情况下具有良好的质量)转换为任何格式的单个图像文件,以便进行后续处理。
另一种选择是使用pdf2htmlEX将PDF转换为HTML,但目前只能在Linux上编译。
我在Linux和Windows上的几个应用程序中都使用上述两种解决方案。HTML方式的优点是文本可以复制和粘贴。 GhostScript方式的优点是图像可能更便携(更小)。
与任何开源解决方案一样,您需要了解每个产品发布的许可条款及其对最终结果的影响。

1
我使用 GhostScriptSharp,并将其封装在一个方便的 WPF 控件中,可以绑定PDF文件路径。它会自动生成PNG文件,并在 ScrollViewer 中的 ImageListBox中显示它们。虽然在生成PNG时性能不是最佳的,但仍然起到作用,使我的用户界面流畅,代码整洁。另外,此解决方案还减少了与调整大小/重新绘制 WindowsFormsHost 相关的视觉故障。 - Benjamin Beaulieu
对于PDF文件,如果你只是处理页面图像,选择jpg格式可能会节省更多的空间/时间... 如果你只是处理简单图表的文本文档,或者想要通过OCR高效处理它们,那么png是最好的选择... 但是:如果唯一的原因是查看图像丰富的PDF文件或在线查看,则没有必要使用无损的png。 - Nathan M

2

我曾经使用的一个好的解决方案是使用CefSharp。它是Chrome浏览器引擎,支持预览PDF文档。 访问快速入门页面

如果遇到问题,建议访问故障排除页面设置适当的设置。

如果您想在本地驱动器上显示PDF文件,还应该为浏览器使用这些设置,然后使用file:///协议:

 CefSharp.BrowserSettings browserSettings = new CefSharp.BrowserSettings();
 browserSettings.FileAccessFromFileUrls = CefSharp.CefState.Enabled;
 browserSettings.UniversalAccessFromFileUrls = CefSharp.CefState.Enabled;
 browserSettings.TextAreaResize = CefSharp.CefState.Enabled;
 my_bowser.BrowserSettings = browserSettings;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接