将Acrobat Reader嵌入PyQt5应用程序会导致空白页

时间:2019-06-01 19:05:16

标签: python pdf pyqt pyqt5 activex

问题描述和上下文

我正在尝试制作一个应用程序,该应用程序可以填充大量表格,然后解析填充的数据并将其链接到数据库。为了使用公司所有已制成的PDF表单,我希望将acrobat阅读器嵌入我的PyQt应用程序中,因为它是一种有吸引力且功能齐全的PDF交互软件。但是,将QAxWidget设置为Adobe PDF Reader之后,背景变成灰色(好像已经加载了acrobat),但是我发送给QAxWidget的任何命令似乎都无效。

最小工作示例

我找不到用于将acrobat Reader与pyqt5应用程序链接的任何真实文档。我添加了一个QAxWidget,然后将其添加为我的centralWidget。然后,在名为OpenBlank()的函数中,我使用了在每个网站上找到的相同函数,以使用acrobat加载PDF。 重要部分 实际上是 openBlank()函数。所有其他的东西只是为了使MWE工作。只需添加任何PDF文件,然后将路径名更改为您的路径即可。您会看到它保持为空。

import sys
from PyQt5.QtWidgets import QMainWindow, QMessageBox, QApplication
from PyQt5.QAxContainer import QAxWidget
from PyQt5.QtCore import Qt
from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        MainWindow.setCentralWidget(self.centralwidget)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))


class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setupUi(self)
        self.AxViewer = QAxWidget(self)
        self.setCentralWidget(self.AxViewer)
        self.openBlank()

    def openBlank(self):
        FormPath = "a.pdf"
        self.AxViewer.clear()
        if not self.AxViewer.setControl('Adobe PDF Reader'):
            return QMessageBox.critical(self, 'Error', 
    'Adobe PDF Reader is not installed on your computer.')

        self.AxViewer.dynamicCall("LoadFile(const QString&)", FormPath)
        self.AxViewer.dynamicCall("setShowScrollbars(bool)", "True")


def main():
    app = QApplication(sys.argv)
    app.setAttribute(Qt.AA_EnableHighDpiScaling)
    app.setStyle("Fusion")
    form = MainWindow()
    form.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

期望

结果应该打开文件并打开滚动条,但是我得到的背景是空的。它类似于Load a PDF in a ActiveX widget的问题,但是由于一年多没有得到回答,因此我决定重复该问题。

1 个答案:

答案 0 :(得分:0)

我认为您的问题与self.AxViewer.dynamicCall()有关。我设法找到一些使用C ++的示例

AxViewer = new QAxWidget(this);
----------------
void MainWindow::on_actionOpen_triggered()
{
    //AxViewer->dynamicCall("LoadFile(\"D:\\OneDrive\\Documents\\sample.pdf\")");
    AxViewer->dynamicCall("LoadFile(QString)",
                     QDir::toNativeSeparators(QFileDialog::getOpenFileName(this,
                                                                           "Open PDF File",
                                                                           QDir::currentPath(),
                                                                           "PDF Documents (*.pdf)")));
}. 

有人可以将其转换为Python。我对C ++不熟悉。