Einfügen eines Bildes in Reportlab entweder aus PIL-Bild oder StringIO
Ich versuche, fügen Sie ein barcode-Bild in Reportlab. Ich weiß, es gibt eine Menge von Fragen auf, aber alle gehen davon ausdass Sie bereits die image-Datei in das Verzeichnis oder in das Dateisystem.
Aufgrund der Tatsache, dass Reportlab hat Probleme mit EAN13 barcodes, entschied ich mich für ein anderes Paket namens pyBarcode um das Bild zu erzeugen für mich.
Zunächst habe ich das Bild gespeichert in einem StringIO-Instanz und übergeben es direkt an reportlab.platypus.flowables.Image
aber das schien nicht zu arbeiten. Dann lese ich die Dokumentation:
Formate unterstützt PIL/Java 1.4 (Python/Java Imaging Library) unterstützt werden.
Bedeutet dies, dass, wenn ich vorbeigehe, ein PIL-image, sollte dies funktionieren? Ich habe eine Ausnahme, wenn ich habe versucht, die folgenden:
>>> import PIL
>>> from reportlab.platypus.flowables import Image
>>> fp = StringIO(the_barcode.getvalue())
>>> barcode_image = PIL.Image.open(fp)
>>> doc = SimpleDocTemplate('barcode.pdf')
>>> story = [Image(barcode_image)]
>>> Traceback (most recent call last):
File "create.py", line 57, in <module>
main()
File "create.py", line 24, in main
save_pdf(fp, STYLE, ART, COLOR, SIZE)
File "create.py", line 28, in save_pdf
fp = StringIO(fp.getvalue())
File "/home/mark/.virtualenvs/barcode/local/lib/python2.7/site-packages/reportlab-2.6-py2.7-linux-i686.egg/reportlab/platypus/flowables.py", line 402, in __init__
if not fp and os.path.splitext(filename)[1] in ['.jpg', '.JPG', '.jpeg', '.JPEG']:
File "/home/mark/.virtualenvs/barcode/lib/python2.7/posixpath.py", line 95, in splitext
return genericpath._splitext(p, sep, altsep, extsep)
File "/home/mark/.virtualenvs/barcode/lib/python2.7/genericpath.py", line 91, in _splitext
sepIndex = p.rfind(sep)
File "/home/mark/.virtualenvs/barcode/local/lib/python2.7/site-packages/PIL/Image.py", line 512, in __getattr__
raise AttributeError(name)
AttributeError: rfind
Irgendwie PIL Bild scheint nicht zu funktionieren. Was soll ich übergeben Sie als erstes argument für Reportlab - Bild Funktion, wenn ich nicht den Dateinamen von dem Bild (da meine Bilder sind im Speicher erstellt)?
InformationsquelleAutor der Frage Mark | 2012-12-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die sich wiederholende Erklärung "unterstützte Formate von PIL/Java 1.4 (Python/Java Imaging Library) unterstützt" bedeutet lediglich, dass Daten-Formate
PIL
unterstütztreportlab
(seit es nutztPIL
Sie zu Lesen).Nun, aus spähen in
reportlab.platypus.flowables.Image
code ist es möglich zu sehen, dass Sie akzeptiert entweder einen Dateinamen oder ein file-Objekt als Eingabe. Die ehemalige ist nicht, was Sie wollen, also konzentrieren wir uns lieber auf später. Sie sagteStringIO
schien nicht zu funktionieren, aber es funktioniert, wenn Sie nehmen einige Sorgfalt. Hast du wahrscheinlich etwas falsch mit ihm, hier sind zwei richtige Möglichkeiten nutzen, umStringIO
:Die Methode 3 versagt, weil
img3
hält nun die raw-Daten des Bildes, so dass es hat keine Ahnung über das tatsächliche format der Daten. Es gibt keinen Grund, zu versuchen, verwenden Sie diese Methode für eine solche Aufgabe.Wenn Sie raw-Daten, und Sie wissen das-Bild-Modus, Ihre Daten ('L', 'RGB', etc.) und auch die Breite, Höhe, dann können Sie einen vierten (richtige) Methode, basierend auf
PIL.Image.fromstring(...).save(mystrio, 'someformat')
.InformationsquelleAutor der Antwort mmgp
Hatte ich kein Glück mit den vorgeschlagenen Methoden.
Überprüfen Sie den code in pdfdoc.py zeigt, dass die AttributError Ergebnisse aus der Behandlung der StringIO als mit dem Namen:
Weitere Prüfung der Quelle, die zeigt, dass jpeg_fh ist ein Attribut der Klasse ImageReader in reportlab.lib.utils. ImageReader akzeptiert sowohl StringIO und PIL Bilder.
Also das einwickeln der StringIO in einem ImageReader das problem bei mir gelöst:
InformationsquelleAutor der Antwort wolfmanx
Ich glaube, dass das, was die PIL docs sagen möchte, ist, dass es mit PIL intern zur Verarbeitung der Bilddaten.
Was ich sehe, in den source-code, können Sie ein file-Objekt direkt, also etwas, was mit einem
read()
Methode:https://github.com/ejucovy/reportlab/blob/master/src/reportlab/platypus/flowables.py#L314
Ich denke, dass Sie irgendwie wickeln Sie die raw-Bild-Daten in einer Datei-ähnlichen Objekts (StringIO oder so).
EDIT: ich denke, das ist, was du vorher gemacht hast, sorry. Jedenfalls scheint es der richtige Weg. Vielleicht, wenn Sie uns sagen, was das problem in diesem Fall, wir werde in der Lage sein, um es zu klären.
InformationsquelleAutor der Antwort ubik