PDF generieren - bin leicht verwirrt

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
WalterT
User
Beiträge: 31
Registriert: Dienstag 5. Dezember 2017, 16:00

Liebe Freunde,

in meiner Software generiere ich pdf-Dateien. Das funktioniert soweit ganz gut. Ich verwende dazu fpdf, welches ich mit " pip install fpdf" installiert habe. Meine Python-Version ist 2.7.
Nun wollte ich mehr machen mit den pdf-Dateien, Striche zeichnen, Zellen positionieren etc. und komme drauf, dass viele der in diversen Tutorials beschriebenen Funktionen gar nicht funktionieren und einen Fehler schmeissen.
Daher denke ich, dass mein fpdf zu alt ist und habe daher pypdf2 installiert. Nun suche ich eine Befehlsreferenz und lese da die wildesten Sachen übr pypdf und pypdf2 und fpdf und und und
Ich kenn mich nicht mehr aus.

Was soll ich jetzt nehmen, wo finde ich eine Dokumentation dazu, etc. Ich erzeuge ein pdf, platziere ein Icon und mach ein paar Zellen mit Text oder ein Bild, mehr ist es nicht.

Danke.
Benutzeravatar
__blackjack__
User
Beiträge: 13087
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@WalterT: Ich habe nicht den Eindruck das PyPDF etwas ist was Deine Anforderungen erfüllt.

Der Klassiker in Python um PDFs zu erstellen ist eigentlich Reportlab.

Was ziemlich sicher alt ist, ist Python 2.7. Wenn es da nicht gute Gründe für gibt, solltest Du auf Python 3 umsteigen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
WalterT
User
Beiträge: 31
Registriert: Dienstag 5. Dezember 2017, 16:00

Danke für die Antwort.
Ich verwende 2.7, weil mir jemand gesagt hat, dass das besser ist.... Als Jung-Python glaubst du das dann eben.

Ich werde testweise Python 3 probieren und Reportlab. Mal sehen...
Benutzeravatar
__blackjack__
User
Beiträge: 13087
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich finde Python 2.7 auch besser, aber das ist halt tot und wird definitiv nicht mehr weiterentwickelt. Ab Ende des Jahres wird es nicht einmal mehr Sicherheitsupdates mehr geben.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
WalterT
User
Beiträge: 31
Registriert: Dienstag 5. Dezember 2017, 16:00

hab jetzt alles auf python 3.7 umgestellt und "mein" Programm im pycharm durchgeackert auf Änderungen. Passt soweit.

Nun will ich statt fpdf reportlab verwenden. In allen Tutorials steht "from reportlab.pdfgen import canvas". Wenn ich das mache, bekomme ich eine Fehlermeldung "ModuleNotFoundError: No module named 'reportlab'"

ja was jetzt? ich habs doch installiert (pip install reportlab, ist durchgelaufen)

Was mache ich falsch?
__deets__
User
Beiträge: 14530
Registriert: Mittwoch 14. Oktober 2015, 14:29

Es fuer python2.7 installiert zu haben, weil das normale pip dafuer ist. Du musst pip3 oder besser noch "python3.7 -mpip install reportlab" machen, um sicher zu gehen, dass es pip fuer python3.7 ist.
WalterT
User
Beiträge: 31
Registriert: Dienstag 5. Dezember 2017, 16:00

Danke.

Hab alles deinstalliert und von vorne angefangen, meine Umgebung aufzubauen.
Im Python 3.7 scheint reportlab enthalten zu sein, hab es nicht mit pip3 extra installiert.
Die Fehlermeldung ist jetzt auch weg.

Da war wohl noch was durcheinander mit Python 2.7 und 3.7.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Wie auch immer Du an reportlab gekommen bist, es ist nicht Bestandteil von Python 3.7
WalterT
User
Beiträge: 31
Registriert: Dienstag 5. Dezember 2017, 16:00

aha, interessant. Hab nichts davon installiert, ist aber da....
wie auch immer, klären wir später.
Momentan stehe ich mit reportlab auf dem Schlauch, die Dokumentation ist grottenschlecht, unvollständig....

Ich hab das Beispiel probiert:
def hello(c):
from reportlab.lib.units import cm
# move the origin up and to the left
c.translate(cm,cm)

wobei ich c.translate (cm,cm) nicht kapiere. Das sollte den Bezugspunkt nach links oben schieben? tut es abernicht. Ich verwende als unit cm und da steht irgendein float-Wert drinnen.

Ich kann schon pdf generieren, aber komme einfach mit den kartesischen Koordinaten nicht zurecht. (0,0 ist links unten).

Bitte erklärt mir das. Aus der Doku kann ich nichts herauslesen.
Benutzeravatar
sparrow
User
Beiträge: 4190
Registriert: Freitag 17. April 2009, 10:28

Also hier kann man das prima aus der Dokumentation herauslesen:
def translate(self, dx, dy):
move the origin from the current (0,0) point to the (dx,dy) point
(with respect to the current graphics state).
Du verschiebst mit canvas.translate also den 0,0 Punkt des Canvas, auf den sich zukünftige "Zeichnungen" darauf beziehen.
Mit c.translate(cm, cm) verschiebst du die Zeichnungen auf dem Canvas einen Zentimeter nach oben und einen Zentimeter nach rechts.
Wenn ich mich richtig erinnre.
Zuletzt geändert von sparrow am Mittwoch 13. März 2019, 14:23, insgesamt 1-mal geändert.
Benutzeravatar
__blackjack__
User
Beiträge: 13087
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@WalterT: Doch das verschiebt den Ursprung einen Zentimeter nach links und einen Zentimeter nach oben. `cm` ist eine Konstante die 1 cm in Points (1/72 inch) angibt. Das steht aber auch in der Dokumentation.

Importe gehören an den Anfang des Moduls, nicht in Funktionen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
WalterT
User
Beiträge: 31
Registriert: Dienstag 5. Dezember 2017, 16:00

aha, ok,

die hier erwähnte API-Referenz kannte ich nicht, ich hab nur den User-Guide von der reportlab-Site, da steht das Beispiel so drinnen (mit dem import innerhalb der Funktion), wobei ich den Kommentar "# move the origin up and to the left " so interpretiert habe, dass mein 0,0 dann oben links ist.

Also nicht. ok.
Wenn also alles vom 0,0 ausgeht, dann würde ein Bild, das an einer bestimmten Position eingefügt wird, sich nach oben und rechts darstellen, anstatt - wie es venünftig wäre - nach unten und rechts. Ich muss also vorher die Höhe des Bildes feststellen und meinen 0,0 berechnen. Was für ein Unsinn! aber vielleicht versteh ich da noch was nicht, irgendwer hat sich sicher was dabei gedacht.

Gibs eine Alternative zu reportlab?
Benutzeravatar
sparrow
User
Beiträge: 4190
Registriert: Freitag 17. April 2009, 10:28

WalterT hat geschrieben: Donnerstag 14. März 2019, 08:59 - wie es venünftig wäre - [...] Was für ein Unsinn! [...]
Wow, da bekommt man richtig Lust dir zu helfen.

Du hast doch den Userguide und jetzt sogar den Link zu der Dokumentation, die du selbst übersehen hast.
Vielleicht gibt es ja in einem der beiden Dokumente (oder sogar in beiden ;) ) die Erwähnung einer Funktion, die das Koordinatensystem ändert.

Übrigens ist es sowohl bei PDF als auch bei PostScript so, dass 0,0 in der unten linken Ecke sitzt. Was sie tun entspricht also dem Standard.
WalterT hat geschrieben: Donnerstag 14. März 2019, 08:59 Gibs eine Alternative zu reportlab?
Papier, Bleistift und Scanner.
Benutzeravatar
__blackjack__
User
Beiträge: 13087
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@WalterT: Musst Du Adobe fragen was die sich dabei gedacht haben. Wahrscheinlich das es für die meisten normalen Menschen bei einem Koordinatensystem üblich ist, dass es den Ursprung unten links hat. Das ist kein Unsinn sondern eigentlich völlig normal wenn man mit Papier arbeitet. Das der Ursprung oben links liegt ist ja eher so ein technisch bedingtes Computerding. Aber wenn Dir das nicht gefällt, dann weisst Du doch bereits, das man den Ursprung mit `translate()` wo anders hin verschieben kann. Und der Ankerpunkt für Bilder ist die Mitte des Bildes. Kann man aber auch an eine der Ecken setzen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
WalterT
User
Beiträge: 31
Registriert: Dienstag 5. Dezember 2017, 16:00

Danke.
@sparrow: du musst ja nichts schreiben, "vielleicht" hilft mir eher nicht.

"translate()" nutzt mir in diesem Falll nichts, ich verwende jetzt drawImage mit dem "anchor"- Parameter, das funktioniert gut und positioniert das Bild dort wo ich es will und in der richtigen Größe, proportional. - Problem gelöst.

Ich danke allen Postern und schließe diesen Thread ab.

lg
Walter
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

Reportlab ist DAS Standardmodul zur PDF-Generierung uner Python. Punkt. Es gibt auch andere Wege, aber Reportlab ist in der Regel einfacher.

Die Doku ist eigentlich ziemlich gut, aber halt ein bisschen anders geschrieben. Hat mich anfangs auch ein wenig gestört, aber letztendlich steht fast alles drin.

Noch ein Tip: bevor man sich mit low-level Operationen auf dem Canvas rum schlägt, sollte man sehen, ob es nicht einen Weg über die high-level API Namens Platypus von Reportlab gibt. Also am besten die Doku 1x _komplett_ lesen. Schadet nicht.

Gruß, noisefloor
Antworten