PDF über WebSeite erstellen

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
Peter1977
User
Beiträge: 86
Registriert: Mittwoch 4. September 2013, 14:59

Hallo,

Suche eine Möglichkeit eine PDF zu erstellen.

Über einen Link soll zu dieser PDF Seite geführt werden. Diese PDF Seite ist allerdings nicht Statisch
sondern soll wenn dieser Link aufgerufen wird automatisch erstellt werden und angezeigt werden.

Die Webseiten werden in Python3.5 geschrieben.
Ebenso steht Reportlab zur Verfügung.

gesucht habe ich zwar schon bekomme aber immer angezeigt
die Direkte Seite zu PDF umwandeln.

Gut wären jetzt einige Tips die zu Richtigen Ergebnissen führen.
Danke
mfg Peter
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Peter1977: wenn Du schon Reportlab benutzt, wo ist jetzt konkret das Problem, ein PDF zu erstellen?
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

geht, keine Problem, auch "on the fly".

Grundsätzlich musst du "nur" das generierte PDF als Attchment beim Response anhängen. Das "wie" hängt dann konkret davon ab, welches Webframework du verwendest. Um das PDF nicht speichern zu müssen, kannst du es in ein StringIO-Objekt (statt eine Datei) schreiben.

In der Reportlab-Doku gibt's ein Beispiel dazu: http://www.reportlab.com/snippets/17/ - funktioniert vom Prinzip heute noch genau so.

Gruß, noisefloor
Peter1977
User
Beiträge: 86
Registriert: Mittwoch 4. September 2013, 14:59

Hallo,
wenn Du schon Reportlab benutzt, wo ist jetzt konkret das Problem, ein PDF zu erstellen?
Das Dokument ohne zwischenspeicherung Direkt Anzeigen.
geht, keine Problem, auch "on the fly".
Das es geht ist schön die Frage wie.
generierte PDF als Attchment beim Response anhängen. Das "wie" hängt dann konkret davon ab, welches Webframework du verwendest
Webframework wird zurzeit keines verwendet
Reportlab-Doku gibt's ein Beispiel dazu: http://www.reportlab.com/snippets/17/ - funktioniert vom Prinzip heute noch genau so.
Werde ich mir Ansehen.

habe jetzt wieder neue Suchbegriffe.

Danke erstmal

mfg Peter
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@Peter1977: Du brauchst kein Webframework, obwohl dies hilfreich sein kann. Du brauchst lediglich beim Response im Header 'application/pdf' als content-type zu setzen und den (on the fly) erzeugten pdf-Code im Body hinterher zu senden.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Webframework wird zurzeit keines verwendet
Wie liefert ihr die Webseiten denn aus? CGI?

Gruß, noisefloor
Peter1977
User
Beiträge: 86
Registriert: Mittwoch 4. September 2013, 14:59

Hallo,
Wie liefert ihr die Webseiten denn aus? CGI?
Ja

mfg Peter
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und bekommen wir das auch zu sehen? Es ist deutlich einfacher zu helfen, wenn man sieht, was versucht wird, statt prophylaktisch 10-seitige Abhandlungen ueber das HTTP-Protokoll zu schreiben.
Peter1977
User
Beiträge: 86
Registriert: Mittwoch 4. September 2013, 14:59

Hallo,
Und bekommen wir das auch zu sehen?
Ja natürlich aber eine "Leere Seite" bringt ja auch nicht viel
Bringt ja dann nur was wenn was drinnen steht.

Code: Alles auswählen

print ("Content-type:application/pdf")
print ("")
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4,landscape
from reportlab.lib.units import mm
# Standard Importe
import sys
import time
import cgi
import cgitb; cgitb.enable()
# Eigene Datei Importe
sys.path.append(r'../mod')
import db
import funktionen

form=cgi.FieldStorage()
Spalten=form.getvalue("Spalten")

Datum=(str(time.strftime("%Y-%m-%d")))

response = None

PDF = canvas.Canvas(response,pagesize=landscape(A4))
PDF.drawString(150,100, Datum)
PDF.drawString(100,100, "Spalten: %s"%(Spalten))
PDF.showPage()
PDF.save()
ist das was sich zur Zeit habe was aber zur Zeit noch nicht funktioniert.

mfg Peter
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Peter1977: canvas kennt »getpdfdata«, das genau das ist, was Du suchst. Pfade werden relativ zum Ort, an dem die Datei ausgeführt wird gesucht, Du solltest einen absoluten Pfad, oder relativ zu __file__ benutzen. »mod« ist kein guter Name für ein Verzeichnis für Module, db und funktionen keine guten Namen für Module, weil sie zu generisch sind. Du hältst Dich bei der Benennung Deiner Variablennamen nicht an die Konventionen, alles klein zu schreiben. Zeile 19 hat einige Klammern und ein str zu viel.
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du kannst an Canvas als erstes Argument eine StringIO Instanz übergeben. Die wird dann mit den Bytes der Datei befüllt, und den string kannst du dann zurück geben. Keine Datei angelegt.

http://nullege.com/codes/show/src@d@j@d ... encrypt.py


Dein Skript so hinzufummeln, das es dann auch noch wirklich korrektes HTTP wird - da mag sich wer anders versuchen. Mich schauderst bei dem Rückflug in die 90er zu sehr.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@Peter1977: baut ihr das PDF wirklich low-level über den Canvas und nicht via Platypus? Kann man zwar machen, ist aber bei größeren Dokumenten extrem aufwendig und fummelig.

Ansonsten würde ich auch dringend zur Verwendung eine Webframeworks wie Bottle oder Flask raten und auf WSGI statt CGI setzen. Nicht nur, weil dann vieles einfacher - und flexibler - ist, sondern auch, mal man den Code viel bessere und sauberer strukturieren kann. Bei Verwendung von CGI besteht immer das latente Risiko, unübersichtlichen Spaghetti-Code zu schreiben.

Gruß, noisefloor
Peter1977
User
Beiträge: 86
Registriert: Mittwoch 4. September 2013, 14:59

Hallo,
Du hältst Dich bei der Benennung Deiner Variablennamen nicht an die Konventionen, alles klein zu schreiben. Zeile 19 hat einige Klammern und ein str zu viel.
Bei den Konventionen bin ich nicht am laufenden. Zeile 19 geändert.
canvas kennt »getpdfdata«
Du kannst an Canvas als erstes Argument eine StringIO Instanz übergeben. Die wird dann mit den Bytes der Datei befüllt, und den string kannst du dann zurück geben. Keine Datei angelegt.

http://nullege.com/codes/show/src@d@j@d ... encrypt.py
sehe ich mir an.
Dein Skript so hinzufummeln, das es dann auch noch wirklich korrektes HTTP wird - da mag sich wer anders versuchen. Mich schauderst bei dem Rückflug in die 90er zu sehr.
Im Moment reicht es wenn gültiges PDF heraus kommt HTML wird dann nachher noch kontrolliert
baut ihr das PDF wirklich low-level über den Canvas und nicht via Platypus? Kann man zwar machen, ist aber bei größeren Dokumenten extrem aufwendig und fummelig.
Das ihr bin nur ich das ganze ist nur Abteilungs Intern das ist auch nicht mein Hauptbetätigungsfeld.
Aber sollte trotzdem den Konventionen entsprechen.

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

Hallo,
Aber sollte trotzdem den Konventionen entsprechen.
Das hat nichts mit Konvetionen zu tun. Reportlab erzeught PDFs gem. PDF Version 1.4, die können alle PDF-Reader problemlos darstellen.

Der Punkt ist, dass du es dir gerade unnötig schwer machst, in dem du a) CGI statt eine WSGI-Framework benutzt und b) bei Reportlab mit dem Canvas hantierst statt Platypus zu nehmen.

Gruß, noisefloor
Antworten