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

时间:2010-09-20 21:59:15

标签: python pdf-generation reportlab

我正在使用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 个答案:

答案 0 :(得分:12)

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.

显然,您可以使用其他页面尺寸。

答案 1 :(得分: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

答案 2 :(得分:0)

尝试:

<para alignment="center">

按参考文献:http://two.pairlist.net/pipermail/reportlab-users/2006-June/005092.html

在你的情况下:

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

答案 3 :(得分:0)

您可以使用multiqc之类的Flowable对象,并将Paragraph的值分配给1:

alignment

此示例将创建一个居中文本的pdf文档:

styles = getSampleStyleSheet()
title_style = styles['Heading1']
title_style.alignment = 1
title = Paragraph("Hello Reportlab", title_style)
story.append(title)

如果要使文本向左浮动,则需要将from flask import make_response import io from reportlab.platypus import SimpleDocTemplate, Paragraph from reportlab.lib.styles import getSampleStyleSheet story=[] pdf_doc = io.BytesIO() doc = SimpleDocTemplate(pdf_doc) styles = getSampleStyleSheet() title_style = styles['Heading1'] title_style.alignment = 1 title = Paragraph("Hello Reportlab", title_style) story.append(title) doc.build(story) content = pdf_doc.getvalue() #output to browser response = make_response(content) response.mimetype = 'application/pdf' return response 更改为0:

alignment

如果您想使文本向右浮动,则需要将title_style.alignment = 0 更改为2:

alignment