python - QWebEngineView 无法呈现嵌入在 HTML 中的 PDF

标签 python pdf pyqt5 qtwebengine

我正在为基于 MDI 的 PyQt5 应用程序编写 Python 脚本,其中窗口使用新的 QWebEngineView 来呈现一些在 iFrame 中嵌入 PDF 的 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 并不重要 - 我已经尝试了几种不同的结果相同的结果。
  • 灰色表面提供了一个包含重新加载、保存页面和查看源代码的上下文菜单。重新加载显然确实会导致页面刷新(它闪烁片刻)但会产生相同的结果。保存页面和查看源代码什么都不做。

  • 有任何想法吗?提前致谢。

    最佳答案

    这似乎是一个 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
    

    关于python - QWebEngineView 无法呈现嵌入在 HTML 中的 PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62226152/

    相关文章:

    python - 根据 pandas 数据框中的相邻列将 NaN 值替换为特定文本

    python - 需要帮助在 Windows 上安装 geoDjango

    php - 用 PHP 在 PDF 模板文档上书写/绘图

    python - PyQt5-Python | QApplication.setStyle 不起作用

    python - 使用语言模型进行术语加权

    python - Tensorflow安装与anaconda安装和运行问题

    ImageMagick 错误 : Convert PDF to Images

    c# - 如何在 ASP.NET 中的特定时间运行代码

    python - PyQt5 unicode 翻译 : pylupdate5 outputs escape sequences

    python - PyQt5:如何将 QPushButton 连接到插槽?