2010-09-20 23 views
6

我使用ReportLab來動態地用python生成pdf。Python Reportlab 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) 

的文本顯示,我可以手動將左側位置,使文本看起來居中,但我需要這種以編程爲中心的,因爲文本將是動態的,我不知道有多少文本會有。

回答

9

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. 

顯然,您可以使用其他頁面大小。

+0

謝謝吉姆, 我用過 p.drawCentredString(4.25 * inch,500,'some text') 這很好用,但是如何在.textOut或.textLine中使用drawCentredString? p.drawCentredString(center,500,header); – jhanifen 2010-09-20 22:20:01

+0

請參閱我的編輯以獲得答案。 – 2010-09-20 22:45:13

+0

謝謝,這應該工作,不是很漂亮,但工作! – jhanifen 2010-09-20 23:00:37

6

我只是需要這樣過了,寫了這個:

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 
+0

對於使用canvas.beginText +1 :)較舊的答案,但它效果很好!您確實需要繪製返回到畫布的'tx'。像'my_canvas.drawText(createTextObject(my_canvas,x,y,text,style,居中))' – teewuane 2015-07-21 23:07:52