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
PDF über WebSeite erstellen
- 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
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
Hallo,
habe jetzt wieder neue Suchbegriffe.
Danke erstmal
mfg Peter
Das Dokument ohne zwischenspeicherung Direkt Anzeigen.wenn Du schon Reportlab benutzt, wo ist jetzt konkret das Problem, ein PDF zu erstellen?
Das es geht ist schön die Frage wie.geht, keine Problem, auch "on the fly".
Webframework wird zurzeit keines verwendetgenerierte PDF als Attchment beim Response anhängen. Das "wie" hängt dann konkret davon ab, welches Webframework du verwendest
Werde ich mir Ansehen.Reportlab-Doku gibt's ein Beispiel dazu: http://www.reportlab.com/snippets/17/ - funktioniert vom Prinzip heute noch genau so.
habe jetzt wieder neue Suchbegriffe.
Danke erstmal
mfg Peter
@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.
- noisefloor
- User
- Beiträge: 3856
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
Gruß, noisefloor
Wie liefert ihr die Webseiten denn aus? CGI?Webframework wird zurzeit keines verwendet
Gruß, noisefloor
Hallo,
Bringt ja dann nur was wenn was drinnen steht.
ist das was sich zur Zeit habe was aber zur Zeit noch nicht funktioniert.
mfg Peter
Ja natürlich aber eine "Leere Seite" bringt ja auch nicht vielUnd bekommen wir das auch zu sehen?
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()
mfg Peter
@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.
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.
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.
- 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: 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
Hallo,
Aber sollte trotzdem den Konventionen entsprechen.
mfg Peter
Bei den Konventionen bin ich nicht am laufenden. Zeile 19 geändert.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.
canvas kennt »getpdfdata«
sehe ich mir an.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
Im Moment reicht es wenn gültiges PDF heraus kommt HTML wird dann nachher noch kontrolliertDein 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.
Das ihr bin nur ich das ganze ist nur Abteilungs Intern das ist auch nicht mein Hauptbetätigungsfeld.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.
Aber sollte trotzdem den Konventionen entsprechen.
mfg Peter
- noisefloor
- User
- Beiträge: 3856
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
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
Das hat nichts mit Konvetionen zu tun. Reportlab erzeught PDFs gem. PDF Version 1.4, die können alle PDF-Reader problemlos darstellen.Aber sollte trotzdem den Konventionen entsprechen.
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