13

ReportLabを使用して、python で動的に pdf を生成しています。

テキスト行をページの中央に配置したいと考えています。これは私が現在持っている特定のコードですが、テキストを水平方向に中央揃えする方法がわかりません。

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)

テキストが表示され、テキストが中央に表示されるように手動で左の位置を移動できますが、テキストが動的になり、テキストの量がわからないため、これをプログラムで中央に配置する必要があります。

4

4 に答える 4

18

reportlabキャンバスにはdrawCentredStringメソッドがあります。そして、はい、彼らはそれをそのように綴ります。

私たちはイギリス人で、くそったれ、そして私たちのつづりを誇りに思っています!

編集:テキストオブジェクトに関しては、私はあなたがそうしないのではないかと思います。ただし、これらの線に沿って何かを行うことができます。

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.

もちろん、他のページサイズを使用することもできます。

于 2010-09-20T22:04:21.540 に答える
7

私もこれが必要だったので、次のように書きました。

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
于 2011-03-31T15:45:33.343 に答える
0

試す:

<para alignment="center">

参照ごとに: http://two.pairlist.net/pipermail/reportlab-users/2006-June/005092.html

あなたの場合:

header.textOut("<"para alignment='center'>"Title of Page Here")
于 2017-05-21T19:16:59.143 に答える