移动测试开发 玩转 Python 之 Reportlab 库:DIY 专属贺卡

opentest-oper@360.cn · 2022年08月25日 · 3995 次阅读

引言

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 制作流程图,文书模板等,读者可以后续自行尝试一下。

参考
ReportLab PDF Generation User Guide

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册