python - 如何使用 PyQt5 将本地 html 文件转换为 pdf?
问题描述
我曾尝试使用 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()
但是,我不太确定如何使其适应本地保存的 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")
推荐阅读
- excel - Excel - 使用标准计算数字字符串的出现次数
- python - SKLearn 使用新数据进行预测
- java - Java:声纳强制构造函数
- rust - 读或写一个完整的 32 位字,即使我们只引用它的一部分,是否会导致未定义的行为?
- python - Selenium Python 动作链在 Firefox 上失败
- java - Spring RestTemplate:在配置类中设置时覆盖 ResponseErrorHandler 不起作用
- java - 无法实现 RecycleAdapter 到自定义 ArrayList 以获取数据库上的随机查询结果
- java - 单击按钮时JavaFX布局移动
- python - 在用于 python 的 c++ 包装器中使用 JNI_CreateJavaVM 的段错误
- javascript - 如何 .search() 多个字符串并至少有 1 个才能执行功能?