2010-09-20 5 views
6

Я использую ReportLab для динамического создания pdf-файла с помощью python.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. И да, они так написали.

Мы англичане, черт возьми, и гордимся нашей орфографией!

Edit: Что касается текстовых объектов, я боюсь, что вы не делаете. Вы можете что-то делать по этим линиям:

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

Спасибо Jim, Я использовал p.drawCentredString (4.25 * inch, 500, 'some text') , который отлично работает, но как использовать drawCentredString с .textOut или .textLine? p.drawCentredString (в центре, 500, заголовок); – jhanifen

+0

См. Мое редактирование для ответа на этот вопрос. –

+0

Спасибо, что должно работать, не так красиво, но делает работу! – jhanifen

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

+1 для использования canvas.beginText :) Старые ответы, но он отлично работает! Вам нужно затем нарисовать 'tx', который возвращается на холст. Подобно 'my_canvas.drawText (createTextObject (my_canvas, x, y, text, style, centered))' – teewuane