如何将 python Reportlab 表定位在 10,100 位置并使用 drawString

How to position a python Reportlab table at position 10,100 and use drawString

提问人:Marc B. Hankin 提问时间:1/31/2017 最后编辑:Brian Tompsett - 汤莱恩Marc B. Hankin 更新时间:8/2/2017 访问量:16957

问:

我是 python 爱好者和 reportlab 新手。
我知道如何使用drawString将文本放在页面上的特定位置,例如: c.drawString(10,100,“欢迎来到Reportlab!

但是我无法弄清楚如何放置一个表格(只有几行长),以便表格从与 c.drawString(10,100,“Welcome to Reportlab!”) 相同的位置开始,如果我学习如何将我的表格放在那里,我会将其放置在其他地方。

我也无法弄清楚如何在同一脚本中使用 drawString,因为使用画布是我知道如何使用 drawString 函数的唯一方法。我的 4 行画布代码(在本段之后)将关闭画布/文件并创建 PDF。表格代码(下面进一步)也关闭了文件并构建了 PDF,我不明白如何使用“doc.build(elements)”行关闭我用于 drawString 操作的画布。

c = canvas.Canvas(r"e:\hellonu.pdf", pagesize=letter)
c.setFont("Courier", 9) #choose your font type and font size
c.drawString(10,60,"Welcome to Reportlab!")
c.save()

如果您能给我任何指导 (1) 关于如何放置表格以使其从 10,100 开始,以及 (2) 如何在同一脚本中使用 drawString,我将不胜感激。如果我的某些代码没有任何用处,请不要假设我是故意把它放在那里的;我试图从示例中复制足够多的东西,以便我的表格具有自动换行功能。

这是我一直在玩的代码:

# http://zewaren.net/site/node/139
from reportlab.lib import colors
from reportlab.lib.pagesizes import LETTER, inch, portrait
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph
from reportlab.lib.styles import getSampleStyleSheet


doc = SimpleDocTemplate(r"e:\test_report_lab.pdf", pagesize=LETTER, rightMargin=30,leftMargin=30, topMargin=30,bottomMargin=18)
doc.pagesize = portrait(LETTER)
elements = []


data = [
["Directory"],
["AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA "],
]


style = TableStyle([('ALIGN',(1,1),(-2,-2),'RIGHT'),
                       ('TEXTCOLOR',(1,1),(-2,-2),colors.red),
                       ('VALIGN',(0,0),(0,-1),'TOP'),
                       ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),
                       ('BOX', (0,0), (-1,-1), 0.25, colors.black),
                       ])

#Configure style and word wrap
s = getSampleStyleSheet()
s = s["BodyText"]
s.wordWrap = 'CJK'
data2 = [[Paragraph(cell, s) for cell in row] for row in data]
t=Table(data2)
t.setStyle(style)


#Send the data and build the file
elements.append(t)
doc.build(elements)
python-2.7 reportlab 抽绳

评论


答:

13赞 nostradamus 8/2/2017 #1

最近,我偶然发现了同样的问题。这里的问题是,在 reportlab 中,表是所谓的“可流动的”,而命令是“固定的”。drawString

多亏了 Mike Driscoll 编写的这个很棒的教程,我找到了解决方案:“Reportlab:混合固定内容和可流动内容”。

这是一个略有改编的版本,它构成了一个工作片段:

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

c = canvas.Canvas('example.pdf', pagesize=A4)  # alternatively use bottomup=False
width, height = A4

data = [[1, 2, 3], [2, 1, 3], [3, 2, 1]]

table = Table(data, colWidths=10*mm)
table.setStyle([("VALIGN", (0,0), (-1,-1), "MIDDLE"),
                ("ALIGN", (0,0), (-1,-1), "CENTER"),
                ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black)])

table.wrapOn(c, width, height)
table.drawOn(c, 0*mm, 5*mm)

styles = getSampleStyleSheet()    
ptext = "This is an example."
p = Paragraph(ptext, style=styles["Normal"])
p.wrapOn(c, 50*mm, 50*mm)  # size of 'textbox' for linebreaks etc.
p.drawOn(c, 0*mm, 0*mm)    # position of text / where to draw

c.save()

我还可以推荐 Mike Driscoll 的另外两个教程,它们使我能够快速熟悉 reportlab。

非常感谢,迈克!