Ray*_*234 3 python pyqt python-3.x pyqt5
我尝试过使用 wkhtml 和 weasyprint 库,但所有这些都会呈现空白的 pdf 页面。唯一有效的选择是 pdfcrowd,但这是一个付费图书馆。我发现了使用 PyQt 转换网页的几个选项:
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()
Run Code Online (Sandbox Code Playgroud)
但是,我不太确定如何使其适应本地保存的 html 文件。
您必须使用 QUrl.fromLocalFile() 将文件路径作为 url 传递,也不必创建 QWebEngineView,而只需使用 QWebEnginePage:
import os
import sys
from PyQt5 import QtCore, QtWidgets, QtWebEngineWidgets
def html_to_pdf(html, pdf):
app = QtWidgets.QApplication(sys.argv)
page = QtWebEngineWidgets.QWebEnginePage()
def handle_print_finished(filename, status):
print("finished", filename, status)
QtWidgets.QApplication.quit()
def handle_load_finished(status):
if status:
page.printToPdf(pdf)
else:
print("Failed")
QtWidgets.QApplication.quit()
page.pdfPrintingFinished.connect(handle_print_finished)
page.loadFinished.connect(handle_load_finished)
page.load(QtCore.QUrl.fromLocalFile(html))
app.exec_()
if __name__ == "__main__":
CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))
filename = os.path.join(CURRENT_DIR, "index.html")
print(filename)
html_to_pdf(filename, "test.pdf")
Run Code Online (Sandbox Code Playgroud)