python - style - Envolver texto en una tabla reportlab?
simpledoctemplate reportlab (3)
Utilizo una tabla, pero dibujo en un lienzo para controlar la posición de los materiales fluidos, esto porque tengo una plantilla en un pdf, una fusión con pyPDF.
La envoltura se realiza 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()
El texto de la descripción subió a medida que lo envuelve en un estilo ["Normal"] Puede intentar ajustar su texto en un estilo ["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.
Luego use TableStyle para dar formato al contenido de la tabla, por ejemplo, texto en color, párrafo central, filas / columnas de rango, etc.
Edité el código anterior a una versión funcional (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()
Sé que la referencia de Postscript es la esquina inferior izquierda. Supongo que el PDF es el mismo, por lo que se resta del valor y para bajar. Imprima los valores iniciales y finales de "y" en la función para ver cómo están cambiando y ajuste el valor de "y" según la longitud de la oración. ¿Y cómo sabe la función qué es la "altura"? Uso ReportLab, pero probablemente pueda ayudar con un ejemplo específico si le interesa publicar uno.
Respuesta automática:
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 tabla y esto depende del contenido de la tabla