2011-01-18 231 views
14

Utilizo una tabla pero, dibujo en un lienzo para controlar la posición de los flowables, esto porque tengo una plantilla en un pdf, y me fusiono con pyPDF.¿Ajustar texto en una tabla reportlab?

La envoltura está hecha en una tabla pero el texto sube, no hacia abajo, eso es lo que espero.

c es el lienzo

Código

from reportlab.pdfgen import canvas 
from reportlab.lib.pagesizes import A4 
from reportlab.lib.styles import getSampleStyleSheet 
from reportlab.platypus import Paragraph, Table 
from reportlab.lib.units cm 

width, height = A4 
styles = getSampleStyleSheet() 

def coord(x, y, unit=1): 
    x, y = x * unit, height - y * unit 
    return x, y 

descrpcion = Paragraph('long paragraph', styles["Normal"]) 
partida = Paragraph('1', styles["Center"]) 
candidad = Paragraph('120', styles["Center"]) 
precio_unitario = Paragraph('$52.00', styles["right"]) 
precio_total = Paragraph('$6240.00', styles["right"]) 

data= [[partida, candidad, descrpcion, precio_unitario, precio_total]] 
table = Table(data, colWidths=[2.05 * cm, 2.7 * cm, 9.6 * cm, 
           2.65 * cm, 2.7 * cm]) 

c = canvas.Canvas(PDF, pagesize=A4) 
table.wrapOn(c, width, height) 
table.drawOn(c, *coord(1.8, 9.6, cm)) 
c.save() 

http://img600.imageshack.us/img600/3203/reportld.jpg

Respuesta

15

El texto de descripción se mientras lo envuelve en un estilo ["Normal"] Puede intentar envolver su texto en estilos ["BodyText"] Esto permitirá que su texto se alinee de acuerdo con el ancho de la celda que especifique. También podría incluir un formato similar al formato de texto HTML.

A continuación, utilice TableStyle para formatear el contenido de la tabla, por ejemplo, texto de color, párrafo central, filas/columnas de amplitud, etc.

I editado el código anterior a una versión de trabajo (ejemplo):

from reportlab.pdfgen import canvas 
from reportlab.lib.pagesizes import A4, cm 
from reportlab.lib.styles import getSampleStyleSheet 
from reportlab.platypus import Paragraph, Table, TableStyle 
from reportlab.lib.enums import TA_JUSTIFY, TA_LEFT, TA_CENTER 
from reportlab.lib import colors 

width, height = A4 
styles = getSampleStyleSheet() 
styleN = styles["BodyText"] 
styleN.alignment = TA_LEFT 
styleBH = styles["Normal"] 
styleBH.alignment = TA_CENTER 

def coord(x, y, unit=1): 
    x, y = x * unit, height - y * unit 
    return x, y 

# Headers 
hdescrpcion = Paragraph('''<b>descrpcion</b>''', styleBH) 
hpartida = Paragraph('''<b>partida</b>''', styleBH) 
hcandidad = Paragraph('''<b>candidad</b>''', styleBH) 
hprecio_unitario = Paragraph('''<b>precio_unitario</b>''', styleBH) 
hprecio_total = Paragraph('''<b>precio_total</b>''', styleBH) 

# Texts 
descrpcion = Paragraph('long paragraph', styleN) 
partida = Paragraph('1', styleN) 
candidad = Paragraph('120', styleN) 
precio_unitario = Paragraph('$52.00', styleN) 
precio_total = Paragraph('$6240.00', styleN) 

data= [[hdescrpcion, hcandidad,hcandidad, hprecio_unitario, hprecio_total], 
     [partida, candidad, descrpcion, precio_unitario, precio_total]] 

table = Table(data, colWidths=[2.05 * cm, 2.7 * cm, 5 * cm, 
           3* cm, 3 * cm]) 

table.setStyle(TableStyle([ 
         ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black), 
         ('BOX', (0,0), (-1,-1), 0.25, colors.black), 
         ])) 

c = canvas.Canvas("a.pdf", pagesize=A4) 
table.wrapOn(c, width, height) 
table.drawOn(c, *coord(1.8, 9.6, cm)) 
c.save() 
+0

gracias, esta es una buena solución, no es un truco como mi respuesta. – Alquimista

+0

algunos añadidos al estilo de la mesa ('VALIGN', (0,0), (- 1, -1), 'TOP') – Alquimista

+0

encantados de ayudar. Lástima, el informe no admite la tabla larga, de lo contrario hubiera sido un gran creador de informes en PDF. –

0

Sé que la referencia de PostScript es la esquina inferior izquierda. Supongo que el PDF es el mismo, por lo que resta del valor y para bajar. Imprima los valores iniciales y finales "y" en la función para ver cómo están cambiando y ajuste el valor "y" según la longitud de la oración. ¿Y cómo sabe la función qué es la "altura"? Utilizo ReportLab pero probablemente podría ayudar con un ejemplo específico si le interesa publicar uno.

+0

sí sé que la coordenada es como cartesiano en un pdf, [code] anchura, altura = A4 [/ code] – Alquimista

3

Autorresponder:

def coord(x, y, height, unit=1): 
    x, y = x * unit, height - y * unit 
    return x, y 

w, h = table.wrap(width, height) 
table.wrapOn(c, width, height) 
table.drawOn(c, *coord(ml - 0.05, y + 4.6, height - h, cm)) 

el truco está en la "altura - h", h es la altura de la mesa y esto depende del contenido de la tabla

Cuestiones relacionadas