[英]How to create a PDF document with differing page sizes in reportlab, python
[英]Python Reportlab PDF - Centering Text on page
我正在使用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)
文本顯示,我可以手動移動左側位置,使文本看起來居中,但我需要以編程方式居中,因為文本將是動態的,我不知道會有多少文本。
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.
顯然,您可以使用其他頁面大小。
我也需要這個,並寫了這個:
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
您可以使用像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
嘗試:
<para alignment="center">
根據參考: http ://two.pairlist.net/pipermail/reportlab-users/2006-June/005092.html
在你的情況下:
header.textOut("<"para alignment='center'>"Title of Page Here")
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Paragraph
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
doc = SimpleDocTemplate("form_letter.pdf",pagesize=letter,
rightMargin=72,leftMargin=72,
topMargin=72,bottomMargin=18)
Story = []
styles = getSampleStyleSheet()
title_style = styles['Heading1']
title_style.alignment = 1
title = Paragraph("Welcome to india", title_style)
Story.append(title)
doc.build(Story)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.