移动测试开发 玩转 Python 之 Reportlab 库:DIY 专属贺卡
引言
Reportlab 是 Python 一个强大的生成 PDF 的工具库。我们可以用它来进行动态的生成 PDF 文件,用于网站的 PDF 动态合成,文书报告等。众所周知,生成一篇文档主要就包括页面、段落、文字,当在绘制图表图片流程图时,我们需要消耗比较大的精力去绘制,调整等,这里我们使用 Reportlab 库的 Table 方法就可以轻松驾驭各式各样的卡片、流程、图表等的绘制,阿基米德说:给我一个支点我可以撬动地球。而给我们一个 Table 方法,我们也能玩转所有精美文档。现在我们就小试牛刀,用 Table 方法来 DIY 一张专属贺卡。
主要内容
• Table 的使用方法
• DIY 专属贺卡
Table 的使用方法
• Table 类
Table(data, colWidths=None, rowHeights=None, style=None, splitByRow=1,
repeatRows=0, repeatCols=0, rowSplitRange=None, spaceBefore=None,
spaceAfter=None, cornerRadii=None)
要使用 Table,先建一个 Table 对象,如上,data 就是传入的数据数组,后面的参数可以定义行高,宽高等,这里不做详细介绍,我们只需要知道如何使用即可。
•TableStyle 类
这个是给 Table 设置 Style,使用它,我们就可以像 word 一样,得到各种格式的表格了。
示例如下:
('LINEABOVE', (0,0), (-1,0), 2, colors.green),
解释:
'LINEABOVE':设置改单元格的边框格式,这个是单元格上划线。
(0,0), (-1,0):代表起止坐标,这里与我们常用的坐标不同,(a,b),a 代表列,b 代表行,左上角正坐标:(0,0),右下角标负坐标第一个是 (-1,-1),这里是指选中表格中从左上角第一行第一列,到最后一列和第一行的所有单元格。
colos.green: 代表此处选中单元格设置的颜色
下面我们加入到代码中,看看得到了什么
# table.py
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle
def table_paragraph():
doc = SimpleDocTemplate("table.pdf", pagesize=letter)
story = []
data = [[1,2,3,4],[5,6,7,8]]
tblstyle = TableStyle([
('LINEABOVE', (0,0), (-1,0), 2, colors.green),
])
tbl = Table(data)
tbl.setStyle(tblstyle)
story.append(tbl)
doc.build(story)
if __name__ == '__main__':
table_paragraph()
这时,我们看到当前目录生成了一个 table.pdf 的文件,打开看看。
看到数组的 1 到 4 列最上面的绿色横线。
Table 还有其他的属性,我们可以利用这些属性制作专属我们的 PDF 卡片。
这里简单介绍后续要用的几个属性:
• SPAN:用于合并单元格,单元格范围内进行合并,使用方法:(SPAN,(a,b),(c,d)),内容只保留起始位置单元格内容。
• ALIGN: 单元格范围内,左右的排列格式,LEFT 是靠左,RIGHT 靠右,CENTER 居中。
• VALIGN: 单元格范围内,上下的排列格式,TOP 是置顶,BOTTOM 靠下,MIDDLE 居中。
DIY 专属卡片
下面我们用 Table 这个属性,来制作一张节日祝福卡片模板:
先设计下我们的卡片大致的样子:
分析下这个贺卡,把它解析成 Table 的样子,如下:
这就简单了,我们只需要建一个 6 行 2 列的 Table,把对应的内容填进去就好了,中间的横线就是单元格的上划线。
代码如下:
# table_paragraph.py
from reportlab.lib import colors
from reportlab.lib.pagesizes import letter
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.units import inch
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Image
from reportlab.platypus import Paragraph
def table_paragraph(name):
doc = SimpleDocTemplate("table_paragraph.pdf", pagesize=letter)
story = []
styles = getSampleStyleSheet()
pheader = f'<font color=black size=14>To {name}: </font>'
p0 = Paragraph(pheader, styles['Normal'])
# 挑选一张精美的图片
im = Image('best_wished.jpeg')
im.drawHeight = 5 * inch * im.drawHeight / im.drawWidth
im.drawWidth = 2.5 * inch
colwidth = 3 * inch
colheight = inch
data = [[im,p0],
['',''],
['', ''],
['',''],
['','Best'],
['','Wishes!'],
]
tblstyle = TableStyle([
('ALIGN', (-1,4), (-1,4), 'LEFT'),
('ALIGN', (-1,-1), (-1,-1), 'RIGHT'),
('TEXTCOLOR',(-1,-2),(-1,-1),colors.black),
('BOX', (0,0), (-1,-1), 0.5, colors.black),
('LINEABOVE', (-1,-4), (-1,-2), 2, colors.black),
('SPAN',(0,0),(0,-1)),
('VALIGN',(-1,-1), (-1,-1),'TOP'),
])
tbl = Table(data, colWidths = colwidth)
tbl.setStyle(tblstyle)
story.append(tbl)
doc.build(story)
if __name__ == '__main__':
name = 'Lily'
table_paragraph(name)
执行下代码,就可以得到一张 DIY 贺卡:
这样看,中间的横线太靠边沿,我们再增加一列空白列,调整下行宽,如下:
修改代码如下:
from reportlab.lib import colors
from reportlab.lib.pagesizes import letter
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.units import inch
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Image
from reportlab.platypus import Paragraph
def table_paragraph(name):
doc = SimpleDocTemplate("table_paragraph.pdf", pagesize=letter)
story = []
styles = getSampleStyleSheet()
pheader = f'<font color=black size=14>To {name}: </font>'
p0 = Paragraph(pheader, styles['Normal'])
# 挑选一张精美的图片
im = Image('best_wished.jpeg')
im.drawHeight = 5 * inch * im.drawHeight / im.drawWidth
im.drawWidth = 3 * inch
colwidth = (3.5 * inch, 2.5 * inch, 0.2*inch)
colheight = inch
data = [[im,p0,''],
['','',''],
['', '',''],
['','',''],
['','Best',''],
['','Wishes!',''],
]
tblstyle = TableStyle([
('ALIGN', (-2,4), (-2,4), 'LEFT'),
('ALIGN', (-2,-1), (-2,-1), 'RIGHT'),
('TEXTCOLOR',(-1,-2),(-1,-1),colors.black),
('BOX', (0,0), (-1,-1), 0.5, colors.black),
('LINEABOVE', (-2,-4), (-2,-2), 2, colors.black),
('SPAN',(0,0),(0,-1)),
('VALIGN',(-2,-1), (-2,-1),'TOP'),
])
tbl = Table(data, colWidths = colwidth)
tbl.setStyle(tblstyle)
story.append(tbl)
doc.build(story)
if __name__ == '__main__':
name = 'Lily'
table_paragraph(name)
得到卡片:
这样我们就制作出一张简单的贺卡,选一张喜欢的图片,把名字输入进去,就可以发给我们的朋友们了。
除此之外,我们还可以用 Table 制作流程图,文书模板等,读者可以后续自行尝试一下。