如何使用PyQT5在一个循环中将多个HTML文档转换为PDF

问题描述 投票:0回答:1

我正在编写一个使用通用模板的程序,该模板已从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()
python html pdf pyqt pyqt5
1个回答
0
投票
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")
© www.soinside.com 2019 - 2024. All rights reserved.