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

How to save an HTML page to PDF in PyQt5

我正在尝试使用 PyQt5 将一些简单的 html 保存到 pdf 文档中。 网页正确呈现,使用 show() 命令我可以获得 window 显示有问题的 Web 内容,但是尝试将其打印为 pdf 只会导致空白 pdf。

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

Whosebug 上已经有很多关于此的旧问题,但我发现其中大部分使用的函数已不复存在。

有问题的代码如下:

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()

Qt5中不需要使用useQPrinter,因为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 方法可以呈现给打印机,如果您确实需要的话。