Python Reportlab PDF - 在页面上居中文本
Posted
技术标签:
【中文标题】Python Reportlab PDF - 在页面上居中文本【英文标题】:Python Reportlab PDF - Centering Text on page 【发布时间】:2011-04-14 22:14:08 【问题描述】:我正在使用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)
文本显示,我可以手动移动左侧位置,使文本看起来居中,但我需要以编程方式将其居中,因为文本将是动态的,我不知道会有多少文本。
【问题讨论】:
【参考方案1】: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,我使用了 p.drawCentredString(4.25*inch, 500, 'some text') 效果很好,但是如何将 drawCentredString 与 .textOut 或 .textLine 一起使用? p.drawCentredString(center, 500, header);【参考方案2】:我也正好需要这个,然后写了这个:
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
【讨论】:
+1 用于使用 canvas.beginText :) 较旧的答案,但效果很好!然后您确实需要绘制返回到画布的tx
。喜欢my_canvas.drawText(createTextObject(my_canvas, x, y, text, style, centered))
【参考方案3】:
您可以使用像Paragraph
这样的Flowable 对象并将alignment
值分配给1:
styles = getSampleStyleSheet()
title_style = styles['Heading1']
title_style.alignment = 1
title = Paragraph("Hello Reportlab", title_style)
story.append(title)
这个例子将创建一个文本居中的 pdf 文档:
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
如果想让文字向左浮动,需要将alignment
改为0:
title_style.alignment = 0
如果想让文字向右浮动,需要将alignment
改为2:
title_style.alignment = 2
【讨论】:
【参考方案4】:试试:
<para alignment="center">
根据参考:http://two.pairlist.net/pipermail/reportlab-users/2006-June/005092.html
在你的情况下:
header.textOut("<"para alignment='center'>"Title of Page Here")
【讨论】:
请将解决方案复制到您的答案中。外部参考作为补充说明很好。以上是关于Python Reportlab PDF - 在页面上居中文本的主要内容,如果未能解决你的问题,请参考以下文章
Python Reportlab PDF - 在页面上居中文本
使用 Python 的 ReportLab 包从大文本文件生成 PDF 文档很慢