【问题标题】:Load a PDF in a ActiveX widget在 ActiveX 小部件中加载 PDF
【发布时间】:2017-08-18 08:07:39
【问题描述】:

我正在尝试将 PDF 加载到 QAxWidget

self.axWidget = QAxContainer.QAxWidget()
self.axWidget.setProperty("geometry", QtCore.QRect(630, 20, 501, 651))
self.axWidget.setControl("Adobe PDF Reader")
self.axWidget.dynamicCall("LoadFile(const QString)", "test.pdf")

但是,它只加载一个空的灰色背景:

我一直在寻找替代品、外部库、python pdf-to-png 库,然后只是简单地加载图像等。但到目前为止,我发现的每一个结果似乎对于这项任务来说都是多余的。

所以,由于 Qt 实际上支持 ActiveX 控件,我在哪里可以查看工作示例或 Python 中 dynamicCalls 的特定文档,以便在 QAxWidget 中加载 PDF?

我只需要它作为只读数据,所以即使是它的图像也可以工作。

【问题讨论】:

  • 试试吧:self.axWidget.dynamicCall("LoadFile(const QString &)", full_path_to_pdf_file)。此外,您可能需要检查 setControl 的返回值(即它应该是 True)。
  • 我对这个多年来似乎很流行的问题添加了一条评论:改用 QWebEngineView 来加载 PDF,它让这一切变得更加容易。

标签: python windows python-3.x pyqt pyqt5


【解决方案1】:

我遇到了同样的情况,我无法在我的应用程序窗口中“简单地”显示一个 pdf 文件。

经过大量测试和尝试,我找到了适合我的解决方法。

我没有加载使用 Adob​​e Acrobat PDF API (AcroPDF64.dll) 的控件 "Adobe PDF Reader",而是加载了使用 Internet Explorer 的 dll (ieframe.dll) 的控件 "Microsoft Web Browser"

这里是我使用的代码:

pdf = QAxWidget("Microsoft Web Browser")
pdf.dynamicCall("Navigate(const QString&)", pdf_path)
self.Ui.verticalLayout.addWidget(pdf)

首先,我使用 Qt Designer 在我的 Ui 中创建一个 verticalLayout 容器。

然后我创建一个QAxWidget 实例,在其中加载控件"Microsoft Web Browser"

pdf_path变量中保存我的pdf文件的完整路径后,我在网络浏览器中Navigate我的pdf完整路径。

最后我将QAxWidget 添加到verticalLayout

通过这种方式,使用 Microsoft Web Browser 默认插件(在我的例子中是 Acrobat Reader DC)可视化 pdf 文件。

要刷新或初始化 QAxWidget,即更改 pdf 文件或自动刷新内容,我使用此解决方案:

for i in reversed(range(self.Ui.verticalLayout.count())):
    self.Ui.verticalLayout.itemAt(i).widget().dynamicCall("Navigate(const QString&)", "")
    self.Ui.verticalLayout.itemAt(i).widget().deleteLater()
    self.Ui.verticalLayout.itemAt(i).widget().destroy(True)

这个for 循环清空了我的Ui.verticalLayout

【讨论】:

  • 微软网络浏览器可以在 linux 或 mac 上运行吗?我想知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-08
  • 2018-02-24
  • 2014-07-27
相关资源
最近更新 更多