PDF mit reportlab toolkit, Textausrichtung

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
whaeva
User
Beiträge: 66
Registriert: Mittwoch 25. Februar 2009, 15:30

Montag 9. März 2009, 18:17

Ist es möglich, mit Reportlab Toolkit (http://www.reportlab.org/rl_toolkit.html) Text innerhalb eines Bereiches automatisch vertikal auszurichten?

Horizontal ist das ja möglich (drawstring()), ein Textobject erlaubt die Steuerung des Cursors (moveCursor()) - aber eine automatische vertikale Ausrichtung?
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Montag 9. März 2009, 20:35

Hoi,

also eine "automatisch vertikale Ausrichtung" gibt es nicht - Du mußt es reportlab schon sagen, bzw. das in einer Funktion verankern.

textobject.setTextTransform() stellt eine Möglichkeit dar. Hierbei beschreiben die ersten vier Argumente eine orthogonale 2x2 Rotationsmatrix. Zur Verdeutlichung. Es gilt:

Code: Alles auswählen

sin(radians(90)) == 1
cos(radians(90)) == 0
Dann geht - die richtigen Imports wirst Du kennen:

Code: Alles auswählen

textobject.setTextTransform(0, -1, 1, 0, 100, 100)
textobject.textLines("bla bla bla")
canvas.drawText(textobject)
canvas.showPage()
canvas.save()
100, 100 steht hierbei für eine willkürliche Position.

Alternativ kannst Du das canvas Objekt drehen, Text schreiben und zurückdrehen. Das ist aber im womöglich etwas langsamer. Wenn Du so etwas also häufiger durchführen willst, empfiehlt sich eine Funktion "verticaltext" oder so zu definieren, die einen String nimmt und ihn entsprechend setzt.

HTH
Christian
whaeva
User
Beiträge: 66
Registriert: Mittwoch 25. Februar 2009, 15:30

Dienstag 10. März 2009, 10:18

Hi Christian,

das ist zwar auch interessant, aber ich hatte nicht an eine Drehung gedacht, sondern an die vertikale Ausrichtung einer Zeile bezogen auf einen Bereich.
Z.B. möchte ich eine oder mehrere Zeilen vertikal mittig zentrieren, d.h.

Code: Alles auswählen

- eins

  eins
- zwei
  drei
Ich probiere das gerade mit einem Versatz als Produkt aus Zeilenzahl und Schriftgröße, aber das funktioniert nicht so gut.
Man müsste die Zeilenhöhe bestimmen können. Anscheinend gibt es für die Breite die Methode

Code: Alles auswählen

canvas.stringWidth(self, text, fontName, fontSize, encoding=None)
(nicht getestet, was sie macht).

PS:
Die andere Möglichkeit ist die Verwendung von Tabellen, dort gibt es wohl eine VALIGN Option.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Dienstag 10. März 2009, 11:01

Ach so, dann habe ich Dich völlig falsch verstanden. Tut mir leid. Aber Du hast ja Lösungen gefunden.

Gruß,
Christian
Antworten