Встраивание Acrobat Reader в приложение PyQt5 приводит к пустым страницам - PullRequest
1 голос
/ 01 июня 2019

Описание проблемы и контекст

Я пытаюсь создать приложение, которое позволяет заполнять многочисленные номера форм, а затем анализировать заполненные данные и связывать их с базой данных. Чтобы использовать все уже созданные компанией PDF-формы, я хотел встроить Acrobat Reader в свое приложение PyQt, поскольку это привлекательное и полностью функциональное программное обеспечение для взаимодействия PDF-файлов. Но после того, как я установил свой QAxWidget на Adobe PDF Reader, фон становится серым (как если бы он загружал акробат), но любая команда, которую я посылаю в QAxWidget, похоже, не работает.

Минимальный рабочий пример

Я не могу найти какой-либо реальной документации для связывания Acrobat Reader с приложениями pyqt5. Я добавил QAxWidget, а затем добавил его в качестве centralWidget. Затем в функции OpenBlank () я использовал те же функции, что и на каждом веб-сайте, чтобы загрузить PDF с помощью acrobat. Важная часть на самом деле является 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()

Ожидания

Результат должен открыть файл и включить полосу прокрутки, но вместо этого я получаю пустой фон. Это похоже на Загрузка PDF в виджет ActiveX вопрос, но я решил продублировать его, так как на него не было ответа более года.

1 Ответ

0 голосов
/ 03 июня 2019

Я думаю, что ваша проблема с 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 ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...