在表格报告实验室中包装文本?
Posted
技术标签:
【中文标题】在表格报告实验室中包装文本?【英文标题】:Wrap text in a table reportlab? 【发布时间】:2011-06-11 04:37:44 【问题描述】:我使用表格,但我在画布中绘制以控制流动对象的位置,这是因为我在 pdf 中有一个模板,我与 pyPDF 合并。
换行是在表格中完成的,但文本会向上,而不是向下,这正是我希望的。
c 是画布
代码
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
【问题讨论】:
【参考方案1】:当您将其包装在样式中时,描述文本会上升[“Normal”]您可以尝试将您的文本包装在样式中[“BodyText”]这将允许您的文本根据单元格的宽度自行对齐你指定。您还可以包含类似于 html 文本格式的格式。
然后使用 TableStyle 对表格中的内容进行格式化,例如彩色文本、居中段落、跨行/跨列等。
我将上面的代码编辑为工作版本(示例):
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from reportlab.lib.units import 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()
【讨论】:
对表格样式的一些补充('VALIGN',(0,0),(-1,-1),'TOP) 很高兴为您提供帮助。太糟糕了,reportlab 不支持长表,否则它会是一个很棒的 pdf 报告创建器。【参考方案2】:自动回复:
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))
诀窍在于“height - h”,h 是表格的高度,这取决于表格的内容
【讨论】:
【参考方案3】:我知道 Postscript 的参考是左下角。我猜PDF是一样的,所以你从y值中减去去。打印函数中开始和结束的“y”值以查看它们如何变化并根据句子的长度调整“y”值。该函数如何知道“高度”是什么?我使用 ReportLab,但如果您愿意发布一个具体示例,可能会有所帮助。
【讨论】:
是的,我知道坐标就像 pdf 中的笛卡尔坐标,[code] width, height = A4 [/code]以上是关于在表格报告实验室中包装文本?的主要内容,如果未能解决你的问题,请参考以下文章