乐于分享
好东西不私藏

office办公python代码:reportlab模块参数的用法及示例

office办公python代码:reportlab模块参数的用法及示例

Python,速成心法

敲代码,查资料,问Ai

练习,探索,总结,优化

博文创作不易,代码的过程中,如有疑问的地方,欢迎大家指正留言交流。喜欢的老铁可以多多点赞+收藏分享+置顶,小红牛在此表示感谢。

Python项目:按顺序合并多个.pdf文件

office办公python代码:PDF书籍封面生成器1.0(tk+reportlab)

office办公python代码:批量对所有.pdf文件生成水印(pypdf+reportlab)

office办公python代码:.txt文本转pdf工具
Python项目81:Excel工作表批量重命名工具1.0(tkinter+openpyxl)
Python项目源码69:Excel数据筛选器1.0(tkinter+sqlite3+pandas)
pandas读取Excel数据(.xlsx和.xls)到treeview
ReportLab 是 Python 中生成 PDF 最常用的库,其核心功能分布在多个子模块中,其中最主要的是 pdfgen(底层绘图)和 platypus(高级排版)。不同模块的参数用法差异较大,下面通过典型示例展示常用参数的设置方法。
1. pdfgen.canvas 基础绘图参数 pdfgen 提供画布(Canvas)对象,用于直接绘制线条、图形和文字。关键参数包括页面尺寸、颜色、字体、坐标等。
from reportlab.pdfgen import canvasfrom reportlab.lib.pagesizes import A4, landscapefrom reportlab.lib.units import mm, cmfrom reportlab.lib.colors import red, blue, grey# 创建画布:页面大小(默认A4,可传入元组)、左右下上边距c = canvas.Canvas("example1.pdf", pagesize=A4)  # A4 为 (595.27841.89) 点# 或横向:pagesize=landscape(A4)# 设置全局绘图颜色(影响后续绘制)c.setFillColor(blue)   # 填充色c.setStrokeColor(red)  # 线条色c.setLineWidth(2)      # 线宽(点)# 绘制矩形:x, y, width, height (坐标原点在左下角)c.rect(50*mm, 50*mm, 100*mm, 60*mm, fill=1)  # fill=1 填充,0 仅边框# 设置字体:字体名、字号c.setFont("Helvetica"16)c.setFillColor(grey)   # 文字颜色c.drawString(60*mm, 80*mm, "Hello, ReportLab!")# 画线:起点和终点坐标c.line(20*mm, 20*mm, 190*mm, 20*mm)# 保存c.save()
关键参数说明:
pagesize:可以是预定义常量(如 A4, A5)或自定义 (width, height),单位是点(1 点 = 1/72 英寸)。
坐标和尺寸可使用 mm、cm 等单位(需从 lib.units 导入)提高可读性。
颜色可用 RGB 元组 (0.2, 0.3, 0.4),或预定义颜色名(如 red)。

2. platypus 段落样式参数(ParagraphStyle):是更高层次的流式排版工具,最常用的是 Paragraph,其样式由 ParagraphStyle 控制。

from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacerfrom reportlab.lib.styles import getSampleStyleSheet, ParagraphStylefrom reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_RIGHTfrom reportlab.lib import colorsfrom reportlab.lib.fonts import addMapping# 获取默认样式表,并基于它创建自定义样式styles = getSampleStyleSheet()style = styles["Normal"]# 自定义样式custom_style = ParagraphStyle(    name="CustomStyle",    parent=style,                      # 继承父样式    fontName="Helvetica-Bold",         # 字体名称(支持中文字体需额外注册)    fontSize=14,    textColor=colors.darkblue,    alignment=TA_CENTER,               # 对齐方式(居中)    leftIndent=20,                     # 左缩进(点)    rightIndent=10,    spaceBefore=12,                    # 段前间距    spaceAfter=6,    leading=18,                        # 行间距(行高)    backColor=colors.lightgrey,        # 背景色    borderPadding=5,                   # 内边距    borderRadius=3,                    # 圆角    borderWidth=1,    borderColor=colors.grey,)# 使用该样式创建段落para = Paragraph("这是一段测试文字,展示各种样式参数的效果。", custom_style)# 生成文档doc = SimpleDocTemplate("example2.pdf")doc.build([para])
常用参数一览:
fontName:字体名,如 "Helvetica", "Times-Roman";中文需使用支持中文的字体(如 "STSong-Light" 需配合 reportlab.pdfbase.ttfonts 注册)。
alignment:TA_LEFT(左对齐)、TA_CENTER、TA_RIGHT、TA_JUSTIFY(两端对齐)。
firstLineIndent:首行缩进(默认 0)。
bulletIndent:项目符号缩进。
wordWrap:'CJK'(中日韩换行)或 'LTR'(从左到右)。

3. platypus 表格样式参数(TableStyle):表格是 platypus 的另一核心组件,通过 TableStyle 命令设置边框、背景、对齐、字体等。

from reportlab.platypus import Table, TableStylefrom reportlab.lib import colorsdata = [    ["姓名""年龄""城市"],    ["张三"28"北京"],    ["李四"32"上海"],    ["王五"25"广州"],]# 创建表格,可指定列宽、行高table = Table(data, colWidths=[805080], rowHeights=20)# 设置表格样式style = TableStyle([    # 背景色:坐标区域 (row_start, col_start, row_end, col_end)    ('BACKGROUND', (00), (-10), colors.grey),      # 表头灰色背景    ('TEXTCOLOR', (00), (-10), colors.whitesmoke), # 表头文字颜色    ('ALIGN', (00), (-1, -1), 'CENTER'),             # 所有单元格居中对齐    ('VALIGN', (00), (-1, -1), 'MIDDLE'),            # 垂直居中    ('FONTNAME', (00), (-10), 'Helvetica-Bold'),   # 表头粗体    ('FONTSIZE', (00), (-10), 12),    ('BOTTOMPADDING', (00), (-10), 6),             # 表头下内边距    ('GRID', (00), (-1, -1), 1, colors.black),       # 所有网格线(线宽1,黑色)    ('BOX', (00), (-1, -1), 2, colors.black),        # 外边框加粗    ('BACKGROUND', (01), (-1, -1), colors.beige),    # 数据区域背景    # 可选:交替行颜色    # ('BACKGROUND', (0, 1), (-1, 1), colors.lightgrey),])table.setStyle(style)# 生成文档doc = SimpleDocTemplate("example3.pdf")doc.build([table])

样式命令格式:(command, start_cell, end_cell, *params),其中 start_cell 和 end_cell 用 (row, col) 表示,-1 代表最后一行或列

4. 更复杂的页面布局参数(文档模板):SimpleDocTemplate 或 BaseDocTemplate 允许设置页眉、页脚、边距等全局参数。

from reportlab.platypus import BaseDocTemplate, Frame, PageTemplatefrom reportlab.lib.pagesizes import letterdoc = BaseDocTemplate("example4.pdf", pagesize=letter,                      leftMargin=72, rightMargin=72,                      topMargin=72, bottomMargin=72)# 自定义页面模板:定义两个框架(例如分栏)frame1 = Frame(7272200600, id='col1', showBoundary=1)frame2 = Frame(30072200600, id='col2', showBoundary=1)page_template = PageTemplate(frames=[frame1, frame2])doc.addPageTemplates([page_template])# 然后使用 doc.build(flowables) 时,内容会按顺序流入这两个框架
关键参数:
边距单位是点,默认 72 点 ≈ 1 英寸。
Frame 的坐标(x, y, width, height)均相对于页面左下角。
showBoundary=1 可显示框架边界(调试时有用)。

5. 中文字体支持参数:默认字体不支持中文,需注册 TrueType 字体

from reportlab.pdfbase import pdfmetricsfrom reportlab.pdfbase.ttfonts import TTFont# 注册中文字体(需提供 .ttf 文件路径)pdfmetrics.registerFont(TTFont('SimSun''simsun.ttf'))   # 宋体# 然后在样式中使用 fontName='SimSun'
下面我将之前分散的 reportlab 模块参数用法整合成一个完整、可运行的综合示例,涵盖:
中文字体注册(备选),文档模板(边距、页眉/页脚),自定义段落样式(标题、正文、高亮),表格样式(带交替行颜色和网格),画布绘图(在页眉画线,在页脚加页码。
# -*- coding: utf-8 -*-# @Author : 小红牛# 微信公众号:wdPythonimport osimport reportlabfrom reportlab.lib.pagesizes import A4from reportlab.lib.units import mm, cmfrom reportlab.lib import colorsfrom reportlab.lib.enums import TA_CENTER, TA_JUSTIFYfrom reportlab.lib.styles import getSampleStyleSheet, ParagraphStylefrom reportlab.platypus import (    SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, KeepTogether)from reportlab.pdfbase import pdfmetricsfrom reportlab.pdfbase.ttfonts import TTFont# ========== 1. 注册中文字体 ==========FONT_NAME = Nonetry:    font_path = os.path.join(os.path.dirname(reportlab.__file__), 'fonts''STSong-Light.ttf')    if os.path.exists(font_path):        pdfmetrics.registerFont(TTFont('SimSun', font_path))        FONT_NAME = 'SimSun'        print("✅ 已注册中文字体:STSong-Light")except:    passif FONT_NAME is None:    try:        sys_font = 'C:/Windows/Fonts/simsun.ttc'        if os.path.exists(sys_font):            pdfmetrics.registerFont(TTFont('SimSun', sys_font))            FONT_NAME = 'SimSun'            print("✅ 已注册中文字体:系统宋体")    except:        passif FONT_NAME is None:    print("⚠️ 未找到中文字体,将使用 Helvetica(中文会显示方块)")    FONT_NAME = 'Helvetica'# ========== 2. 文档模板 ==========doc = SimpleDocTemplate(    "综合示例.pdf",    pagesize=A4,    leftMargin=2*cm,    rightMargin=2*cm,    topMargin=2.5*cm,    bottomMargin=2*cm,)# ========== 3. 段落样式 ==========styles = getSampleStyleSheet()title_style = ParagraphStyle(    name="TitleStyle", parent=styles["Title"],    fontName=FONT_NAME, fontSize=22, textColor=colors.darkblue,    alignment=TA_CENTER, spaceAfter=12,)body_style = ParagraphStyle(    name="BodyStyle", parent=styles["Normal"],    fontName=FONT_NAME, fontSize=12, leading=16,    alignment=TA_JUSTIFY, firstLineIndent=2*cm, spaceAfter=6,)highlight_style = ParagraphStyle(    name="HighlightStyle", parent=body_style,    fontName=FONT_NAME, textColor=colors.red,)table_title_style = ParagraphStyle(    name="TableTitle", parent=styles["Normal"],    fontName=FONT_NAME, fontSize=14, alignment=TA_CENTER, spaceAfter=10,)# ========== 4. 内容 ==========story = []story.append(Paragraph("ReportLab 综合示例(SimSun 字体)", title_style))story.append(Spacer(10.5*cm))text = """ReportLab 是 Python 中最流行的 PDF 生成库,它提供了两层接口:底层 pdfgen 用于直接绘图,高层 platypus 用于排版流式内容。本示例展示了段落样式、表格、页眉页码的常用参数设置,且全部使用 SimSun 中文字体(自动注册)。"""story.append(Paragraph(text.strip(), body_style))story.append(Spacer(10.3*cm))highlight_text = """特别提示:所有坐标和尺寸均可使用 mm、cm、inch 等单位(需从 reportlab.lib.units 导入),这样代码可读性更高,也更容易调整布局。"""story.append(Paragraph(highlight_text.strip(), highlight_style))story.append(Spacer(10.5*cm))story.append(Paragraph("员工信息表", table_title_style))story.append(Spacer(10.3*cm))# 表格数据data = [    ["姓名""部门""年龄""入职日期"],    ["张三""研发部""28""2020-06-01"],    ["李四""市场部""32""2018-09-15"],    ["王五""财务部""25""2022-01-10"],]col_widths = [3*cm, 4*cm, 2*cm, 3.5*cm]table = Table(data, colWidths=col_widths, rowHeights=0.8*cm)# ===== 表格样式(关键修复)=====table_style = TableStyle([    # 表头    ('BACKGROUND', (00), (-10), colors.lightgrey),    ('TEXTCOLOR', (00), (-10), colors.whitesmoke),    ('FONTNAME', (00), (-10), FONT_NAME),   # 表头字体    ('FONTSIZE', (00), (-10), 12),    ('ALIGN', (00), (-10), 'CENTER'),    ('VALIGN', (00), (-10), 'MIDDLE'),    ('BOTTOMPADDING', (00), (-10), 6),    # 数据区 ———— 这里必须指定字体!!!!!    ('FONTNAME', (01), (-1, -1), FONT_NAME),   # ✅ 新增这一行    ('FONTSIZE', (01), (-1, -1), 10),    ('ALIGN', (01), (-1, -1), 'CENTER'),    ('VALIGN', (01), (-1, -1), 'MIDDLE'),    ('BACKGROUND', (01), (-1, -1), colors.beige),    ('BACKGROUND', (02), (-12), colors.lightyellow),    ('BACKGROUND', (03), (-13), colors.beige),    ('GRID', (00), (-1, -1), 1, colors.black),    ('BOX', (00), (-1, -1), 2, colors.black),])table.setStyle(table_style)story.append(KeepTogether([table]))story.append(Spacer(11*cm))# ========== 5. 页脚 ==========def add_page_footer(canvas_obj, doc):    canvas_obj.saveState()    canvas_obj.setStrokeColor(colors.grey)    canvas_obj.setLineWidth(1)    canvas_obj.line(2*cm, 1.5*cm, A4[0]-2*cm, 1.5*cm)    canvas_obj.setFont(FONT_NAME, 9)    canvas_obj.setFillColor(colors.darkgrey)    page_num = canvas_obj.getPageNumber()    text = f"第 {page_num} 页"    text_width = canvas_obj.stringWidth(text, FONT_NAME, 9)    x_center = (A4[0] - text_width) / 2    canvas_obj.drawString(x_center, 1.0*cm, text)    canvas_obj.restoreState()# ========== 6. 生成 ==========doc.build(story, onFirstPage=add_page_footer, onLaterPages=add_page_footer)print("✅ PDF 生成成功:综合示例.pdf")

完毕!!感谢您的收看

------★★历史博文集合★------

Python入门篇  进阶篇  视频教程  Py安装

py项目Python模块 Python爬虫  Json

Xpath正则表达式SeleniumEtreeCss

Gui程序开发TkinterPyqt5 列表元组字典

数据可视化   matplotlib   词云图Pyecharts

海龟画图PandasBug处理电脑小知识

自动化脚本编程工具NumPy CSVWeb

Pygame  图像处理  机器学习数据库