

Python,速成心法
敲代码,查资料,问Ai
练习,探索,总结,优化

★★★★★博文创作不易,源码代码的过程中,如有疑问的地方,欢迎大家指正留言交流。喜欢的老铁可以多多点赞+收藏分享+置顶,小红牛在此表示感谢。★★★★★
office办公python代码:PDF书籍封面生成器1.0(tk+reportlab)
office办公python代码:批量对所有.pdf文件生成水印(pypdf+reportlab)
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.27, 841.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()
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])
3. platypus 表格样式参数(TableStyle):表格是 platypus 的另一核心组件,通过 TableStyle 命令设置边框、背景、对齐、字体等。
from reportlab.platypus import Table, TableStylefrom reportlab.lib import colorsdata = [["姓名", "年龄", "城市"],["张三", 28, "北京"],["李四", 32, "上海"],["王五", 25, "广州"],]# 创建表格,可指定列宽、行高table = Table(data, colWidths=[80, 50, 80], rowHeights=20)# 设置表格样式style = TableStyle([# 背景色:坐标区域 (row_start, col_start, row_end, col_end)('BACKGROUND', (0, 0), (-1, 0), colors.grey), # 表头灰色背景('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke), # 表头文字颜色('ALIGN', (0, 0), (-1, -1), 'CENTER'), # 所有单元格居中对齐('VALIGN', (0, 0), (-1, -1), 'MIDDLE'), # 垂直居中('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'), # 表头粗体('FONTSIZE', (0, 0), (-1, 0), 12),('BOTTOMPADDING', (0, 0), (-1, 0), 6), # 表头下内边距('GRID', (0, 0), (-1, -1), 1, colors.black), # 所有网格线(线宽1,黑色)('BOX', (0, 0), (-1, -1), 2, colors.black), # 外边框加粗('BACKGROUND', (0, 1), (-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(72, 72, 200, 600, id='col1', showBoundary=1)frame2 = Frame(300, 72, 200, 600, id='col2', showBoundary=1)page_template = PageTemplate(frames=[frame1, frame2])doc.addPageTemplates([page_template])# 然后使用 doc.build(flowables) 时,内容会按顺序流入这两个框架
5. 中文字体支持参数:默认字体不支持中文,需注册 TrueType 字体
from reportlab.pdfbase import pdfmetricsfrom reportlab.pdfbase.ttfonts import TTFont# 注册中文字体(需提供 .ttf 文件路径)pdfmetrics.registerFont(TTFont('SimSun', 'simsun.ttf')) # 宋体# 然后在样式中使用 fontName='SimSun'

# -*- 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(1, 0.5*cm))text = """ReportLab 是 Python 中最流行的 PDF 生成库,它提供了两层接口:底层 pdfgen 用于直接绘图,高层 platypus 用于排版流式内容。本示例展示了段落样式、表格、页眉页码的常用参数设置,且全部使用 SimSun 中文字体(自动注册)。"""story.append(Paragraph(text.strip(), body_style))story.append(Spacer(1, 0.3*cm))highlight_text = """特别提示:所有坐标和尺寸均可使用 mm、cm、inch 等单位(需从 reportlab.lib.units 导入),这样代码可读性更高,也更容易调整布局。"""story.append(Paragraph(highlight_text.strip(), highlight_style))story.append(Spacer(1, 0.5*cm))story.append(Paragraph("员工信息表", table_title_style))story.append(Spacer(1, 0.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', (0, 0), (-1, 0), colors.lightgrey),('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke),('FONTNAME', (0, 0), (-1, 0), FONT_NAME), # 表头字体('FONTSIZE', (0, 0), (-1, 0), 12),('ALIGN', (0, 0), (-1, 0), 'CENTER'),('VALIGN', (0, 0), (-1, 0), 'MIDDLE'),('BOTTOMPADDING', (0, 0), (-1, 0), 6),# 数据区 ———— 这里必须指定字体!!!!!('FONTNAME', (0, 1), (-1, -1), FONT_NAME), # ✅ 新增这一行('FONTSIZE', (0, 1), (-1, -1), 10),('ALIGN', (0, 1), (-1, -1), 'CENTER'),('VALIGN', (0, 1), (-1, -1), 'MIDDLE'),('BACKGROUND', (0, 1), (-1, -1), colors.beige),('BACKGROUND', (0, 2), (-1, 2), colors.lightyellow),('BACKGROUND', (0, 3), (-1, 3), colors.beige),('GRID', (0, 0), (-1, -1), 1, colors.black),('BOX', (0, 0), (-1, -1), 2, colors.black),])table.setStyle(table_style)story.append(KeepTogether([table]))story.append(Spacer(1, 1*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) / 2canvas_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")
完毕!!感谢您的收看
------★★历史博文集合★★------

夜雨聆风