2016-04-07 6 views
0

Ich habe versucht, eine Möglichkeit zu finden, eine Liste von URLs mit Python 2.7 in PDF zu konvertieren, dachte ich, das wäre einfach, aber nach ein paar Tagen bin ich nicht weiter auf. Der folgende Code funktioniert nur für eine URL.Python-Code zum Konvertieren von URLs von der Liste in PDF

import sys 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
from PyQt4.QtWebKit import * 

app = QApplication(sys.argv) 

web = QWebView() 
web.load(QUrl("http://www.google.com")) 
#web.show() 

printer = QPrinter() 
printer.setPageSize(QPrinter.A4) 
printer.setOutputFormat(QPrinter.PdfFormat) 
printer.setOutputFileName("file.pdf") 

def convertIt(): 
    web.print_(printer) 
    print "Pdf generated" 
    QApplication.exit() 

QObject.connect(web, SIGNAL("loadFinished(bool)"), convertIt) 

sys.exit(app.exec_()) 

Also für Leichtigkeit habe ich eine Textdatei von nur 3 URLs für die Liste und lief dann in eine Schleife durch den Code für jede URL, aber das funktioniert nicht. Ich habe verschiedene Möglichkeiten ausprobiert, kann aber den Code nicht erfolgreich in einer Schleife ausführen. Ich habe verschiedene Ausgaben verwaltet, wie zB nur ein vollständiges PDF oder 3 verschiedene leere PDFs.

import sys 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
from PyQt4.QtWebKit import * 

with open ('testurl.txt', 'r') as f1: 
    for line in f1: 
     app = QApplication(sys.argv) 

     web = QWebView() 
     web.load(QUrl(line)) 
     #web.show() 
     printer = QPrinter() 
     printer.setPageSize(QPrinter.A4) 
     printer.setOutputFormat(QPrinter.PdfFormat) 
     printer.setOutputFileName('one.pdf') 

     def convertIt(): 
      web.print_(printer) 
      print "Pdf generated" 
      QApplication.exit() 

     QObject.connect(web, SIGNAL("loadFinished(bool)"), convertIt) 
     sys.exit(app.exec_()) 

Wenn ich die sys, Ausfahrt Zeile im Skript verlassen endet nach dem ersten pdf gespeichert wird, wenn ich es aus erhalte ich: -

QWidget: Must construct a QApplication before a QPaintDevice 

Process finished with exit code 1 

id bevorzugen diesen Code zu verwenden, wenn möglich als es sieht einfach genug aus und ich beabsichtige, es in einer Qt-basierten GUI-App zu verwenden, wenn ich es in einer Schleife arbeiten lassen kann. Es sieht so aus, als sollte es sehr einfach sein, es in einer Schleife zu funktionieren, aber es ist nicht für mich ..

Antwort

1

Normalerweise gibt es nur eine einzige QApplication während der Lebensdauer des Programms, anstatt sie zu erstellen und zu zerstören. Für diesen Job kann das gleiche auf das WebView und den Drucker angewendet werden, wobei letzterer nur den Ausgabedateinamen zwischen Druckaufrufen aktualisieren muss.

Im Folgenden finden Sie eine Beispielversion, die die Dateinamen in eine Liste lädt und beginnt, Ladevorgänge innerhalb von QTimer Einzelaufnahmen zu planen und darauf zu warten, dass das Signal für den Ladevorgang erneut gedruckt und geplant wird. Nur wenn die Liste leer ist, wird das Signal finished() ausgegeben.

import sys 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
from PyQt4.QtWebKit import * 

class PdfConverter(QObject): 

    finished = pyqtSignal() 

    def __init__(self): 
     QObject.__init__(self) 
     self.web = QWebView() 
     self.printer = QPrinter() 
     self.printer.setPageSize(QPrinter.A4) 
     self.printer.setOutputFormat(QPrinter.PdfFormat) 
     self.urls = [] 
     self.idx = -1 
     QObject.connect(self.web, SIGNAL("loadFinished(bool)"), self.convertIt) 

    def load_stuff(self): 
     with open('testurl.txt', 'r') as f1: 
      self.urls = list(enumerate(f1.readlines())) 
     self.schedule_job() 

    def schedule_job(self): 
     if not self.urls: 
      self.finished.emit() 
      return 

     self.idx, self.newurl = self.urls.pop(0) 
     self.newurl = self.newurl.strip() 
     print "Loading %s" % self.newurl 
     self.web.load(QUrl(self.newurl)) 

    def convertIt(self, ok): 
     if not ok: 
      print "Failed to load %s" % self.newurl 
     else: 
      print "Converting %s" % self.newurl 
      self.printer.setOutputFileName("%d.pdf" % self.idx) 
      self.web.print_(self.printer) 

     QTimer.singleShot(0, self.schedule_job) 

def bye(): 
    QApplication.exit() 

if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    converter = PdfConverter() 
    QTimer.singleShot(0, converter.load_stuff) 
    converter.finished.connect(bye) 
    app.exec_() 
+0

Ich bin ein Neuling in Python so vergib mir, wenn ich falsch bin, aber es scheint mir, dass Sie das gleiche Problem haben wie ich hatte, zog es einfach irgendwo anders ... es ist das gleiche Problem wie mit Der 'sys.exit', Ihr Code scheint gut zu funktionieren, aber er ist nicht verwendbar, da ich ihn nicht als Modul importieren kann. Wenn ich versuche, ihn zu importieren, wird der Code ausgeführt, sobald er importiert wird (vor der texturl, txt Datei) erstellt werden) aufgrund des fehlenden 'if __name__ == "__main__":'. Wenn ich das 'if __name__' hinzufüge, läuft es überhaupt nicht. Und aus den gleichen Gründen wie oben kann ich es nicht in ein pyqt4-GUI-Skript integrieren. – Stevo

+0

Oh, es funktioniert nicht, weil ich es wie ein einziges Skript gehandhabt habe, sorry, aber neben dem if/main, was dir aufgefallen ist, ist die andere Änderung irgendwie unkompliziert. Sie könnten, sagen wir, ein "fertiges" Signal ausgeben, anstatt "QApplication.exit" aufzurufen, wenn keine weiteren Jobs geplant sind. –

+0

Sorry für die Verzögerung, es tut was ich fragte, aber es scheint nicht mein Problem vollständig gelöst. – Stevo

Verwandte Themen