2010-09-20 83 views
6

Estoy usando ReportLab para generar un pdf dinámicamente con python.PDF de Python Reportlab - Centrar texto en la página

Me gustaría que una línea de texto se centre en una página. Aquí está el código específico que tengo actualmente, pero no sé cómo centrar el texto horizontalmente.

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) 

Las pantallas de texto y puedo mover manualmente la posición de la izquierda por lo que el texto se ve centrado, pero necesito que esto sea centrada mediante programación ya que el texto será dinámica y no sé la cantidad de texto que habrá .

Respuesta

9

El lienzo reportlab tiene un método drawCentredString. Y sí, lo deletrean así.

Somos británicos, maldición, y estamos orgullosos de nuestra ortografía!

Editar: En cuanto a los objetos de texto, me temo que no lo hace. Sin embargo, puede hacer algo en esa línea:

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. 

Puede usar otros tamaños de página, obviamente.

+0

Gracias Jim, He usado p.drawCentredString (4.25 * pulgada, 500, 'texto') que funciona muy bien, pero ¿cómo uso drawCentredString con .textOut o .textLine? p.drawCentredString (centro, 500, encabezado); – jhanifen

+0

Ver mi edición para una respuesta a eso. –

+0

¡Gracias, eso debería funcionar, no tan bonito, pero cumple su función! – jhanifen

6

sólo necesitaba esto también, y escribí esto:

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 para usar canvas.beginText :) ¡Respuesta anterior pero funciona genial! Necesitas dibujar 'tx' que se devuelve a un lienzo. Como 'my_canvas.drawText (createTextObject (my_canvas, x, y, text, style, centered))' – teewuane

Cuestiones relacionadas