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

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://docs.reportlab.com/reportlab/userguide/ch6_paragraphs/

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

canvas.drawString(80, 700, 'Standard String')				# 标准绘制函数
canvas.drawRightString(80, 680, 'Right String')				# x轴右对齐绘制函数
canvas.drawAlignedString(60, y, str(number))				# 轴对称绘制函数
canvas.drawCentredString(width/2, 550, 'Centered String')	# 中心对称绘制函数

https://blog.csdn.net/icloudend/article/details/98902717

2. Table(表格)

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

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.platypus import Table, Paragraph, TableStyle
from reportlab.lib.styles import ParagraphStyle, getSampleStyleSheetdef draw_table1(datas: list):col_widths, row_heights = [80, 100, 100, 100, 100], [60, 50, 50, 50, 50, 50]# 表格行列的表达形式为(x, y):左上方第一个单元格为(0, 0), 右下角单元格为(-1, -1)table_style = TableStyle([("FONT", (0, 0), (0, -1), "simsun", 15),                # 第一列:配置字体("FONT", (0, 0), (-1, 0), "simsun", 15),                # 第一行:("FONT", (1, 1), (-1, -1), "simsun", 12),("ALIGN", (0, 0), (-1, -1), "CENTER"),                  # 水平居中("VALIGN", (0, 0), (-1, -1), "MIDDLE"),                 # 垂直居中("INNERGRID", (0, 0), (-1, -1), 0.25, colors.black),    # 单元格分割线("BOX", (0, 0), (-1, -1), 0.25, colors.black),          # 边框("BACKGROUND", (0, 0), (-1, -1), colors.lightgrey),     # 背景色(默认为白色)("TEXTCOLOR", (0, 0), (-1, 0), colors.red),             # 第一行: 区域字体颜色("LINEBELOW", (0,-1), (-1,-1), 0, colors.white),        # 移除最后一行的下框线,延申LINEABOVE(上框线)、LINEBEFORE(左框线)、LINEAFTER(右框线)# ("GRID", (0, 0), (-1, -1), 0.5, colors.black),        # 表格框线为灰色,线宽为0.5# ("SPAN", (0, 3), (-1, 3)),                              # 合并单元格])return Table(datas, colWidths=col_widths, rowHeights=row_heights, style=table_style)def draw_table2(datas: list):col_widths, row_heights = [80, 100, 100, 100, 100], [30, 25, 25, 25, 25, 25]# 表格行列的表达形式为(x, y):左上方第一个单元格为(0, 0), 右下角单元格为(-1, -1)table_style = TableStyle([("FONT", (0, 0), (0, -1), "simsun", 20),                # 第一列:配置字体("FONT", (0, 0), (-1, 0), "simsun", 15),                # 第一行:("FONT", (1, 1), (-1, -1), "simsun", 15),("ALIGN", (0, 0), (-1, -1), "CENTER"),                  # 水平居中("VALIGN", (0, 0), (-1, -1), "MIDDLE"),                 # 垂直居中("INNERGRID", (0, 0), (-1, -1), 0.25, colors.black),    # 单元格分割线("BOX", (0, 0), (-1, -1), 0.25, colors.black),          # 边框# ("BACKGROUND", (0, 0), (-1, -1), colors.lightgrey),     # 背景色(默认为白色)("TEXTCOLOR", (0, 0), (-1, 0), colors.red),             # 第一行: 区域字体颜色# ("LINEBELOW", (0,-1), (-1,-1), 0, colors.white),        # 移除最后一行的下框线,延申LINEABOVE(上框线)、LINEBEFORE(左框线)、LINEAFTER(右框线)# ("GRID", (0, 0), (-1, -1), 0.5, colors.black),        # 表格框线为灰色,线宽为0.5("SPAN", (0, 3), (-1, 3)),                              # 合并单元格])return Table(datas, colWidths=col_widths, rowHeights=row_heights, style=table_style)def main(filename):# pdfmetrics.registerFont(TTFont('微软雅黑', 'msyh.ttf'))pdfmetrics.registerFont(TTFont('simsun', "simsun.ttc"))doc = SimpleDocTemplate(filename, pagesize=A4)Story = []datas = [["姓名", "语文", "数学", "英语", "体育"],["张三", 91, 97, 79, "良好"],["李四", 99, 87, 73, "优秀"],["王五", 86, 89, 83, "良好"],["赵六", 95, 88, 86, "良好"],# 当需要将数据在一个单元格分两列的话,可以用下面的语法["孙七", 79, 95, 98, "良"+"\n"+"好"],]# 编辑表格标题及样式tabletitle = """<para alignment=center fontName="simsun" fontSize=20 spaceAfter=30>表1: 学生成绩表</para>"""# 可以配置上下左右页边距,topMargin=1*cm,bottomMargin=1*cm,leftMargin=1*cm,rightMargin=1*cmStory.append(Paragraph(tabletitle, getSampleStyleSheet()["Normal"]))Story.append(draw_table1(datas))tabletitle = """<para alignment=center fontName="simsun" fontSize=20 spaceBefore=30 spaceAfter=30>表1: 学生成绩表</para>"""Story.append(Paragraph(tabletitle))Story.append(draw_table2(datas))doc.build(Story)if __name__ == '__main__': main(filename='example.pdf')

在这里插入图片描述

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.2      # 设置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"## 0-3条柱形图的颜色# 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 idxi in range(len(datas)):setattr(bc.bars[idxi], 'fillColor', colorsg[idxi])  # 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.2      # 设置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 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

相关文章:

ReportLab 导出 PDF(图文表格)

ReportLab 导出 PDF&#xff08;文档创建&#xff09; ReportLab 导出 PDF&#xff08;页面布局&#xff09; ReportLab 导出 PDF&#xff08;图文表格) 文章目录 1. Paragraph&#xff08;段落&#xff09;2. Table&#xff08;表格&#xff09;3. VerticalBarChart&#xff0…...

【Kubernetes基础--Service深入理解】--查阅笔记4

目录 Service 的用法docker 对外提供服务service 对外提供服务 从集群外部访问 Pod 或 Service将容器应用的端口号映射到物理机将 Service 的端口号映射到物理机 Ingress&#xff1a;HTTP 7层路由机制创建Ingress Controller和默认的backend服务 k8s 通过创建 Service&#xff…...

蓝桥杯 5. Excel地址

原题目链接 题目描述 Excel 单元格的地址表示很有趣&#xff0c;它使用字母来表示列号。例如&#xff1a; A 表示第 1 列B 表示第 2 列...Z 表示第 26 列AA 表示第 27 列AB 表示第 28 列BA 表示第 53 列... Excel 的最大列号是有限的&#xff0c;但本题将这种表示法一般化&…...

yolov8复现

Yolov8的复现流程主要包含环境配置、下载源码和验证环境三大步骤&#xff1a; 环境配置 查看电脑状况&#xff1a;通过任务管理器查看电脑是否有独立显卡&#xff08;NVIDIA卡&#xff09;。若有&#xff0c;后续可安装GPU版本的pytorch以加速训练&#xff1b;若没有&#xff0…...

C#学习第15天:泛型

什么是泛型&#xff1f; 定义&#xff1a;泛型允许您在类、接口和方法中定义占位符&#xff0c;这些占位符在使用时可以指定为具体的类型。作用&#xff1a;通过减少重复代码和提供更强的类型检查&#xff0c;提高了代码的可重用性和性能。 泛型的核心概念 1.泛型类 泛型类能…...

WPF ObjectDataProvider

在 WPF(Windows Presentation Foundation)中,ObjectDataProvider 是一个非常有用的类,用于将非 UI 数据对象(如业务逻辑类或服务类)与 XAML 绑定集成。它允许在 XAML 中直接调用方法、访问属性或实例化对象,而无需编写额外的代码。以下是关于 ObjectDataProvider 的详细…...

Windows系统安装RustDesk Server的详细步骤和客户端设置

Windows系统安装RustDesk Server的详细步骤 在Windows系统上安装RustDesk Server涉及几个关键步骤,包括安装必要的依赖、下载RustDesk Server程序、配置并启动服务。以下是详细的步骤: 1. 安装Node.js和PM2 RustDesk Server的某些版本可能需要Node.js环境来运行,而PM2是一…...

RestSharp和Newtonsoft.Json结合发送和解析http

1.下载RestSharp和Newtonsoft.Json 2编写ApiRequest和ApiResponse和调用工具类HttpRestClient 请求模型 /// <summary>/// 请求模型/// </summary>public class ApiRequest{/// <summary>/// 请求地址/api路由地址/// </summary>public string Route {…...

《基于 RNN 的股票预测模型代码优化:从重塑到直接可视化》

在深度学习领域&#xff0c;使用循环神经网络&#xff08;RNN&#xff09;进行股票价格预测是一个常见且具有挑战性的任务。本文将围绕一段基于 RNN 的股票预测代码的改动前后差别展开&#xff0c;深入剖析代码的优化思路和效果。 原始代码思路与问题 原始代码实现了一个完整…...

【Pytorch之一】--torch.stack()方法详解

torch.stack方法详解 pytorch官网注释 Parameters tensors&#xff1a;张量序列&#xff0c;也就是要进行stack操作的对象们&#xff0c;可以有很多个张量。 dim&#xff1a;按照dim的方式对这些张量进行stack操作&#xff0c;也就是你要按照哪种堆叠方式对张量进行堆叠。dim的…...

半导体设备通信标准—secsgem v0.3.0版本使用说明文档(3)之SECS(SEMI E4,SEMI E5)

文章目录 1、变量1.1、数组类型1.2、获取数据1.3、设置数据1.4、编码/解码1.5、Array1.6、List1.7、动态变量 2、Items2.1、 Item types2.2、 Creating items2.1.1、 From value2.1.2、From SML text2.1.3、 From protocol text 2.3、 Getting data2.3.1、 Python value2.3.2、…...

数据中台(大数据平台)之数据资源目录

数据资源目录是数据管理的账本&#xff0c;是数据应用的基础&#xff0c;更是是数据治理成果的体现&#xff0c;因此数据中台产品应提供数据资源目录编制、发布、资源挂载、下架的管理能力。 1.数据资源目录分类 资源目录能够支持基于业务特点创建和维护基础目录分类和特色目…...

【随身WiFi】随身WiFi Debian系统优化教程

0.操作前必看 本教程基于Debian系统进行优化&#xff0c;有些操作对随身WiFi来说可能会带来负优化&#xff0c;根据需要选择。 所有操作需要在root用户环境下运行&#xff0c;否则都要加sudo 随身wifi Debian系统&#xff0c;可以去某安的随声WiFi模块自行搜索刷机 点赞&am…...

【WORD】批量将doc转为docx

具体步骤进行&#xff1a; 打开Word文档&#xff0c;按下AltF11快捷键&#xff0c;打开VBA编辑器。在VBA编辑器中&#xff0c;左侧的“项目资源管理器”窗口会显示当前打开的Word文档相关项目。找到您要添加代码的文档项目&#xff08;通常以文档名称命名&#xff09;&#xf…...

JAVA Web_定义Servlet2_学生登录验证Servlet

题目 页面StudentLogin.html中有一HTML的表单代码如下&#xff1a; <form action"studentLogin" method"post">学生姓名&#xff1a;<input type"text" name"stuName" value""><br>登录密码&#xff1a;…...

深入理解设计模式之模板方法模式 1d87ab8b42e98069b6c2c5a3d2710f9a

深入理解设计模式之模板方法模式 深入理解设计模式之模板方法模式 在软件开发的漫长征程中&#xff0c;我们常常会遇到各种复杂的业务逻辑&#xff0c;其中部分逻辑具有相似的流程框架&#xff0c;但在具体细节上又有所不同。这种情况下&#xff0c;模板方法模式就如同一位得…...

Unity入门笔记(缘更)

内容来源SiKi学院的Luna’s Fantasy 文章目录 一、基础知识1.准备2.基础知识1.层级(Layer)2.轴心点3.预制体(Prefab)4.刚体组件(Rigidbody)5.碰撞器组件(BoxCollider) 二、代码1.移动 一、基础知识 1.准备 Unity安装&#xff1a; https://unity.cn 2.基础知识 1.层级(Layer…...

【Python】用Python写一个俄罗斯方块玩玩

【Python】用Python写一个俄罗斯方块玩玩 一、引言1.成品效果展示 二、思考准备1.思考设计2.代码设计2.1 游戏页面2.2 控件设计2.2.1 方块生成2.2.2 方块碰撞2.2.3 方块消融2.2.4 游戏主循环2.2.5 游戏窗口 三、游戏完整版 一、引言 今日看到侄子在玩游戏&#xff0c;凑近一看…...

Java 本地缓存的实现:常见的四种方式

在 Java 中&#xff0c;常用的本地缓存实现主要有以下几种&#xff0c;以下是它们的代码示例及适用场景&#xff1a; 一、‌使用 ConcurrentHashMap 实现简单缓存‌ 适合轻量级、无需复杂淘汰策略的场景。 import java.util.concurrent.ConcurrentHashMap;public class Simp…...

记录一次生产中mysql主备延迟问题处理

登录库&#xff1a; mysql -uXXXX -pXXXX -P3306 -hXXXXXX -A 备库上执行&#xff1a;show slave status\G 查看 seconds_Behind_Master&#xff0c;延迟 2705s&#xff0c;而且还一直在增加。 SHOW CREATE TABLE proc_i_income_temp; -- 查看表的结构 show index from proc…...

路由器原理与配置技术详解

一、路由基础原理 1.1 路由器的核心功能 网络层设备&#xff1a;工作在OSI参考模型第三层&#xff0c;实现不同网络间的互联互通智能路径选择&#xff1a;基于路由表为数据包选择最优传输路径协议转换&#xff1a;处理不同网络接口间的协议差异&#xff08;如以太网与PPP&…...

第五节:React Hooks进阶篇-如何用useMemo/useCallback优化性能

反模式&#xff1a;滥用导致的内存开销React 19编译器自动Memoization原理 React Hooks 性能优化进阶&#xff1a;从手动到自动 Memoization &#xff08;基于 React 18 及以下版本&#xff0c;结合 React 19 新特性分析&#xff09; 一、useMemo/useCallback 的正确使用场景…...

STL迭代器:C++泛型编程的核心工具 [特殊字符]

在C中&#xff0c;STL&#xff08;标准模板库&#xff09;的迭代器是泛型编程的核心&#xff0c;它不仅解决了指针的局限性&#xff0c;还为算法与容器之间提供了抽象的访问接口。接下来&#xff0c;我们将探讨迭代器的核心作用、与指针的关键区别以及其设计哲学。 一、迭代器的…...

ffmpeg无损转格式的命令行

将ffmpeg.exe拖入命令行窗口 c:\users\zhangsan>D:\ffmpeg-2025-03-11\bin\ffmpeg.exe -i happy.mp4 -c:v copy -c:a copy 格式转换后.mkv -c:v copy 仅做拷贝视频,不重新编码 -c:a copy 仅做拷贝音频 ,不重新编码...

Monorepo 是什么?前端项目的多模块管理终极方案

前言 你是否曾经维护过多个前端项目?是否在多个项目之间来回复制粘贴组件,工具函数?是否经常被"组件更新没同步","构建时间太长","依赖版本冲突"等问题困扰? 这些问题都指向一个关键点: 项目结构和管理方式 今天,我来聊聊一种非常火但又容…...

对象池模式在uniapp鸿蒙APP中的深度应用

文章目录 对象池模式在uniapp鸿蒙APP中的深度应用指南一、对象池模式核心概念1.1 什么是对象池模式&#xff1f;1.2 为什么在鸿蒙APP中需要对象池&#xff1f;1.3 性能对比数据 二、uniapp中的对象池完整实现2.1 基础对象池实现2.1.1 核心代码结构2.1.2 在Vue组件中的应用 2.2 …...

条款05:了解C++默默编写并调用哪些函数

目录 1.默认生成的函数 2.无法生成的情况 2.1当成员函数有引用 或者 被const修饰 2.2.operator在基类被私有 1.默认生成的函数 class empty {};//相当于class empty { public:empty(){ ... } // 构造函数empty(const empty& rhs) { ... }// 拷贝构造~empty(){ ... } //…...

PythonFlask打造高效流式接口的实战

一、环境搭建与项目初始化 要使用 Flask 提供流式接口,首先得确保开发环境正确配置。在 Ubuntu 系统上,可借助 apt 包管理器便捷安装 Python 和 pip: sudo apt update sudo apt install python3 python3-pip对于 Windows 用户,推荐从官网下载安装包进行安装。安装完成后,…...

强化学习算法系列(五):最主流的算法框架——Actor-Critic算法框架

强化学习算法 &#xff08;一&#xff09;动态规划方法——策略迭代算法(PI)和值迭代算法(VI) &#xff08;二&#xff09;Model-Free类方法——蒙特卡洛算法(MC)和时序差分算法(TD) &#xff08;三&#xff09;基于动作值的算法——Sarsa算法与Q-Learning算法 &#xff08;四…...

设计模式(结构型)-桥接模式

目录 摘要 定义 类图 角色 具体实现 优缺点 优点 缺点 使用场景 使用案例 JDBC 和桥接模式 总结 摘要 在软件开发领域&#xff0c;随着系统规模和复杂性的不断攀升&#xff0c;如何设计出具有良好扩展性、灵活性以及可维护性的软件架构成为关键挑战。桥接模式作为一…...