如何循环PyQt5函数以将url列表打印到pdf?

2024-09-29 08:18:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个列表,其中包含许多字符串格式的URL

url_list=['www.url1.com', 'www.url2.com', 'www.url3.com', 'www.url4.com']

我可以将URL单独打印为pdf格式,但我想知道如何在URL列表中循环并重复该过程。我尝试过使用for循环,但它不起作用

import sys
from PyQt5 import QtWidgets, QtWebEngineWidgets
from PyQt5.QtCore import QUrl
from PyQt5.QtGui import QPageLayout, QPageSize
from PyQt5.QtWidgets import QApplication

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    loader = QtWebEngineWidgets.QWebEngineView()
    loader.setZoomFactor(1)
    layout = QPageLayout()
    layout.setPageSize(QPageSize(QPageSize.A4Extra))
    layout.setOrientation(QPageLayout.Portrait)
    loader.load(QUrl(url_list[0]))
    loader.page().pdfPrintingFinished.connect(lambda *args: QApplication.exit())

    def emit_pdf(finished):
        loader.page().printToPdf(f"{number}_url_file.pdf", pageLayout=layout)

    loader.loadFinished.connect(emit_pdf)
    sys.exit(app.exec_())

Tags: fromimportcomurlpdfwwwsysloader
1条回答
网友
1楼 · 发布于 2024-09-29 08:18:57

必须实现按顺序执行打印的逻辑,即在打印第N页后,开始打印第N+1页

from collections import deque
from functools import cached_property

from PyQt5.QtCore import QCoreApplication, QObject, QUrl
from PyQt5.QtGui import QPageLayout, QPageSize
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWebEngineWidgets import QWebEnginePage


class PrintManager(QObject):
    def __init__(self, qtargs=None, parent=None):
        super().__init__(parent=parent)
        self.app = QApplication(qtargs or [])

    @cached_property
    def page(self):
        page = QWebEnginePage()
        page.pdfPrintingFinished.connect(self.handle_print_finished)
        page.loadFinished.connect(self.handle_load_finished)
        return page

    @cached_property
    def queue(self):
        return deque()

    def append(self, url, filename):
        self.queue.append((QUrl.fromUserInput(url), filename))

    def start(self):
        self._start()
        QCoreApplication.instance().exec_()

    def _start(self):
        try:
            url, filename = self.queue.popleft()
        except IndexError:
            QCoreApplication.quit()
        else:
            self.page.setProperty("filename", filename)
            self.page.load(url)

    def handle_load_finished(self, ok):
        if ok:
            filename = self.page.property("filename")
            layout = QPageLayout()
            layout.setPageSize(QPageSize(QPageSize.A4Extra))
            layout.setOrientation(QPageLayout.Portrait)
            self.page.printToPdf(filename, pageLayout=layout)
        else:
            print("failed")
            self._start()

    def handle_print_finished(self):
        self._start()


def main():
    print_manager = PrintManager()
    data = [
        ("https://stackoverflow.com/questions/67837489", "67837489.pdf"),
        ("https://stackoverflow.com/questions/59274653", "59274653.pdf"),
    ]
    for url, filename in data:
        print_manager.append(url, filename)
    print_manager.start()


if __name__ == "__main__":
    main()

相关问题 更多 >