当前位置: 首页 > news >正文

ReportLab 导出 PDF(图文表格)

ReportLab 导出 PDF(文档创建)
ReportLab 导出 PDF(页面布局)
ReportLab 导出 PDF(图文表格)

文章目录

  • 1. Paragraph(段落)
  • 2. Table(表格)
  • 3. VerticalBarChart(柱形图表)
    • 3.1. 多组多条数据
    • 3.2. 多组单条数据
    • 3.3. 柱状图累加
  • 4. 饼状图
  • 5. Image(图像)
  • 6. 常用颜色
  • 7. 字体与编码

1. Paragraph(段落)

https://blog.csdn.net/weixin_49278803/article/details/132907427

2. Table(表格)

https://www.cnblogs.com/jilingxf/p/15857940.html

3. VerticalBarChart(柱形图表)

参考:
https://blog.csdn.net/weixin_49278803/article/details/132907427
https://www.cnblogs.com/hujq1029/p/7767980.html
https://zhuanlan.zhihu.com/p/528669672

3.1. 多组多条数据

from reportlab.platypus import SimpleDocTemplate
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFontfrom reportlab.graphics.charts.barcharts import VerticalBarChart    # 图表类
from reportlab.graphics.charts.legends import Legend                # 图例类
from reportlab.graphics.shapes import Drawing                       # 绘图工具# 多组多列
def draw_group_bars1(datas: list, categorys: list, legends: list):drawing = Drawing(500, 250)bc = VerticalBarChart()bc.x                            = 45            # 整个图表的x坐标bc.y                            = 45            # 整个图表的y坐标bc.height                       = 200           # 图表的高度bc.width                        = 350           # 图表的宽度bc.data                         = datasbc.strokeColor                  = colors.black  # 顶部和右边轴线的颜色bc.valueAxis.valueMin           = 5000          # 设置y坐标的最小值bc.valueAxis.valueMax           = 26000         # 设置y坐标的最大值bc.valueAxis.valueStep          = 2000          # 设置y坐标的步长bc.groupSpacing                 = 10            # 每组柱状图之间的间隔# bc.barSpacing                   = 1           # 每个柱状图之间的间隔bc.categoryAxis.labels.dx       = 2             # x和y是x轴下方的标签距离x轴远近的坐标bc.categoryAxis.labels.dy       = -8# bc.categoryAxis.labels.angle    = 20            # x轴上描述文字的倾斜角度bc.categoryAxis.categoryNames   = categorysbc.bars[0].fillColor = colors.redbc.bars[1].fillColor = colors.orangebc.bars[2].fillColor = colors.yellowbc.bars[3].fillColor = colors.green# 图示leg = Legend()leg.fontName        = 'simsun'leg.alignment       = 'right'                   # 文字在色块的左或者右leg.boxAnchor       = 'ne'leg.x               = 475                       # 图例的x坐标leg.y               = 240leg.dxTextSpace     = 10                        # 色块与文字之间的间距leg.columnMaximum   = len(legends)leg.colorNamePairs  = legendsdrawing.add(leg)drawing.add(bc)return drawing# 多组多列
def draw_group_bars2(datas: list, categorys: list, legends: list):drawing = Drawing(500, 250)bc = VerticalBarChart()bc.x                            = 45            # 整个图表的x坐标bc.y                            = 45            # 整个图表的y坐标bc.height                       = 200           # 图表的高度bc.width                        = 350           # 图表的宽度bc.data                         = datasbc.strokeColor                  = colors.black  # 顶部和右边轴线的颜色bc.valueAxis.valueMin           = 5000          # 设置y坐标的最小值bc.valueAxis.valueMax           = 26000         # 设置y坐标的最大值bc.valueAxis.valueStep          = 2000          # 设置y坐标的步长bc.groupSpacing                 = 10            # 每组柱状图之间的间隔# bc.barSpacing                   = 1           # 每个柱状图之间的间隔bc.categoryAxis.labels.dx       = 2             # x和y是x轴下方的标签距离x轴远近的坐标bc.categoryAxis.labels.dy       = -8bc.categoryAxis.labels.angle    = 20            # x轴上描述文字的倾斜角度bc.categoryAxis.categoryNames   = categorysbc.bars[0].fillColor = colors.redbc.bars[1].fillColor = colors.orangebc.bars[2].fillColor = colors.yellowbc.bars[3].fillColor = colors.green# 图示leg = Legend()leg.fontName        = 'simsun'leg.alignment       = 'left'                    # 文字在色块的左或者右leg.boxAnchor       = 'ne'leg.x               = 475                       # 图例的x坐标leg.y               = 240leg.dxTextSpace     = 20                        # 色块与文字之间的间距leg.columnMaximum   = len(legends)leg.colorNamePairs  = legendsdrawing.add(leg)drawing.add(bc)return drawingdef main(filename):# pdfmetrics.registerFont(TTFont('微软雅黑', 'msyh.ttf'))pdfmetrics.registerFont(TTFont('simsun', "simsun.ttc"))doc = SimpleDocTemplate(filename, pagesize=A4)Story = []datas = [(25400, 12900, 20100, 20300, 20300, 17400), (15800, 9700, 12982, 20100, 13900, 7623),(20100, 13900, 9700, 12982, 7623, 15800),(12900, 13900, 20300, 9283, 25400, 9700)]categorys = ['BeiJing', 'ChengDu', 'ShenZhen', 'ShangHai', 'HangZhou', 'NanJing']legends = [(colors.red, '标准1'), (colors.orange, '标准2'), (colors.yellow, '标准3'), (colors.green, '标准4')]Story.append(draw_group_bars1(datas, categorys, legends))Story.append(draw_group_bars2(datas, categorys, legends))doc.build(Story)if __name__ == '__main__': main(filename='example.pdf')

在这里插入图片描述

3.2. 多组单条数据

参考:https://dev59.com/uF7Va4cB1Zd3GeqPKod0

from reportlab.platypus import SimpleDocTemplate
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFontfrom reportlab.graphics.charts.barcharts import VerticalBarChart    # 图表类
from reportlab.graphics.charts.legends import Legend                # 图例类
from reportlab.graphics.shapes import Drawing                       # 绘图工具
from reportlab.graphics.shapes import String
from reportlab.graphics.charts.textlabels import Label# 多组单条
def draw_group_bar1(datas: list, categorys: list, legends: list):drawing = Drawing(500, 280)# drawing.add(String(45, 260, "多组单条柱状图", fontSize=14, fontName='simsun', fillColor=colors.black))# 配置图表标题title = Label()title.setText("多组单条柱状图")# title.fontSize, title.fontName, title.dx, title.dy = 14, "simsun", 45, 260title.fontSize, title.fontName, title.x, title.y = 14, "simsun", 45, 260drawing.add(title)bc = VerticalBarChart()bc.x                            = 45            # 整个图表的x坐标bc.y                            = 45            # 整个图表的y坐标bc.height                       = 200           # 图表的高度bc.width                        = 350           # 图表的宽度bc.data                         = datasbc.strokeColor                  = colors.black  # 顶部和右边轴线的颜色bc.valueAxis.valueMin           = 5000          # 设置y坐标的最小值bc.valueAxis.valueMax           = 26000         # 设置y坐标的最大值bc.valueAxis.valueStep          = 2000          # 设置y坐标的步长bc.groupSpacing                 = 10            # 每组柱状图之间的间隔# bc.barSpacing                   = 1           # 每个柱状图之间的间隔bc.categoryAxis.labels.dx       = 2bc.categoryAxis.labels.dy       = -8# bc.categoryAxis.labels.angle    = 20bc.categoryAxis.categoryNames   = categorys# 图形柱上标注文字# bc.barLabels.nudge              = -10           # 文字在图形柱的上下位置bc.barLabels.nudge              = 10            # 文字在图形柱的上下位置# bc.barLabelArray                = labels        # 要添加的文字# bc.barLabelFormat               = 'values'      # 以字符串类型,还有函数类型,不会用# bc.barLabelFormat               = "%0.0f"bc.barLabelFormat               = "%d"bc.bars[0].fillColor = colors.redbc.bars[1].fillColor = colors.orangebc.bars[2].fillColor = colors.yellowbc.bars[3].fillColor = colors.green# 图示leg = Legend()leg.fontName        = 'simsun'leg.alignment       = 'right'                   # 文字在色块的左或者右leg.boxAnchor       = 'ne'leg.x               = 475                       # 图例的x坐标leg.y               = 240leg.dxTextSpace     = 10                        # 色块与文字之间的间距leg.columnMaximum   = len(legends)leg.colorNamePairs  = legendsdrawing.add(leg)drawing.add(bc)return drawingdef draw_group_bar2(datas: list, labels: list, categorys: list, legends: list):drawing = Drawing(500, 280)drawing.add(String(45, 260, "多组单条柱状图", fontSize=14, fontName='simsun', fillColor=colors.black))bc = VerticalBarChart()bc.x                            = 45            # 整个图表的x坐标bc.y                            = 45            # 整个图表的y坐标bc.height                       = 200           # 图表的高度bc.width                        = 350           # 图表的宽度bc.data                         = datasbc.strokeColor                  = colors.black  # 顶部和右边轴线的颜色bc.valueAxis.valueMin           = 5000          # 设置y坐标的最小值bc.valueAxis.valueMax           = 26000         # 设置y坐标的最大值bc.valueAxis.valueStep          = 2000          # 设置y坐标的步长bc.groupSpacing                 = 10            # 每组柱状图之间的间隔# bc.barSpacing                   = 1           # 每个柱状图之间的间隔bc.categoryAxis.labels.dx       = 2bc.categoryAxis.labels.dy       = -8bc.categoryAxis.labels.angle    = 20bc.categoryAxis.categoryNames   = categorys# 图形柱上标注文字# bc.barLabels.nudge              = -10           # 文字在图形柱的上下位置bc.barLabels.nudge              = 10            # 文字在图形柱的上下位置bc.barLabelArray                = labels        # 要添加的文字bc.barLabelFormat               = 'values'      # 以字符串类型,还有函数类型,不会用# bc.barLabelFormat               = "%0.0f"# 每组0-3条的颜色bc.bars[0].fillColor = colors.redbc.bars[1].fillColor = colors.orangebc.bars[2].fillColor = colors.yellowbc.bars[3].fillColor = colors.green# 每组第0条 也就是数组中 第一个元组的颜色bc.bars[(0,0)].fillColor = colors.yellowgreenbc.bars[(0,1)].fillColor = colors.bluebc.bars[(0,2)].fillColor = colors.purplebc.bars[(0,3)].fillColor = colors.perubc.bars[(0,4)].fillColor = colors.pinkbc.bars[(0,5)].fillColor = colors.coral# 第1组(也就是第二组) 第1条(第二条)bc.bars[(1,1)].fillColor = colors.gray# 图示leg = Legend()leg.fontName        = 'simsun'leg.alignment       = 'left'                    # 文字在色块的左或者右leg.boxAnchor       = 'ne'leg.x               = 475                       # 图例的x坐标leg.y               = 240leg.dxTextSpace     = 10                        # 色块与文字之间的间距leg.columnMaximum   = len(legends)leg.colorNamePairs  = legends# drawing.add(leg)drawing.add(bc)return drawingdef main(filename):# pdfmetrics.registerFont(TTFont('微软雅黑', 'msyh.ttf'))pdfmetrics.registerFont(TTFont('simsun', "simsun.ttc"))doc = SimpleDocTemplate(filename, pagesize=A4)Story = []datas = [(25400, 12900, 20100, 20300, 20300, 17400)]categorys = ['BeiJing', 'ChengDu', 'ShenZhen', 'ShangHai', 'HangZhou', 'NanJing']legends = [(colors.red, '标准1'), (colors.orange, '标准2'), (colors.yellow, '标准3'), (colors.green, '标准4')]Story.append(draw_group_bar1(datas, categorys, legends))datas = [(25400, 12900, 20100, 20300, 20300, 17400),(15800, 9700, 12982, 20100, 13900, 7623),]labels = [("25400", "12900", "20100", "20300", "20300", "17400"),("15800", "9700", "12982", "20100", "13900", "7623"),]categorys = ['BeiJing', 'ChengDu', 'ShenZhen', 'ShangHai', 'HangZhou', 'NanJing']legends = [(colors.red, '标准1'), (colors.orange, '标准2'), (colors.yellow, '标准3'), (colors.green, '标准4')]Story.append(draw_group_bar2(datas, labels, categorys, legends))doc.build(Story)if __name__ == '__main__': main(filename='example.pdf')

在这里插入图片描述

3.3. 柱状图累加

from reportlab.platypus import SimpleDocTemplate
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFontfrom reportlab.graphics.charts.barcharts import VerticalBarChart    # 图表类
from reportlab.graphics.charts.legends import Legend                # 图例类
from reportlab.graphics.shapes import Drawing                       # 绘图工具
from reportlab.graphics.shapes import String
from reportlab.graphics.charts.textlabels import Labeldef func(datas: list):minv, maxv, tmpv = 0, 0, 0# print(len(datas), datas)for idxj,val in enumerate(datas[0]):tmpv = 0for idxi in range(len(datas)):tmpv += datas[idxi][idxj]# print("#########333", tmpv)if tmpv < minv:minv = tmpvif tmpv > maxv:maxv = tmpvreturn minv, maxv# 柱状图累加
def draw_group_bar1(datas: list, categorys: list, legends: list):drawing = Drawing(500, 280)# drawing.add(String(45, 260, "柱状图累加", fontSize=14, fontName='simsun', fillColor=colors.black))# 配置图表标题title = Label()title.setText("柱状图累加")# title.fontSize, title.fontName, title.dx, title.dy = 14, "simsun", 45, 260title.fontSize, title.fontName, title.x, title.y = 14, "simsun", 45, 260drawing.add(title)width                           = 350height                          = 200# 调整stepminv, maxv = func(datas)maxAxis                         = int(height/20)# step                            = int((maxv-minv+maxAxis-1)/maxAxis)    # 向上取整step                            = int((maxv-minv)/maxAxis)    # 向上取整bc = VerticalBarChart()bc.x                            = 45            # 整个图表的x坐标bc.y                            = 45            # 整个图表的y坐标bc.height                       = height        # 图表的高度bc.width                        = width         # 图表的宽度bc.data                         = datasbc.strokeColor                  = colors.black  # 顶部和右边轴线的颜色bc.valueAxis.valueMin           = minv          # 设置y坐标的最小值bc.valueAxis.valueMax           = maxv*1.5      # 设置y坐标的最大值bc.valueAxis.valueStep          = step          # 设置y坐标的步长bc.groupSpacing                 = 10            # 每组柱状图之间的间隔# bc.barSpacing                   = 1           # 每个柱状图之间的间隔bc.categoryAxis.labels.dx       = 2bc.categoryAxis.labels.dy       = -8bc.categoryAxis.labels.angle    = 20bc.categoryAxis.categoryNames   = categorys# 图形柱上标注文字# bc.barLabels.nudge              = -10           # 文字在图形柱的上下位置bc.barLabels.nudge              = 10            # 文字在图形柱的上下位置bc.barLabelFormat               = "%0.0f"# 柱状图累加bc.categoryAxis.style           = 'stacked'# 图形柱上标注文字# bc.barLabels.nudge              = -10           # 文字在图形柱的上下位置bc.barLabels.nudge              = 10            # 文字在图形柱的上下位置# bc.barLabelArray                = labels        # 要添加的文字# bc.barLabelFormat               = 'values'      # 以字符串类型,还有函数类型,不会用# bc.barLabelFormat               = "%0.0f"bc.barLabelFormat               = "%d"# bc.bars[0].fillColor = colors.red# bc.bars[1].fillColor = colors.orange# bc.bars[2].fillColor = colors.yellow# bc.bars[3].fillColor = colors.greencolorsb = [colors.yellowgreen, colors.blue, colors.purple, colors.peru, colors.pink, colors.coral] colorsg = [colors.red, colors.orange, colors.yellow, colors.green] for j in range(len(datas)):setattr(bc.bars[j], 'fillColor', colorsg[j])  # bar_color若含有多种颜色在这里分配bar_color[j]# 图示leg = Legend()leg.fontName        = 'simsun'leg.alignment       = 'right'                   # 文字在色块的左或者右leg.boxAnchor       = 'ne'leg.x               = 475                       # 图例的x坐标leg.y               = 240leg.dxTextSpace     = 10                        # 色块与文字之间的间距leg.columnMaximum   = len(legends)leg.colorNamePairs  = legendsdrawing.add(leg)drawing.add(bc)return drawingdef draw_group_bar2(datas: list, categorys: list, legends: list):drawing = Drawing(500, 280)drawing.add(String(45, 260, "多组单条柱状图", fontSize=14, fontName='simsun', fillColor=colors.black))width                           = 350height                          = 200# 调整stepminv, maxv = func(datas)maxAxis                         = int(height/20)# step                            = int((maxv-minv+maxAxis-1)/maxAxis)    # 向上取整step                            = int((maxv-minv)/maxAxis)    # 向上取整bc = VerticalBarChart()bc.x                            = 45            # 整个图表的x坐标bc.y                            = 45            # 整个图表的y坐标bc.height                       = height        # 图表的高度bc.width                        = width         # 图表的宽度bc.data                         = datasbc.strokeColor                  = colors.black  # 顶部和右边轴线的颜色bc.valueAxis.valueMin           = minv          # 设置y坐标的最小值bc.valueAxis.valueMax           = maxv*1.5      # 设置y坐标的最大值bc.valueAxis.valueStep          = step          # 设置y坐标的步长bc.groupSpacing                 = 10            # 每组柱状图之间的间隔# bc.barSpacing                   = 1           # 每个柱状图之间的间隔bc.categoryAxis.labels.dx       = 2bc.categoryAxis.labels.dy       = -8bc.categoryAxis.labels.angle    = 20bc.categoryAxis.categoryNames   = categorys# 图形柱上标注文字# bc.barLabels.nudge              = -10           # 文字在图形柱的上下位置bc.barLabels.nudge              = 10            # 文字在图形柱的上下位置bc.barLabelFormat               = "%0.0f"# 柱状图累加bc.categoryAxis.style           = 'stacked'colorsb = [colors.yellowgreen, colors.blue, colors.purple, colors.peru, colors.pink, colors.coral] colorsg = [colors.red, colors.orange, colors.yellow, colors.green] # for j in range(len(datas)):#     print("#################33", j)#     setattr(bc.bars[j], 'fillColor', colorsg[j])  # bar_color若含有多种颜色在这里分配bar_color[j]for idxi in range(len(datas)):for idxj in range(len(datas[0])):if idxi == 0:setattr(bc.bars[(idxi, idxj)], 'fillColor', colorsb[idxj])else:setattr(bc.bars[(idxi, idxj)], 'fillColor', colorsg[idxi])# 图示leg = Legend()leg.fontName        = 'simsun'leg.alignment       = 'left'                    # 文字在色块的左或者右leg.boxAnchor       = 'ne'leg.x               = 475                       # 图例的x坐标leg.y               = 240leg.dxTextSpace     = 10                        # 色块与文字之间的间距leg.columnMaximum   = len(legends)leg.colorNamePairs  = legends# drawing.add(leg)drawing.add(bc)return drawingdef main(filename):# pdfmetrics.registerFont(TTFont('微软雅黑', 'msyh.ttf'))pdfmetrics.registerFont(TTFont('simsun', "simsun.ttc"))doc = SimpleDocTemplate(filename, pagesize=A4)Story = []datas = [(25400, 12900, 20100, 20300, 20300, 17400),(15800, 9700, 12982, 20100, 13900, 7623),]categorys = ['BeiJing', 'ChengDu', 'ShenZhen', 'ShangHai', 'HangZhou', 'NanJing']legends = [(colors.red, '标准1'), (colors.orange, '标准2'), (colors.yellow, '标准3'), (colors.green, '标准4')]Story.append(draw_group_bar1(datas, categorys, legends))Story.append(draw_group_bar2(datas, categorys, legends))doc.build(Story)if __name__ == '__main__': main(filename='example.pdf')

在这里插入图片描述

4. 饼状图

5. Image(图像)

6. 常用颜色

在这里插入图片描述

7. 字体与编码

https://blog.csdn.net/qq_40596572/article/details/102896520
字体
https://blog.csdn.net/qtlyx/article/details/99653081

相关文章:

  • 企业办理林业调查规划设计资质的核心是什么?
  • 英语16种时态
  • Dify智能体平台源码二次开发笔记(7) - 优化知识库pdf识别(2)
  • 小刚说C语言刷题——1020 算算和是多少
  • 半导体制造如何数字化转型
  • 158页PPT | 某大型研发制造集团信息化IT规划整体方案
  • 电脑一直不关机会怎么样?电脑长时间不关机的影响
  • 解释原型链的概念,并说明`Object.prototype.__proto__`的值是什么?
  • C#核心(24)结构体和类的区别,抽象类和接口的区别(面试常问)
  • LRU算法
  • 智能超表面通信控制板--通道电压并行控制版
  • 【网络入侵检测】Suricata之数据包内容匹配
  • ABAP_报表权限校验_拿来即用
  • Excel表格转Json格式
  • springboot启动动态定时任务
  • GTX 不同复位之间的区别
  • LeetCode-16.最接近的三数之和 C++实现
  • 保姆级教程:RK3588部署yolo目标检测模型
  • HarmontOS-ArkUI V2状态 !!语法糖 双向绑定
  • AI(人工智能)学习中的主要分类及其详细说明
  • 制作网站需要域名还需要什么/推广普通话手抄报图片
  • 网站设计效果专业乐云seo/怎么建立一个属于自己的网站
  • 网站开发设计语言/优化方案的格式及范文
  • 做电影网站用什么主机好/重庆seo排名优化费用
  • 用dw如何做网站首页/营销策划方案ppt
  • wordpress自定义字段调用/深圳正规seo