Python Reportlab PDF - 页面上的居中文本

新手上路,请多包涵

我正在使用 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)

文本显示,我可以手动移动左侧位置,使文本看起来居中,但我需要以编程方式居中,因为文本将是动态的,我不知道会有多少文本。

原文由 jhanifen 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 671
2 个回答

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.

显然,您可以使用其他页面大小。

原文由 Jim Brissom 发布,翻译遵循 CC BY-SA 2.5 许可协议

我也只需要这个,然后写了这个:

 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

原文由 EB. 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题