Frage Python Reportlab PDF - Text zentrieren auf Seite


ich benutze BerichtLab um ein PDF dynamisch mit Python zu generieren.

Ich möchte, dass eine Textzeile auf einer Seite zentriert wird. Hier ist der spezifische Code, den ich derzeit habe, aber ich weiß nicht, wie man den Text horizontal zentriert.

header = p.beginText(190, 740)
header.textOut("Title of Page Here")

# I know i can use TextLine etc in place of textOut

p.drawText(header)

Der Text wird angezeigt, und ich kann die linke Position manuell verschieben, sodass der Text zentriert angezeigt wird. Dies muss jedoch programmgesteuert zentriert sein, da der Text dynamisch ist und ich nicht weiß, wie viel Text vorhanden sein wird.


7
2017-09-20 21:59


Ursprung


Antworten:


Der Reportlab Canvas hat eine drawCentredString Methode. Und ja, sie buchstabieren es so.

Wir sind Briten, verdammt und stolz auf sie   unsere Rechtschreibung!

Bearbeiten: Was Textobjekte betrifft, fürchte ich, dass Sie es nicht tun. Sie können jedoch etwas in diese Richtung tun:

from reportlab.pdfbase.pdfmetrics import stringWidth
from reportlab.rl_config import defaultPageSize

PAGE_WIDTH  = defaultPageSize[0]
PAGE_HEIGHT = defaultPageSize[1]

text = "foobar foobar foobar"
text_width = stringWidth(text)
y = 1050 # wherever you want your text to appear
pdf_text_object = canvas.beginText((PAGE_WIDTH - text_width) / 2.0, y)
pdf_text_object.textOut(text) # or: pdf_text_object.textLine(text) etc.

Sie können offensichtlich andere Seitengrößen verwenden.


11
2017-09-20 22:04



Ich brauchte das auch und schrieb dies:

def createTextObject(canv, x, y, text, style, centered=False):
    font = (style.fontName, style.fontSize, style.leading)
    lines = text.split("\n")
    offsets = []
    if centered:
        maxwidth = 0
        for line in lines:
            offsets.append(canv.stringWidth(line, *font[:2]))
        maxwidth = max(*offsets)
        offsets = [(maxwidth - i)/2 for i in offsets]
    else:
        offsets = [0] * len(lines)
    tx = canv.beginText(x, y)
    tx.setFont(*font)
    for offset, line in zip(offsets, lines):
        tx.setXPos(offset)
        tx.textLine(line)
        tx.setXPos(-offset)
    return tx

7
2018-03-31 15:45



Versuchen:

<para alignment="center">

Als Referenz: http://two.pairlist.net/pipermail/reportlab-users/2006-June/005092.html

In Ihrem Fall:

header.textOut("<"para alignment='center'>"Title of Page Here")

0
2018-05-21 19:16