python - 如何在Qprinter pyqt5中打印带有图像的html页面

标签 python pyqt pyqt5 qtwebengine qprinter

我已经使用 html 代码为我的程序生成了一份报告,但它没有在 Qprinter 中显示图像。

def run(self):
    view = QtWebEngineWidgets.QWebEngineView()
    view.setHtml("""<img src="header.jpeg" alt="logo" width="280" height="100">""")
    printer = QPrinter()
    printer.setPaperSize(QtCore.QSizeF(80 ,297), QPrinter.Millimeter)
    try :
        r = QPrintDialog(printer)
        if r.exec_() == QPrintDialog.Accepted:
            view.page().print(printer, self.print_completed)
    except Exception as e :
        print(e)

我想要打印的html代码。 header.jpeg 位于同一目录中。

最佳答案

Qt Webengine 与打印一样异步执行任务,并且由于 View 和打印机是局部变量,因此当同步功能完成时它们将被消除。解决方案是即使在运行结束后也保留这些对象。

没有必要使用QWebEngineView,因为你不会显示任何东西,只显示QWebEnginePage。

另一方面,文档指出外部资源(例如图像)是根据传递第二个参数的 URL 加载的。所以解决办法就是以当前目录为基础传递一个url。

import os
# ...
def run(self):
    current_dir = os.path.dirname(os.path.abspath(__file__))
    self._page = QtWebEngineWidgets.QWebEnginePage()
    self._page.setHtml('''
    ... <img src="header.jpeg" alt="logo" width="280" height="100"> ...
    ''', QtCore.QUrl.fromLocalFile(os.path.join(current_dir, "index.html")))
    self._printer = QtPrintSupport.QPrinter()
    self._printer.setPaperSize(QtCore.QSizeF(80 ,297), QtPrintSupport.QPrinter.Millimeter)
    r = QtPrintSupport.QPrintDialog(self._printer)
    if r.exec_() == QtPrintSupport.QPrintDialog.Accepted:
        self._page.print(self._printer, self.print_completed)

关于python - 如何在Qprinter pyqt5中打印带有图像的html页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54715978/

相关文章:

python - 获取 LinAlgError : Singular matrix Error

python - Matplotlib/Pandas 中条形图的优化

linux - 带有拖放自定义小部件的pyqt linux QListWidget消失了

python - PyQt - 如何检查 QDialog 是否可见?

python - 向 PyQt5 中的 Thread 函数发送信号导致装饰槽的 TypeError

python - Python登录系统

Python:将numpy数组(int)写入二进制文件而不进行填充

python - 如何在 PyQt5 GUI 中显示 Folium map ?

python - PySide2 QWizard 非线性页面

python - PyQt5 keyPressEvent 的工作原理