Tabelle (gewonnen aus Datenbank) als .pdf speichern

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
DMD
User
Beiträge: 123
Registriert: Sonntag 17. Mai 2015, 03:34

hi leute/black jack,
ich würde gern eine tabelle, die ich durch auslesen meiner datenbank gewinne (funktioniert), als .pdf-datei speichern.
soll heissen, ich bekomme eine tabelle ausgegeben, die ich in einem Tk()-fenster angezeigt bekomme. diese Tk-fenster-Tabelle möchte ich
jetzt gern als .pdf-datei abspeichern können.
geht das?
Zuletzt geändert von DMD am Montag 20. Juli 2015, 17:39, insgesamt 2-mal geändert.
BlackJack

@DMD: Das geht beispielsweise mit der `reportlab`-Bibliothek.
DMD
User
Beiträge: 123
Registriert: Sonntag 17. Mai 2015, 03:34

hast du ein kleines reportlab beispiel mit einer tabelle.
ich hab keine ahnung, wie ich anfangen soll...
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

Reportlab Doku (http://www.reportlab.com/documentation/), Kapitel 7. Wobei wenn du dich nicht mit ReportLab auskennst, dass Kapitel 7 alleine wohl nicht verständlich ist. Dann musst du mindestens bei Kapitel 5 anfangen.

Wenn die Tabelle einfach ist, wäre auch ein Tool, dass HTML in PDF konvertiert, eine Möglichkeit. Da gibt's diverse, müsstest nur mal sehen, welches noch gepflegt wird.

Gruß, noisefloor
DMD
User
Beiträge: 123
Registriert: Sonntag 17. Mai 2015, 03:34

das ist schon ne super hilfe, aber gibt es nicht für ein Tk()-Fenster eine standardisierte reportlab-Anwendung, sozusagen ne kopie, die einfach
in reportlab übertragen wird??

das ist echt viel arbeit für so eine kleine tabelle, wie ich sie habe
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

kann schon sein, dass sich irgendwann mal irgendwer darüber Gedanken gemacht hat, mir ist aber nichts bekannt.

Von daher musst du in RepportLab das gleiche machen, wie in Tk: über die Daten iterieren und dabei die Tabelle ins PDF schreiben :-)

Brauchst du nur eine nackte Tabelle als PDF oder soll da noch mehr rein?

Gruß, noisefloor
DMD
User
Beiträge: 123
Registriert: Sonntag 17. Mai 2015, 03:34

da soll schon mehr rein. hab mir aber schon etwas gebastelt :)
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

DMD hat geschrieben:da soll schon mehr rein. hab mir aber schon etwas gebastelt :)
Vielleicht magst du das ja teilen, falls sich noch jemand dafür interessiert.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

deine Lösung würde mich auch interessieren :-)

Gruß, noisefloor
DMD
User
Beiträge: 123
Registriert: Sonntag 17. Mai 2015, 03:34

kein problem.
ich werds hier reinstellen, wenn ich soweit bin.
dauert aber wohl noch.
hab nur dieses gefunden:

Code: Alles auswählen

from Tkinter import *
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4, landscape
from reportlab.platypus import Image
from tkFileDialog   import asksaveasfilename

def CreeerRapport(datum, pompnummer, jobnummer, pomptype, snelheid, gemiddeldeAfwijking, tabelImage):
    filename = asksaveasfilename(
        filetypes = [("PDF bestand", ".pdf")],
        title = "Rapport opslaan",
        initialfile = "RapportPomp.pdf")
    if filename != "":
##        filename = filename.replace("/", "\\")  Changing the separators in the path does not fix the problem
        file = canvas.Canvas(filename, pagesize=landscape(A4))

        # Header
        file.setFont("Helvetica", 30, leading=None)
        file.drawCentredString(415, 550, "Resultaten van pomp: " + pompnummer)

        # Tabel
        file.setFont("Helvetica", 12, leading=None)
        file.drawString(50, 490, "Datum:")
        file.drawString(50, 470, "Pompnummer:")
        file.drawString(50, 455, "Jobnummer:")
        file.drawString(50, 440, "Type: ")
        file.drawString(50, 425, "Snelheid:")
        file.drawString(50, 410, "Gemiddelde afwijking:")

        X = 170
        file.drawString(X, 490, datum)
        file.drawString(X, 470, pompnummer)
        file.drawString(X, 455, jobnummer)
        file.drawString(X, 440, pomptype)
        file.drawString(X, 425, snelheid + " ml/h")
        file.drawString(X, 400, gemiddeldeAfwijking + " %")

        file.showPage()
        file.save()

root = Tk()
button = Button(root, text="Press!", command=lambda: CreeerRapport("06 February 2002", "62778", "08330", "DPS", "5", "1.3", None))
button.pack()
root.mainloop()
das ist schon im netz.
ich muss das aber noch auf meinen krams umschreiben
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

das geht und funktioniert, ist aber ziemlich "low level", weil du von Hand das Layout / die Positionierung jedes Elements festlegen musst. Mal angesehen davon, dass in dem Beispiel keine Tabelle generiert wird ;-)

Für Dokumente mit mehr Inhalt möchtest du Platypus, weil sich dann ReportLab in weiten Teilen um's Layout kümmert.

Wenn dir doch eine Liste von Elementen als Darstellung reicht, dann geht das Mittels Platypus wie z.B. hier im Blog. Mit Platypus gehen natürlich auch Tabellen, Links gab's schon weiter oben.

Gruß, noisefloor
DMD
User
Beiträge: 123
Registriert: Sonntag 17. Mai 2015, 03:34

ich finds schon ziemlich schlecht, dass es keine standardmöglichkeit gibt,
mit der man bspw. ein einfaches label aus einem tkinter-fenster in eine reportlab-tabelle übernehmen kann.
wenn ich das vorher gewusst hätte ....
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
DMD hat geschrieben:ich finds schon ziemlich schlecht, dass es keine standardmöglichkeit gibt,
Gegenfrage: Warum soll es denn geben? Nur weil du das jetzt im Moment mal dringend brauchst? Tkinter und ReportLab haben ja nichts miteinander zu tun, noch nicht mal ansatzweise. Abgesehen davon ist Tkinter ja nur eins von drei bis vier gängigen Frameworks zum Bauen von GUIs (mit Hilfe von Python).
wenn ich das vorher gewusst hätte ....
Dann....?

Und das selber zu programmieren ist ja auch echt kein Hexenwerk - DIY! Die notwendigen Links sind dir alle schon gegeben worden.

Gruß, noisefloor
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@DMD: normalerweise will man keine PDF-Dateien, die aussehen wie eine GUI-Anwendung. Daher sah sich wohl noch niemand gezwungen, soetwas zu programmieren.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

habe heute mal über die Basic von Tabellen in ReportLab gebloggt: http://noisefloor-net.blogspot.de/2015/ ... rtlab.html.

Vielleicht hilft's ja :-)

Gruß, noiselfoor
DMD
User
Beiträge: 123
Registriert: Sonntag 17. Mai 2015, 03:34

...wenn man sich eine tabelle erstellt, die irgendwelche werte enthält,
naja, was will ich dann wohl damit machen....einfach nur angucken???
is doch klar das man die weiterverarbeiten will --> SPEICHERN, DRUCKEN was auch immer.

ich bin doch nicht der einzige auf der welt, dem das so geht
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Als Software-Entwickler hat man eigentlichen keinen Grund sich darüber zu ärgern, dass so vieles erst noch programmiert werden muss. Denn wenn es nicht so wäre, wofür würde man uns dann bezahlen?
a fool with a tool is still a fool, www.magben.de, YouTube
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

also Tkinter kann nicht viel mehr, als die GUI darzustellen.

Wenn du mehr Funktionalität suchst, dann solltest du mal auf Qt oder GTK+ schauen. Qt kann z.B. auch ootb PDFs über die QPrinter Klasse erstellen.

Unter Tk musst du das wohl selber schreiben. Einfach einen Button einfügen, an dessen "Button pressed" Event eine Callback-Funktion binden, die die zu druckenden Daten ReportLab übergibt, welches dann das PDF baut.
Als Software-Entwickler hat man eigentlichen keinen Grund sich darüber zu ärgern, dass so vieles erst noch programmiert werden muss. Denn wenn es nicht so wäre, wofür würde man uns dann bezahlen?
+1 :-)

Gruß, noisefloor
DMD
User
Beiträge: 123
Registriert: Sonntag 17. Mai 2015, 03:34

ich habe hier etwas gefunden und etwas abgeändert:

Code: Alles auswählen

from reportlab.platypus import Image
from tkFileDialog   import asksaveasfilename
import tkFileDialog
from Tkinter import *


def file_save():
    f = tkFileDialog.asksaveasfile(mode='w', defaultextension=".pdf") # vorher stand da ".txt", was einwandfrei funktionierte
    if f is None: # asksaveasfile gibt `None` zurueck, wenn dialog mit 'abbrechen' geschlossen wird
        return
    text2save = str(text.get(1.0, END))
    f.write(text2save)
    f.close() 

root = Tk()
root.title('--> NUMMERO UNO <--')
root.geometry("500x500")

b_r1 = Button(root, text = 'Speichern', command=file_save)
b_r1.place(relx=.84, rely=.8, anchor="c")
root.mainloop()
der code speichert zwar als .pdf, man kann sie aber nicht mit adobe acrobat öffnen.
aber wieso???
BlackJack

@DMD: Na weil Du da einfach eine Textdatei schreibst und kein PDF. Durch die Dateiendung ändert sich ja nicht auf magische Weise der Dateiinhalt.
Antworten