我正在编写一个使用通用模板的程序,该模板已从PDF转换为HTML,以创建针对个人的个性化报告。为了将最终的HTML文件转换回PDF,我使用了PyQT5及其printToPdf方法。它可以正常运行一次,但是程序会挂起,直到我关闭打开的小部件视图为止,这时它会进行段错误并结束整个python程序。如何以编程方式和平关闭程序,以便一次扫描即可呈现所有HTML?也许有某种方法可以不将线程放弃给小部件?
这是我当前的代码。
for htmlFileAsString in files:
app = QtWidgets.QApplication(sys.argv)
loader = QtWebEngineWidgets.QWebEngineView()
loader.setZoomFactor(1)
loader.setHtml(htmlFileAsString)
loader.page().pdfPrintingFinished.connect(
lambda *args: print('finished:', args))
def emit_pdf(finished):
loader.show()
loader.page().printToPdf('output/' + name + '/1.pdf')
loader.loadFinished.connect(emit_pdf)
app.exec()
import os
from PyQt5 import QtWidgets, QtWebEngineWidgets
class PdfPage(QtWebEngineWidgets.QWebEnginePage):
def __init__(self):
super().__init__()
self._htmls_and_paths = []
self._current_path = ""
self.setZoomFactor(1)
self.loadFinished.connect(self._handleLoadFinished)
self.pdfPrintingFinished.connect(self._handlePrintingFinished)
def convert(self, htmls, paths):
self._htmls_and_paths = iter(zip(htmls, paths))
self._fetchNext()
def _fetchNext(self):
try:
self._current_path, path = next(self._htmls_and_paths)
except StopIteration:
return False
else:
self.setHtml(html)
return True
def _handleLoadFinished(self, ok):
if ok:
self.printToPdf(self._current_path)
def _handlePrintingFinished(self, filePath, success):
print("finished:", filePath, success)
if not self._fetchNext():
QtWidgets.QApplication.quit()
if __name__ == "__main__":
current_dir = os.path.dirname(os.path.realpath(__file__))
paths = []
htmls = []
for i in range(10):
html = """<html>
<header><title>This is title</title></header>
<body>
Hello world-{i}
</body>
</html>""".format(
i=i
)
htmls.append(html)
paths.append(os.path.join(current_dir, "{}.pdf".format(i)))
app = QtWidgets.QApplication([])
page = PdfPage()
page.convert(htmls, paths)
app.exec_()
print("finished")