Bilder zeichnen mit canvas und verwenden SimpleDocTemplate
Schreibe ich PDF-Dokumente mit reportlab innerhalb eines django view, Sie sind sehr einfach, die Kopfzeile, Inhalt und Fußzeile.
Ich bin mit SimpleDocTemplate wich, passt sehr gut zum zeichnen von Tabellen in den Inhalt, den footer und der header sind drwan mit:
build([data], onFirstPage=drawPageFrame, onLaterPages=drawPageFrame).
Meine Frage ist, Wie kann ich zeichnen Sie ein Bild, wie mit der Leinwand.drawImage(...)? Ich brauche eine "schwimmende" Bild... Position über dem text, wo ich will, und mit SimpleDocTemplate ich nicht über ein Canvas-Objekt, dies zu tun.
Suche habe ich dies gefunden:
Das Schnabeltier layout-Sachen verwendet flowables. Packer in der Regel setzen die
Attribut canv auf jeder fließfähigen, wenn es ist, eingewickelt, split oder
gezeichnet, dh um die wrap -, split-und draw-Methoden. Innerhalb dieser Methoden
Sie haben Zugriff auf den canvas-Bereich mithilfe der canv Attribut self.
Wie können diese genutzt werden?
Hmmm, mehr Sachen zu testen:
flowables.Macro
flowables.CallerMacro
# -*- coding: utf-8 -*- from reportlab.lib.pagesizes import-A4, Querformat, Porträt from reportlab.lib.Stile importieren getSampleStyleSheet from reportlab.platypus import-Tabelle, Fließfähigen, SimpleDocTemplate -, Absatz -, Abstands -, Bild - from reportlab.lib import randomtext von reportlab import Schnabeltier import os,random styles = getSampleStyleSheet() path = os.Pfad.realpath(os.Pfad.dirname(__file__)) def drawPageFrame(Leinwand, doc): canvas.saveState() canvas.drawImage(Pfad+"/ujiPDF.jpg",50,50,57,57) canvas.restoreState() doc = SimpleDocTemplate("salida.pdf",pagesize=A4) Elemente = [] com = 'Leinwand.drawImage("'+Pfad+'/ujiPDF.jpg",100,100,57,57)' print com Elemente.append(Schnabeltier.flowables.Makro('Leinwand.saveState()')) drucken Schnabeltier.flowables.Makro(com) Elemente.append(Schnabeltier.flowables.Makro - (com -)) Elemente.append(Schnabeltier.flowables.Makro('Leinwand.restoreState()')) ABS = Absatz(randomtext.randomText(randomtext.PYTHON,20), styles["Normal"]) Elemente.append(ABS) doc.Aufbau(Elemente,onFirstPage=drawPageFrame, onLaterPages=drawPageFrame)
Dies ist der Makro-Ansatz...sauber beenden, aber ohne das zweite Bild.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre beste option ist die Erstellung einer Unterklasse von SimpleDocTemplate oder BaseDocTemplate. In der build-Methode haben Sie Zugriff auf die Leinwand. Wenn Sie möchten, Tippen Sie auf in alles, SimpleDocTemplate hat, können Sie versuchen, kopieren Sie direkt von
site-packages/reportlab/platypus/doctemplate.py
.Brauchen Sie nicht, um eine Unterklasse das gesamte Dokument Vorlage, wenn ich verstehe Sie richtig, Sie wollen einfach nur eine fließfähige, dass Sie IN eine SimpleDocTemplate. Sie können erreichen, dass Sie mit einer sehr einfachen Unterklasse von Fließfähigen selbst.
-> insbesondere, da die Menschen oft Fragen, wie man matplotlib Objekte in reportlab, ich werde zeigen, wie generieren Sie einen plot mit matplotlib und dann die geänderte fließfähige zu setzen, die Handlung in eine SimpleDocTemplate (ohne speichern die Datei auf der Festplatte). Das Konzept gilt für jede Datei oder alles, was Sie können Feeds in eine cStringIO
-> Das unten können Sie die Figur über den text (änderung der Höhe vom negativen ins positive zu schieben Sie es über die imaginäre Linie an der Spitze des Abschnitts, der plot geht in)
Der Schlüssel Konzept ist, dass jedes Fließfähige tut, selbst, enthalten auch eine Leinwand können wir zeichnen auf.
HTML:
Können Sie diese minimale code-snipped zu erreichen, was Sie wollen, und Sie können hinzufügen, wie viele Stücke der Geschichte, die variable (das ist nur eine Liste von flowables wirklich). Die Magie ist nur, dass wir die übergabe der doc-generator eine Fließfähige, verwendet die Dünnflüssig eigene Leinwand zeichnen Sie die Abbildung.
EDIT: hätte ich fast vergessen, denn das gibt uns vollen Zugang zu der Methode drawImage können wir auch machen, das Bild oder die Handlung haben Transparenz, so dass andere Dinge, die gesehen werden können, durch es. Die docs auf der Methode drawImage die details.
Image
im dass es an diestory
direkt nach dem letzten element? Ich mag, dass kannst du manuell die x-und y selbst, aber es wäre schön, die option zu haben, Verhalten sich wieImage
.from io import BytesIO
story
, aber Sie müssen manuell positionieren Sie es unter dem letzten element (also das, was der OP wollte - "floating", aber das Anhängen einerImage
zustory
macht dies automatisch). Wie auch immer, ich eigentlich am Ende mit die Antwort. Die Qualität der Bilder war die gleiche Einsparung an Speicher oder auf der Festplatte (die war nicht gut), während es zu speichern alsPDF
Speicher, wie in dem link, verbesserte Qualität dramatisch.Gibt es Bild-Klasse in der Schnabeltiere. Verwenden Sie einfach
from reportlab.platypus import Image
und du hast Zugriff auf diese Klasse. Es funktioniert wie andere Klassen innerhalb undsmth.append(Image(filename))
fügt Bild-Objekt, das Sie brauchen, um zu bauen in eine pdf Datei. Gegründet im Tyler Lessman persönlichen website