Tabellenposition festlegen

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
DMD
User
Beiträge: 123
Registriert: Sonntag 17. Mai 2015, 03:34

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
BlackJack

@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?
DMD
User
Beiträge: 123
Registriert: Sonntag 17. Mai 2015, 03:34

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:

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'),
                                   ]))
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.
BlackJack

@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.
Benutzeravatar
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
DMD
User
Beiträge: 123
Registriert: Sonntag 17. Mai 2015, 03:34

hab jetzt auf die schnelle ein kleines beispiel (und etwas zuviel importiert dafür :):

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()
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?
Benutzeravatar
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
Benutzeravatar
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
DMD
User
Beiträge: 123
Registriert: Sonntag 17. Mai 2015, 03:34

wo sind die beispiele denn nochmal?
kannst du mir ein minimalbeispiel geben, was du meinst?
BlackJack

@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
DMD
User
Beiträge: 123
Registriert: Sonntag 17. Mai 2015, 03:34

hab jetzt das beispiel aus dem blog von noisefloor genommen.
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)
Benutzeravatar
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
BlackJack

@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`.
Antworten