批量处理更香啊,python可轻松制作图文并茂的pdf报告(代码片段)

Python学习与数据挖掘 Python学习与数据挖掘     2023-03-12     637

关键词:

大家好,reportlab 是 Python 的一个非常棒的标准库,它可以画图、画表格、编辑文字,可以输出PDF格式。

今天我利用 Python 的 reportlab 工具包制作图文并茂的PDF报表,喜欢本文记得收藏、关注、点赞。

注:完整版代码、技术交流,文末获取

安装第三方库

reportlab输入Python的第三方库,使用前需要先安装:pip install reportlab

模块导入

提前导入相关内容,并且注册字体。(注册字体前需要先准备好字体文件)

from reportlab.pdfbase import pdfmetrics   # 注册字体
from reportlab.pdfbase.ttfonts import TTFont # 字体类
from reportlab.platypus import Table, SimpleDocTemplate, Paragraph, Image  # 报告内容相关类
from reportlab.lib.pagesizes import letter  # 页面的标志尺寸(8.5*inch, 11*inch)
from reportlab.lib.styles import getSampleStyleSheet  # 文本样式
from reportlab.lib import colors  # 颜色模块
from reportlab.graphics.charts.barcharts import VerticalBarChart  # 图表类
from reportlab.graphics.charts.legends import Legend  # 图例类
from reportlab.graphics.shapes import Drawing  # 绘图工具
from reportlab.lib.units import cm  # 单位:cm

# 注册字体(提前准备好字体文件, 如果同一个文件需要多种字体可以注册多个)
pdfmetrics.registerFont(TTFont('SimSun', 'SimSun.ttf'))

封装不同内容对应的函数

创建一个Graphs类,通过不同的静态方法提供不同的报告内容,包括:标题、普通段落、图片、表格和图表。函数中的相关数据目前绝大多数都是固定值,可以根据情况自行设置成相关参数。

class Graphs:
    # 绘制标题
    @staticmethod
    def draw_title(title: str):
        # 获取所有样式表
        style = getSampleStyleSheet()
        # 拿到标题样式
        ct = style['Heading1']
        # 单独设置样式相关属性
        ct.fontName = 'SimSun'      # 字体名
        ct.fontSize = 18            # 字体大小
        ct.leading = 50             # 行间距
        ct.textColor = colors.green     # 字体颜色
        ct.alignment = 1    # 居中
        ct.bold = True
        # 创建标题对应的段落,并且返回
        return Paragraph(title, ct)
      
  # 绘制小标题
    @staticmethod
    def draw_little_title(title: str):
        # 获取所有样式表
        style = getSampleStyleSheet()
        # 拿到标题样式
        ct = style['Normal']
        # 单独设置样式相关属性
        ct.fontName = 'SimSun'  # 字体名
        ct.fontSize = 15  # 字体大小
        ct.leading = 30  # 行间距
        ct.textColor = colors.red  # 字体颜色
        # 创建标题对应的段落,并且返回
        return Paragraph(title, ct)

    # 绘制普通段落内容
    @staticmethod
    def draw_text(text: str):
        # 获取所有样式表
        style = getSampleStyleSheet()
        # 获取普通样式
        ct = style['Normal']
        ct.fontName = 'SimSun'
        ct.fontSize = 12
        ct.wordWrap = 'CJK'     # 设置自动换行
        ct.alignment = 0        # 左对齐
        ct.firstLineIndent = 32     # 第一行开头空格
        ct.leading = 25
        return Paragraph(text, ct)

    # 绘制表格
    @staticmethod
    def draw_table(*args):
        # 列宽度
        col_width = 120
        style = [
            ('FONTNAME', (0, 0), (-1, -1), 'SimSun'),  # 字体
            ('FONTSIZE', (0, 0), (-1, 0), 12),  # 第一行的字体大小
            ('FONTSIZE', (0, 1), (-1, -1), 10),  # 第二行到最后一行的字体大小
            ('BACKGROUND', (0, 0), (-1, 0), '#d5dae6'),  # 设置第一行背景颜色
            ('ALIGN', (0, 0), (-1, -1), 'CENTER'),  # 第一行水平居中
            ('ALIGN', (0, 1), (-1, -1), 'LEFT'),  # 第二行到最后一行左右左对齐
            ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),  # 所有表格上下居中对齐
            ('TEXTCOLOR', (0, 0), (-1, -1), colors.darkslategray),  # 设置表格内文字颜色
            ('GRID', (0, 0), (-1, -1), 0.5, colors.grey),  # 设置表格框线为grey色,线宽为0.5
            # ('SPAN', (0, 1), (0, 2)),  # 合并第一列二三行
            # ('SPAN', (0, 3), (0, 4)),  # 合并第一列三四行
            # ('SPAN', (0, 5), (0, 6)),  # 合并第一列五六行
            # ('SPAN', (0, 7), (0, 8)),  # 合并第一列五六行
        ]
        table = Table(args, colWidths=col_width, style=style)
        return table

    # 创建图表
    @staticmethod
    def draw_bar(bar_data: list, ax: list, items: list):
        drawing = Drawing(500, 250)
        bc = VerticalBarChart()
        bc.x = 45       # 整个图表的x坐标
        bc.y = 45      # 整个图表的y坐标
        bc.height = 200     # 图表的高度
        bc.width = 350      # 图表的宽度
        bc.data = bar_data
        bc.strokeColor = colors.black       # 顶部和右边轴线的颜色
        bc.valueAxis.valueMin = 5000           # 设置y坐标的最小值
        bc.valueAxis.valueMax = 26000         # 设置y坐标的最大值
        bc.valueAxis.valueStep = 2000         # 设置y坐标的步长
        bc.categoryAxis.labels.dx = 2
        bc.categoryAxis.labels.dy = -8
        bc.categoryAxis.labels.angle = 20
        bc.categoryAxis.categoryNames = ax

        # 图示
        leg = Legend()
        leg.fontName = 'SimSun'
        leg.alignment = 'right'
        leg.boxAnchor = 'ne'
        leg.x = 475         # 图例的x坐标
        leg.y = 240
        leg.dxTextSpace = 10
        leg.columnMaximum = 3
        leg.colorNamePairs = items
        drawing.add(leg)
        drawing.add(bc)
        return drawing

    # 绘制图片
    @staticmethod
    def draw_img(path):
        img = Image(path)       # 读取指定路径下的图片
        img.drawWidth = 5*cm        # 设置图片的宽度
        img.drawHeight = 8*cm       # 设置图片的高度
        return img

生成报告

if __name__ == '__main__':
    # 创建内容对应的空列表
    content = list()

    # 添加标题
    content.append(Graphs.draw_title('数据分析就业薪资'))

    # 添加图片
    content.append(Graphs.draw_img('抗疫必胜.png'))

    # 添加段落文字
    content.append(Graphs.draw_text('众所周知,大数据分析师岗位是香饽饽,近几年数据分析热席卷了整个互联网行业,与数据分析的相关的岗位招聘、培训数不胜数。很多人前赴后继,想要参与到这波红利当中。那么数据分析师就业前景到底怎么样呢?'))
    # 添加小标题
    content.append(Graphs.draw_title(''))
    content.append(Graphs.draw_little_title('不同级别的平均薪资'))
    # 添加表格
    data = [
        ('职位名称', '平均薪资', '较上年增长率'),
        ('数据分析师', '18.5K', '25%'),
        ('高级数据分析师', '25.5K', '14%'),
        ('资深数据分析师', '29.3K', '10%')
    ]
    content.append(Graphs.draw_table(*data))

    # 生成图表
    content.append(Graphs.draw_title(''))
    content.append(Graphs.draw_little_title('热门城市的就业情况'))
    b_data = [(25400, 12900, 20100, 20300, 20300, 17400), (15800, 9700, 12982, 9283, 13900, 7623)]
    ax_data = ['BeiJing', 'ChengDu', 'ShenZhen', 'ShangHai', 'HangZhou', 'NanJing']
    leg_items = [(colors.red, '平均薪资'), (colors.green, '招聘量')]
    content.append(Graphs.draw_bar(b_data, ax_data, leg_items))

    # 生成pdf文件
    doc = SimpleDocTemplate('report.pdf', pagesize=letter)
    doc.build(content)

生成报告的结果如下:

推荐文章

技术交流

欢迎转载、收藏、有所收获点赞支持一下!数据、代码可以找我获取

目前开通了技术交流群,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友

  • 方式①、发送如下图片至微信,长按识别,后台回复:加群;
  • 方式②、添加微信号:dkl88191,备注:来自CSDN
  • 方式③、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

用python轻松制作一个股票k线图网站(代码片段)

...人手一个Web服务的年代,GUI程序还是没有Web服务来的香啊。我们需要用到的知识包括PyEcharts的使用,tushare库获取股票数据的方法以及Flask的基本用法。获取股票数据我们先来看下tushar 查看详情

图片怎么快速批量去水印?

批量去水印可能性不大,因为水印不同图片大小、位置、形状可能都是不一样的,很难用图片处理软件批量去除水印的。追问水印云软件处理水印效果不错,很便利,对新手很友好,没有繁琐的步骤和乱七八糟的广告,图片,视... 查看详情

批量--08---流水线版本制作

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录流水线交付流水线版本制作异常处理流水线交付`流水线版本制作异常处理 查看详情

批量--08---流水线版本制作

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录流水线交付流水线版本制作异常处理流水线交付`流水线版本制作 查看详情

python在批量线程中运行可并行化的函数,等待每个批处理完成。这允许计算机的全部资源b(代码片段)

查看详情

arcgis中的批量处理

 在实际生产过程中,经常遇到批量处理数据的情况。在ArcGIS中,除自己写代码来处理这类问题外,它提供了一个批量处理的工具,在ToolBox对应的工具上右键即可选择批处理工具。和单个处理方式一样,输入参数,通过添加... 查看详情

python-类与对象如何创建可管理的对象属性(图文并茂)(代码片段)

创建可管理的对象属性问题描述实现需求类装饰器@propertyproperty()函数问题描述在面向对象编程中,我们把方法看作对象的接口直接访问对象的属性可能是不安全的,或在设计上不够灵活,但是使用调用方法在形式... 查看详情

批量复制字符

】批量复制字符【英文标题】:Batchcopycharacter【发布时间】:2020-09-3021:27:58【问题描述】:所以,我正在尝试创建一个包含大量批处理文件的文件夹,每个批处理文件都会将某个字符复制到剪贴板。我的第一个是ñ。我制作了一... 查看详情

深入解析,python合并多张图片成视频,可用于批量制作短视频(代码片段)

随着短视频的兴起,越来越多的人开始用各种形式进行视频制作,本篇博客从程序员的角度为大家解析一下如何通过Python合并多个图片为一个视频文章目录合并多张图片到视频的方法说明moviepy将多张图片合成视频导入所... 查看详情

如何防韩?python两三行代码轻松批量添加~

嗨害大家好鸭~我是小熊猫🖤一直想做一个这种系列的但是因为七七八八的事情总是忘记,今天正好有空,来开整一下~首先,天冷防韩是什么梗?【天冷防韩】“天冷防韩”是“天冷防寒”的谐音,不过“寒”指的是天气寒... 查看详情

python和java应该学习哪个更香呢?

不过这并不是我们现在所要考虑的,回到原题Java和python学习那个会比较好呢?我们可以重好几个方面去选择分析:Python和Java都受到编程行业的高度欢迎,都提供了许多职业机会。以国外市场上来讲,平均有大... 查看详情

unity图文混排textmeshpro

...张做好的合图(单个表情的大小最好一模一样)1图片导入后处理图片导入unity后设置 最后在spriteEditor中分割图片设置类型为gridbycellsize 设置每个表情格子的大小 最后点slice2选中刚才处理好的图片右键后生成spriteAssert至... 查看详情

pcb中加入任意logo图文说明精心制作

防静电图首先我们要对下载下来的图片进行处理否则Altiumdesigner6.9会提示装载的图片不是单色的,用PhotoshopCS打开开始下载的图片选择图像→模式→灰度在选择图像→模式→位图弹出选项直接点击确定这是处理好后的图片保存图... 查看详情

500个轻松处理,python自动化读写word文档真香啊(代码片段)

大家好,最近有同事需要批量出500个Word文档,按照1个Word文档耗时1分钟来算也需要8.33小时足足有1天工时。于是,这位同事找到了我帮忙,接过需求花了不到30分钟写好脚本,运行脚本不到1分钟就生成了500份Wo... 查看详情

arcmap进行标记符号制作

...遵循以下几方面:符号制作必须根据一定的规范进行处理符号是现实的抽象表达ArcGIS符号遵循层的概念可利用图像处理、字体软件等工具进行符号前期处理ArcGIS的 查看详情

arcmap进行标记符号制作

...遵循以下几方面:符号制作必须根据一定的规范进行处理符号是现实的抽象表达ArcGIS符号遵循层的概念可利用图像处理、字体软件等工具进行符号前期处理ArcGIS的 查看详情

python-类与对象如何创建可管理的对象属性(图文并茂)(代码片段)

创建可管理的对象属性问题描述实现需求类装饰器@propertyproperty()函数问题描述在面向对象编程中,我们把方法看作对象的接口直接访问对象的属性可能是不安全的,或在设计上不够灵活,但是使用调用方法在形式... 查看详情

python轻松制作精美表格(代码片段)

分享一个Python工具plottable,轻松制作高度个性化的表格,底层为Matplotlib。例如这样的,或者这样的, 第一张图详细代码:#导入相关包frompathlibimportPathimportmatplotlibimportmatplotlib.pyplotaspltimportnumpyasnpimportpandasaspdf... 查看详情