hi ihr,
ich habe eine tabelle erstellt, die ich als pdf-datei abspeichern kann.
nur leider wandert die ein stück nach oben, wenn ein zusätzlicher eintrag dazukommt.
kann man die tabellenposition, d. h. die startposition (oben links) der tabelle festlegen,
so dass neue zeilen einfach unten angehängt werden, ohne das sich die tabelle nach oben verschiebt?
lg chrissimaus
Tabellenposition festlegen
@DMD: Da hier keiner weiss *wie* Du diese Tabelle erstellst, muss man jetzt raten. Kann es sein dass die Tabelle auf der Seite vertikal zentriert wird? Falls ja, warum willst Du das Verhalten dann ändern?
ne, es geht nicht darum wo die tabelle ist, sondern ihr eine feste anfangsposition zu
geben. meine tabelle bekommt jeden tag neue eintrage, die die tabelle dann jedesmal
ein stückchen höher schieben.
ich brauche ne syntax mit der ich die anfangsposition der tabelle festlegen kann.
hier ein codeausschnitt:
wenn da jetzt ganz unten eine neue zeile dazukommt (z.B. eine neue Adresszeile), wird die ganze tabelle hochgeschoben.
das will ich nicht. sie soll an dem anfangspunkt bleiben, wo sie jetzt is und nur nach unten
länger werden.
geben. meine tabelle bekommt jeden tag neue eintrage, die die tabelle dann jedesmal
ein stückchen höher schieben.
ich brauche ne syntax mit der ich die anfangsposition der tabelle festlegen kann.
hier ein codeausschnitt:
Code: Alles auswählen
datum = Paragraph('''<b>Datum</b>''', styleBH)
vorname = Paragraph('''<b>Vorname</b>''', styleBH)
nachname= Paragraph('''<b>Nachname</b>''', styleBH)
gebdat = Paragraph('''<b>Geburtsdatum</b>''', styleBH)
wohnort = Paragraph('''<b>Wohnort</b>''', styleBH)
liste = [datum, vorname, nachname,gebdat,wohnort]
data= liste
table = Table(data, colWidths=[2.8 * cm, 2.8 * cm, 2.8 * cm, 2.8* cm, 2.8 * cm])
table.setStyle(TableStyle([
('BACKGROUND',(0,0),(4,0), "#ddddddddd"),
('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),
('BOX', (0,0), (-1,-1), 0.25, colors.black),
('ALIGN',(0,0),(-1,-1),'CENTER'),
]))
das will ich nicht. sie soll an dem anfangspunkt bleiben, wo sie jetzt is und nur nach unten
länger werden.
@DMD: Es geht nicht darum wo die Tabelle ist sondern um ihre Anfangsposition ist ja wohl ein glatter Widerspruch. Zeig doch mal ein mininmales, lauffähiges Beispiel, welches das Problem demonstriert.
- noisefloor
- User
- Beiträge: 3856
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
wenn du Playtypus verwendst - worauf ich basierend auf dem Code tippen würde - dann fängt die Tablelle _immer_ oben an, weil Playtypus beim Bau des PDFs halt wie üblich die Seiten von oben nach unten füllt. Es sei denn, du überschreibst das Standardverhalten - was in ReportLab ja ohne weiteres möglich ist.
Also: zeigt mal den _kompletten_ Code.
Gruß, noisefloor
wenn du Playtypus verwendst - worauf ich basierend auf dem Code tippen würde - dann fängt die Tablelle _immer_ oben an, weil Playtypus beim Bau des PDFs halt wie üblich die Seiten von oben nach unten füllt. Es sei denn, du überschreibst das Standardverhalten - was in ReportLab ja ohne weiteres möglich ist.
Also: zeigt mal den _kompletten_ Code.
Gruß, noisefloor
hab jetzt auf die schnelle ein kleines beispiel (und etwas zuviel importiert dafür :
der code fügt neue adresse nach oben hin an, die sollen aber nach unten hin angehängt werden.
ich weiss net, wo der fehler ist.
für SimpleDocTemplate gibt es topMargin=30, mit dem man das regeln kann.
(doc = DocTemplate('C:\\Users\\DMD-OL\\Desktop\\Test_1.pdf', pagesize=A4, topMargin=30) )
ich mach das aber ja mit Canvas... oder kann man in Canvas auch topMargin=... einbauen?
Code: Alles auswählen
#!/usr/bin/env python
# coding: utf8
import datetime
import time
import errno
import os
import sqlite3
from Tkinter import *
import tkMessageBox
import numpy
import sys
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4, cm
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import Paragraph, Table, TableStyle
from reportlab.lib.enums import TA_JUSTIFY, TA_LEFT, TA_CENTER
from reportlab.lib import colors
from reportlab.platypus import Paragraph
from reportlab.lib.styles import ParagraphStyle
from reportlab.platypus import Image
from tkFileDialog import asksaveasfilename
import tkFileDialog
def file_save():
width, height = A4
styles = getSampleStyleSheet()
styleN = styles["BodyText"]
styleN.alignment = TA_LEFT
styleBH = styles["Normal"]
styleBH.alignment = TA_CENTER
def coord(x, y, unit=1):
x, y = x * unit, height - y * unit
return x, y
# Header
vorname = Paragraph('''<b>Vorname</b>''', styleBH)
nachname = Paragraph('''<b>Nachname</b>''', styleBH)
gebdat = Paragraph('''<b>Geburtsdatum</b>''', styleBH)
strasse = Paragraph('''<b>Strasse/Hausnr.</b>''', styleBH)
wohnort = Paragraph('''<b>PLZ/Wohnort</b>''', styleBH)
liste = []
kopf = [vorname, nachname, gebdat, strasse, wohnort]
liste.append(kopf)
adress_1 = ["Hans", "Wurst", "15.03.1988", "Luegnerstrasse 5", "12345 Arschlochhausen "]
liste.append(adress_1)
#---------------------------------------------------------------------------
# Bitte nach erstem Speichern freischalten und dann unter anderem Namen nochmal abspeichern
#adress_2 = ["Hans", "Wurst", "15.03.1988", "Luegnerstrasse 5", "12345 Arschlochhausen "]
#liste.append(adress_2)
#adress_3 = ["Hans", "Wurst", "15.03.1988", "Luegnerstrasse 5", "12345 Arschlochhausen "]
#liste.append(adress_3)
#---------------------------------------------------------------------------
table = Table(liste, colWidths=[ 3* cm, 3 * cm, 3 * cm, 4* cm, 4 * cm])
table.setStyle(TableStyle([
('BACKGROUND',(0,0),(4,0), "#ddddddddd"),
('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),
('BOX', (0,0), (-1,-1), 0.25, colors.black),
('ALIGN',(0,0),(-1,-1),'CENTER'),
]))
filename = tkFileDialog.asksaveasfilename(
filetypes = [("PDF Uebersicht", ".pdf")],
title = "HELLFIST",
initialfile = "Adresse_1.pdf")
if filename != "":
c = canvas.Canvas(filename, pagesize=A4)
table.wrapOn(c, width, height)
table.drawOn(c, *coord(1.8, 10, cm))
c.showPage()
c.save()
rootWin = Tk()
rootWin.title('GUI-VERWALTUNG')
rootWin.geometry('+800+200')
b = Button(rootWin, text = 'Speichern', command=file_save)
b.place(relx=.5, rely=.6, anchor="c")
rootWin.mainloop()
ich weiss net, wo der fehler ist.
für SimpleDocTemplate gibt es topMargin=30, mit dem man das regeln kann.
(doc = DocTemplate('C:\\Users\\DMD-OL\\Desktop\\Test_1.pdf', pagesize=A4, topMargin=30) )
ich mach das aber ja mit Canvas... oder kann man in Canvas auch topMargin=... einbauen?
- noisefloor
- User
- Beiträge: 3856
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
Kurzfassung: du richtest die Tabelle aktuell anhand der linken unteren Ecke aus. Heißt auch: wenn die Tabelle länger wird, rutscht die nach oben.
Ausführliche Erklärung folgt später.
Gruß, noisefloor
Kurzfassung: du richtest die Tabelle aktuell anhand der linken unteren Ecke aus. Heißt auch: wenn die Tabelle länger wird, rutscht die nach oben.
Ausführliche Erklärung folgt später.
Gruß, noisefloor
- noisefloor
- User
- Beiträge: 3856
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
so, jetzt in lang: Der Nullpunkt des Canvas ist die linke untere Ecke. Heißt, wenn du ein Element z.B. bei (5*cm, 7*cm) auf den Canvas zeichnest, dann ist die linke untere Ecke diese Elements in x-Richtung 5cm und in y-Richtung 7cm vom Nullpunkt des Canvas entfernt.
Da die Ausrichtung immer auf links unten bezogen ist, "wächst" dein Element zwangsläufig nach oben, wenn es grösser (=mehr Inhalt, wie z.B. mehr Tabellenzeilen) wird. Wenn die linke obere Ecke des Elements immer an der gleichen Stelle sein soll, dann musst du halt die linke untere Ecke in Abhängigkeit von der Höhe des Elements jedes mal berechnen.
Abgesehen davon: warum positionierst du Flowables (wie die Tabelle) händisch auf dem Canvas? Dazu gibt es in den allermeisten Fällen _keinen_ Grund. Der übliche Weg ist, die Flowables in ein Platypus-Template zu stecken und dann ReportLab das PDF bauen zu lassen. Dann wird alles "von oben nach unten" im PDF platziert. Beispiele hatte ich dir ja weiter oben schon gegeben.
Gruß, noisefloor
so, jetzt in lang: Der Nullpunkt des Canvas ist die linke untere Ecke. Heißt, wenn du ein Element z.B. bei (5*cm, 7*cm) auf den Canvas zeichnest, dann ist die linke untere Ecke diese Elements in x-Richtung 5cm und in y-Richtung 7cm vom Nullpunkt des Canvas entfernt.
Da die Ausrichtung immer auf links unten bezogen ist, "wächst" dein Element zwangsläufig nach oben, wenn es grösser (=mehr Inhalt, wie z.B. mehr Tabellenzeilen) wird. Wenn die linke obere Ecke des Elements immer an der gleichen Stelle sein soll, dann musst du halt die linke untere Ecke in Abhängigkeit von der Höhe des Elements jedes mal berechnen.
Abgesehen davon: warum positionierst du Flowables (wie die Tabelle) händisch auf dem Canvas? Dazu gibt es in den allermeisten Fällen _keinen_ Grund. Der übliche Weg ist, die Flowables in ein Platypus-Template zu stecken und dann ReportLab das PDF bauen zu lassen. Dann wird alles "von oben nach unten" im PDF platziert. Beispiele hatte ich dir ja weiter oben schon gegeben.
Gruß, noisefloor
@DMD: Ein wenig suchen in Deinem anderen Thema zu Tabellen in PDF und Du findest von noisefloor diesen Link zu seinem Blog: http://noisefloor-net.blogspot.de/2015/ ... rtlab.html
hab jetzt das beispiel aus dem blog von noisefloor genommen.
wie bekomme ich denn jetzt einen abstand zwischen den beiden überschriften hin???
wie bekomme ich denn jetzt einen abstand zwischen den beiden überschriften hin???
Code: Alles auswählen
def ueberSpeichern():
width, height = A4
styles = getSampleStyleSheet()
styleBH = styles["Normal"]
styleBH.alignment = TA_CENTER
styleBH.fontSize = 20
styleBH.leading = 10
styleM = styles["Normal"]
styleM.alignment = TA_CENTER
styleM.fontSize = 15
styleM.leading = 10
data = liste
story = []
styles = getSampleStyleSheet()
story.append(Paragraph("'Meine Uebersicht'", styleBH))
# hier soll ein Abstand der beiden Ueberschriften rein
story.append(Paragraph("Mein Konto", styleM))
t = Table(data)
t.hAlign = 'LEFT'
t.spaceBefore = 20
t.spaceAfter = 10
t.setStyle(TableStyle(
[('BOX', (0,0), (-1,-1), 0.5, colors.black),
('INNERGRID', (0,0), (-1,-1), 0.5, colors.black)]))
story.append(t)
doc = SimpleDocTemplate('C:\\Users\\DMD-OL\\Documents\\Python\\Code\Verwaltung_Arbeitszeit\\PDF\\Tabellentest_1.pdf', pagesize=A4)
doc.build(story)
- noisefloor
- User
- Beiträge: 3856
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
jedes Flowable hat die Attribute `spaceBefore`und `spaceAfter`. Damit kannst du dir die Abstände so anpassen, wie du es brauchst.
Gruß, noisefloor
jedes Flowable hat die Attribute `spaceBefore`und `spaceAfter`. Damit kannst du dir die Abstände so anpassen, wie du es brauchst.
Gruß, noisefloor
@noisefloor: Wobei man den Abstand von semantischen Elementen wie Überschriften IMHO besser über eine enstsprechende Stilvorlage festlegt und nicht einzeln bei jeder Überschrift über Attributzuweisungen auf dem `Flowable`.