如何在PyQt5中将HTML页面保存为PDF

时间:2018-01-26 00:26:01

标签: python html pdf pyqt5 qwebengineview

我正在尝试使用PyQt5将一些简单的html保存到pdf文档中。 网页渲染正确,使用show()命令我可以得到一个窗口向我显示有问题的网页内容,但是尝试将其打印为pdf只会产生空白的PDF格式。

这是在python 3.6上,截至发布此问题,我有当前的PyQt5版本。 (Windows 10,64位)

在stackoverflow上已经存在很多旧的问题,但我发现其中大多数都使用不再存在的函数。

有问题的代码如下:

from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEngineSettings
from PyQt5 import QtWidgets
from PyQt5.QtPrintSupport import QPrinter
from PyQt5 import QtCore
[...]
    app = QtWidgets.QApplication(sys.argv)
    QWebEngineSettings.globalSettings().setAttribute(QWebEngineSettings.PluginsEnabled, True)
    QWebEngineSettings.globalSettings().setAttribute(QWebEngineSettings.ScreenCaptureEnabled, True)
    loader = QWebEngineView()
    #loader.setAttribute(QtCore.Qt.WA_DontShowOnScreen, True)
    loader.setAttribute(QtCore.Qt.WA_DeleteOnClose, True)
    loader.setZoomFactor(1)
    loader.setHtml(webpage)


    printer = QPrinter()
    printer.setPageSize(QPrinter.A4)
    printer.setOutputFormat(QPrinter.PdfFormat)
    printer.setOutputFileName("test.pdf")
    printer.setOrientation(QPrinter.Portrait)
    printer.setFullPage(True)

    def emit_pdf(finished):
        loader.show()
        loader.render(printer)
        if self.open_on_complete:
            import webbrowser
            webbrowser.open("test.pdf")

        #app.exit()
    loader.loadFinished.connect(emit_pdf)

    app.exec()

1 个答案:

答案 0 :(得分:2)

Qt5中无需使用QPrinter,因为QWebEnginePage有专门的printToPdf方法:

import sys
from PyQt5 import QtCore, QtWidgets, QtWebEngineWidgets

app = QtWidgets.QApplication(sys.argv)
loader = QtWebEngineWidgets.QWebEngineView()
loader.setZoomFactor(1)
loader.page().pdfPrintingFinished.connect(
    lambda *args: print('finished:', args))
loader.load(QtCore.QUrl('https://en.wikipedia.org/wiki/Main_Page'))

def emit_pdf(finished):
    loader.show()
    loader.page().printToPdf("test.pdf")

loader.loadFinished.connect(emit_pdf)

app.exec()

如果您真的需要,还会有一个print方法呈现给打印机。