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

时间:2017-01-30 23:24:54

标签: python-2.7 reportlab drawstring

我是一个蟒蛇爱好者和报道新手 我知道如何使用drawString将文本放在页面上的特定位置,例如: c.drawString(10,100,"欢迎来到Reportlab!")

但是我无法弄清楚如何放置一个表(只有几行长),这样表就会从与c.drawString相同的位置开始(10,100,"欢迎光临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。如果我的一些代码没有任何用处,请不要假设我故意将它放在那里;我试图从示例中复制足够的内容,以便我的表格具有wordwrap功能。

这是我一直在玩的代码:

# 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)

1 个答案:

答案 0 :(得分:3)

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

我得到了一个解决方案,感谢Mike Driscoll撰写的这篇精彩教程:"Reportlab: Mixing Fixed Content and Flowables"

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

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。

非常感谢,迈克!