QWebEngineView无法呈现嵌入HTML的PDF

问题描述 投票:3回答:1

我正在为基于MDI的PyQt5应用程序编写Python脚本,其中的Windows使用新的QWebEngineView呈现一些将PDF嵌入iFrame的HTML。 HTML是一个自定义生成的字符串,而PDF是本地文件。

HTML是一个本地存储的模板,我的代码加载该模板,然后更改以插入一个变量:

<!DOCTYPE html>
<html>
  <head>
    <title>Title</title>
  </head>
  <body>
    <iframe src="$PDF">
    </iframe>
  </body>
</html>

$ PDF以字符串形式嵌入,例如:file:///local/path/to/document.pdf

到目前为止是我的Python脚本:

import os, sys
from PyQt5.QtCore import QUrl
from PyQt5.QtWidgets import QApplication, QMainWindow, QMdiArea, QAction, QMdiSubWindow
from PyQt5 import QtWebEngineWidgets

class MDIWindow(QMainWindow):

    def __init__(self):
        super().__init__()

        self.mdi = QMdiArea()
        self.setCentralWidget(self.mdi)
        bar = self.menuBar()
        file = bar.addMenu("File")
        file.addAction("New")
        file.addAction("cascade")
        file.addAction("Tiled")
        file.triggered[QAction].connect(self.Window)
        self.setWindowTitle("MDI Application")

    def Window(self, p):
        if p.text() == "New":
            sub = QMdiSubWindow()
            view = QtWebEngineWidgets.QWebEngineView()
            settings = view.settings()
            settings.setAttribute(QtWebEngineWidgets.QWebEngineSettings.PluginsEnabled, True)
            CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))
            pdf_path = "file://" + os.path.join(CURRENT_DIR, "test.pdf")
            template = os.path.join(CURRENT_DIR, "test.html")
            with open(template, 'rt') as f:
                text = ''.join(f.readlines())
                html = text.replace('$PDF', pdf_path)
            view.setHtml(html, QUrl("file://"))
            sub.setWidget(view)
            sub.setWindowTitle("Test")
            self.mdi.addSubWindow(sub)
            sub.show()

        if p.text() == "cascade":
            self.mdi.cascadeSubWindows()

        if p.text() == "Tiled":
            self.mdi.tileSubWindows()

app = QApplication([])
mdi = MDIWindow()
mdi.show()
app.exec_()

此脚本中的大多数都可以正常工作-它创建主窗口,接收菜单栏命令来创建文档窗口,创建文档窗口并加载HTML。都很好。

问题是嵌入式PDF无法加载。我得到的只是一个灰色的表面。

进一步的观察:

  • 正确插入页面中的任何HTML可视元素。

  • 将资源类型更改为图像(例如PNG)会导致正确呈现资源。只是有问题的PDF。

  • 如果将文件URL更改为其他名称,则会收到有关链接无效的警告。因此,显然正在尝试加载PDF。

  • 实际的PDF无关紧要-我已经尝试了几种不同的PDF,但结果相同。

  • 灰色表面提供了带有重新加载,保存页面和查看源的上下文菜单。重新加载显然确实会导致页面刷新(它会闪烁一会儿),但会产生相同的结果。保存页面和查看源不执行任何操作。

有什么想法吗?预先感谢。

python pdf pyqt5 qtwebengine
1个回答
2
投票

这似乎是Qt WebEngine错误(QTBUG-84340),因为我已经用Qt 5.15(以及PyQt5 5.15和PyQtWebEngine 5.15)实现了代码,并且它不会加载pdf。相反,我已经使用PyQt5 5.14.2进行了测试,并且PyQtWebEngine 5.14.0可以正常工作,因此我建议您安装这些软件包:

python -m pip install pyqt5==5.14.2 pyqtwebengine==5.14.0
© www.soinside.com 2019 - 2024. All rights reserved.