Richtige Weg, um fügen Sie ein Bild-Datei in ein PDF-Dokument generiert, mit Reportlab auf AppEngine Python
Ich versuche das generieren eines PDF-Berichts mit reportlab auf App Engine Python.
Aber ich weiß nicht wie man ein Bild Anhängen richtig.
Das Bild ist statisch.
Dies ist die Verzeichnisstruktur, die von meinem Projekt.
und das ist, was ich Tue (inside " chipas.py'), um das image:
im = Image('../static/logo.png',1*inch, 1*inch)
story.append(im)
...
Den stack-trace, den ich bekommen:
Traceback (most recent call last): File
"C:\Users\Lucas\Dropbox\Desarrollo\Python\windows\AppEngine\google\appengine\ext\webapp_webapp25.py",
Linie 701, die in nennen
handler.bekommen (*- Gruppen) - Datei "C:\Users\Lucas\Dropbox\Desarrollo\workspace\python\chipas-windows\src\chipas.py",
Zeile 1035, bekommen
doc.build(story) Datei "C:\Users\Lucas\Dropbox\Desarrollo\workspace\python\chipas-windows\src\reportlab\platypus\doctemplate.py",
line 1117, in bauen
BaseDocTemplate.build(self,flowables, canvasmaker=canvasmaker-Datei)
"C:\Users\Lucas\Dropbox\Desarrollo\workspace\python\chipas-windows\src\reportlab\platypus\doctemplate.py",
Linie 880, in bauen
selbst.handle_flowable(flowables) Datei "C:\Users\Lucas\Dropbox\Desarrollo\workspace\python\chipas-windows\src\reportlab\platypus\doctemplate.py",
Linie 763, in handle_flowable
wenn Rahmen.add(f, canv, trySplit=selbst.allowSplitting): File "C:\Users\Lucas\Dropbox\Desarrollo\workspace\python\chipas-windows\src\reportlab\platypus\frames.py",
line 159, in _add
w, h = fließfähigen.wrap(aW, h) - Datei "C:\Users\Lucas\Dropbox\Desarrollo\workspace\python\chipas-windows\src\reportlab\platypus\flowables.py",
line 408, in Verpackung
return self.drawWidth, selbst.drawHeight Datei "C:\Users\Lucas\Dropbox\Desarrollo\workspace\python\chipas-windows\src\reportlab\platypus\flowables.py",
line 402, in getattr
selbst._setup_inner() Datei "C:\Users\Lucas\Dropbox\Desarrollo\workspace\python\chipas-windows\src\reportlab\platypus\flowables.py",
Zeile 368, in _setup_inner
img = self._img-Datei "C:\Users\Lucas\Dropbox\Desarrollo\workspace\python\chipas-windows\src\reportlab\platypus\flowables.py",
line 398, in getattr
selbst._img = ImageReader(selbst._file) - Datei "C:\Users\Lucas\Dropbox\Desarrollo\workspace\python\chipas-windows\src\reportlab\lib\utils.py",
line 541, in init
wenn _isPILImage(fileName): File "C:\Users\Lucas\Dropbox\Desarrollo\workspace\python\chipas-windows\src\reportlab\lib\utils.py",
line 521, in _isPILImage
return isinstance(im,Bild.Bild) AttributeError: 'NoneType' - Objekt hat kein Attribut 'Image' INFO 2012-02-29 19:54:37,276
dev_appserver.py:4247] "GET
/pdf-Datei?pedido=ahVkZXZ-Y2hpcGFzLWludGhlY2xvdWRyLwsSBlBlzglkbyijmjaxmi0wmi0yosaxoto1ndoxohrlc3razxhhbxbszs5jb20m
HTTP/1.1" 500 -
Was ist der richtige Weg, um fügen Sie ein Bild-Datei in ein pdf-Dokument generiert, mit reportlab?
Vielen Dank im Voraus!
InformationsquelleAutor Lucas | 2012-02-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
ReportLab erfordert PIL für andere Bilder als JPEG (PIL ist nicht verfügbar auf Appengine-Produktion), aber es unterstützt JPEG-nativ (siehe Hinweis unten). So müssen Sie ReportLab mit JPEG-Bildern beim Rendern von PDF-Dateien. Mit Benutzer-eingereichte Bilder, die ich zunächst mit Appengine-API zum transformieren Sie das Bild in JPEG vor dem Rendern.
Also Schritt 1 ist die änderung des Logos von png zu jpeg.
Zweitens, Appengine können Sie nicht Lesen von Dateien von einem statischen Verzeichnis. Es gibt eine "Datei nicht Zugegriffen werden" Fehlermeldung, wenn Sie versuchen. Schalten Sie die .jpg in einem anderen Verzeichnis als /static/.
Also egal welche Methode Sie verwenden, definieren Sie den relativen Pfad zu der Datei (gfortune code funktioniert perfekt für diese), die für das Rendern des Bildes, verwenden Sie einfach:
f = open(Dateipfad, 'rb')
Geschichte.append( Bild(f) )
Hinweis: vor Einigen Jahren, ReportLab hatte einen bug wo es immer noch versuchen, auf PIL auch JPEG-Dateien. Ich korrespondierte mit den Entwicklern, die ein build, der umgangen PIL für JPEG-Dateien. Ich bin mir nicht sicher, welcher build ist der aktuelle build, also behalte das im Hinterkopf.
Das erste argument für path_relative_to_file() sollte "_ Datei _"(zwei Unterstriche) und nicht als "Datei". Außer, dass ich mir nicht sicher bin, was anderes zu schlagen, um zu definieren, den Pfad richtig in Ihre situation. Aber das Problem in dieser Phase ist das einbinden in die Datei anstatt zu Rendern.
Ja, schrieb ich es mit den zwei Unterstriche, aber immer noch kann nicht umhin, die 'Datei nicht Zugegriffen werden" - Fehler =( trotzdem Danke John.
Ich weiß nicht, ob dies ein richtiger Weg, der auf die Datei zugreift, aber dies zu tun: im = open(os.Pfad.dirname ("- Datei(zwei Unterstriche)")+'/archivos/logo.jpg','rb') Geschichte.append(Bild(im)) bekomme ich diese Fehlermeldung: ImportError: Die _imaging C-Modul ist nicht installiert
Sieht aus wie Sie sind, bekommen Sie die Datei und öffnen Sie es. Die Fehler, die Sie bekommen, ist ReportLab zu öffnen versuchen, PIL. Aber wie ich in meinem ursprünglichen Beitrag erwähnt, einige frühere Versionen von ReportLab attemoted, um nicht unnötig Last PIL für JPEG-Dateien; später baut nicht. Es könnte sein, lohnt sich das herunterladen der trunk-build aus dem repository zu gewährleisten, haben Sie die neueste version: svn.reportlab.com/svn/public/reportlab/trunk
InformationsquelleAutor johnP
Main Lösung
Es sieht aus wie der original-error für diesen Beitrag ist aufgrund PIL vielleicht nicht installiert oder vielleicht ein bug in einer alten version von PIL. Sehen http://www.openerp.com/forum/topic18147.html für eine ähnliche situation. Installieren Sie eine aktuelle version von PIL.
Finden Sie auch unter Appengine - Reportlab (Get-Foto vom Modell) gegen Ende des akzeptierten Lösung und die Kommentare.
Ein weiteres potenzielles problem in den code geschrieben
Obwohl dies möglicherweise nicht direkt im Zusammenhang mit der Frage, sind Sie sicher, dass
im
richtig geladen? Beachten Sie, dass der Pfad, den Sie eingerichtet haben, ist relativ zu dem Verzeichnis, von wo aus die app gestartet wurde, anstatt relativ zur aktuellen Datei. Verwenden__file__
und einigeos.path
Tricks, um den Pfad relativ zuchipas.py
unter der Annahme, dass ist das problem. Wenn es nicht das problem, das Sie zu tun haben jetzt, es ist sicherlich eines, dass man in Kürze.Verweisen auf ein Pfad relativ zum Verzeichnis der aktuellen Datei, die Sie verwenden würden, so etwas wie:
Code
Ausgabe
Beachten Sie, dass der Pfad auf '../static' funktioniert, obwohl ich startete das Programm aus /var/log. Beachten Sie auch, dass blind mit ../static mit abspath Pausen, wenn Sie Sie ausführen aus /var/log.
Können Sie die Funktion wie eine kleine helper-Funktion indem Sie es
__file__
aus dem Modul in Frage oder Sie können einfach verwenden Sie die Logik aus es direkt inchipas.py
Sicherlich, ich werde aktualisieren Sie die Antwort. Haben Sie
im
um zu sehen, ob es richtig geladen?gfortune ich tun logging.info(im) und es druckt: <reportlab.platypus.flowables.Bild Beispiel bei 0x042CFC88>
Ja, das ist bedauerlich. Ich warf einen Blick auf reportlab-code und die Image-Klasse nicht geben Ihnen jede vernünftige Möglichkeit zu sagen, wenn es ordnungsgemäß geladen wurde oder nicht. Sollte etwas nicht passen in deinem code. Bitte aktualisieren Sie die original-Beitrag mit der vollen Traceback und einen größeren Teil Ihres Anwendung Codes (insbesondere in Bezug auf
Image
)danke für die Hilfe gfortune... ich veröffentlicht den vollständigen stacktrace und ich kann nach der ganzen Methode, wenn Sie wollen, aber die sind alle code-Zeilen im Zusammenhang mit Bild.
InformationsquelleAutor gfortune
Gibt es 2 Möglichkeiten, wie dies getan werden könnte.
, Wenn Sie gerade arbeiten mit einem canvas:
ODER wenn Sie mit Schnabeltier und flowables
(Antwort entnommen aus: http://www.tylerlesmann.com/2009/jan/28/writing-pdfs-python-adding-images/)
InformationsquelleAutor Francis Yaconiello
Versuchen Sie, diese einfache Funktion:
Dieser Arbeitete Für mich....
und Rufen Sie es von Ihrem URLs
InformationsquelleAutor Javed