2010-09-20 37 views
6

Tôi đang sử dụng ReportLab để tạo pdf động với python.Python Reportlab PDF - Căn giữa văn bản trên trang

Tôi muốn một dòng văn bản được căn giữa trên một trang. Đây là mã cụ thể mà tôi hiện có, nhưng không biết cách căn giữa văn bản theo chiều ngang.

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) 

Các hiển thị văn bản và tôi có thể tự di chuyển vị trí còn lại vì vậy các văn bản trông làm trung tâm, nhưng tôi cần điều này để được tập trung theo chương trình do văn bản sẽ năng động và tôi không biết bao nhiêu văn bản sẽ có .

Trả lời

9

Canvas reportlab có phương thức drawCentredString. Và vâng, họ đánh vần nó như thế.

Chúng tôi là người Anh, tự tử và tự hào về chính tả của chúng tôi!

Chỉnh sửa: Đối với các đối tượng văn bản, tôi e rằng bạn không biết. Tuy nhiên, bạn có thể thực hiện điều gì đó dọc theo các dòng đó:

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. 

Bạn có thể sử dụng các kích thước trang khác.

+0

Cảm ơn Jim, Tôi đã sử dụng p.drawCentredString (4,25 * inch, 500, 'một số văn bản') hoạt động tốt, nhưng làm cách nào để sử dụng drawCentredString với .textOut hoặc .textLine? p.drawCentredString (giữa, 500, tiêu đề); – jhanifen

+0

Xem chỉnh sửa của tôi để có câu trả lời cho điều đó. –

+0

Cảm ơn, điều đó sẽ hoạt động, không phải là đẹp nhưng thực hiện công việc! – jhanifen

6

Tôi chỉ cần này quá, và viết này:

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

+1 để sử dụng canvas.beginText :) Câu trả lời cũ hơn nhưng nó hoạt động tuyệt vời! Bạn cần phải vẽ 'tx' được trả về một khung vẽ. Giống như 'my_canvas.drawText (createTextObject (my_canvas, x, y, văn bản, kiểu, căn giữa))' – teewuane

0

Hãy thử:

<para alignment="center"> 

Như mỗi tham khảo: http://two.pairlist.net/pipermail/reportlab-users/2006-June/005092.html

Trong trường hợp của bạn:

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

Hãy sao chép một giải pháp vào câu trả lời của bạn. Các tham chiếu bên ngoài chỉ là một lời giải thích bổ sung. –

Các vấn đề liên quan