python+reportlab创建PDF文件
目录
字体导入
画布写入
创建画布对象
写入文本内容
写入图片内容
新增页
画线
表格
保存
模板写入
创建模板对象
段落及样式
表格及样式
画框
图片
页眉页脚
添加图形
构建pdf文件
reportlab库支持创建包含文本、图像、图形和表格的复杂PDF文档。
安装:pip install reportlab -i https://pypi.tuna.tsinghua.edu.cn/simple
字体导入
在写入中文内容时会出现中文乱码的情况,如下图,所以需要导入对应的字体库,一般Windows系统自带的字体库文件在C:\Windows\Fonts下

from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFontpdfmetrics.registerFont(TTFont('SimSun', 'simsun.ttc')) # 宋体
pdfmetrics.registerFont(TTFont('华文彩云', 'C:\Windows\Fonts\STCAIYUN.TTF'))
画布写入
reportlab支持画布写入内容和模版框架写入
创建画布对象
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfgen import canvas
from reportlab.lib import pagesizes, colors
from reportlab.graphics.shapes import Drawing, Rect
from reportlab.platypus import Image, Table, TableStyle
from reportlab.platypus import Paragraph, SimpleDocTemplate
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStylecav = canvas.Canvas(pdf_name) # pagesize(元组类型)参数可设置页面大小,也可以设置reportlab.lib中的预设值(pagesize=pagesizes.letter)
cav.setAuthor('设置作者测试')
cav.setTitle('设置标题')
cav.setSubject('设置主题')# 导入字体,字体是在Windows系统字体库中存在的数据
pdfmetrics.registerFont(TTFont('SimSun', 'simsun.ttc')) # 宋体
cav.setFont('SimSun', 10) # 设置字体和字体大小
写入文本内容
难过的一点,画布写入内容过长(长文本)不会自动换行!!!!
# 写入文字内容
cav.drawString(100, 600, '测试文本数据' * 150) # 添加文本内容,可设置左边距和下边距
cav.drawCentredString(20, 50, 'test测试' * 100)
写入图片内容
# 写入图片方法1
cav.drawImage(r'E:\桌面\99\测试图片\1.jpg', x=100, y=100, width=50, height=50) # 插入图片 x,y 为左边距和下边距
# 写入图片方法2
image = Image(r'E:\桌面\99\测试图片\2.jpg', width=300, height=400)
image.drawOn(cav, x=100, y=100) # 计算图像的尺寸并将其插入到PDF中,x,y 为左边距和下边距
新增页
cav.showPage() # 新增页面
画线
cav.line(5, 300, 300, 300)
cav.line(5, 5, 300, 5)
cav.line(5, 300, 5, 5)
cav.line(300, 300, 300, 5)
cav.setStrokeColorRGB(100 / 255, 200 / 255, 50 / 255)
cav.line(90, 300, 90, 5)
cav.setStrokeColorRGB(50 / 255, 50 / 255, 50 / 255)
表格
image3 = Image(r'E:\桌面\99\测试图片\3.jpg', width=40, height=40)
data = [['姓名', '性别', '年龄', '图片'], ['张', '男', 32], ['刘', '女', 23], ['马', '男', 24, image3]]
table_style = [('BACKGROUND', (0, 0), (-1, 0), colors.aqua), # 设置标题背景色('TEXTCOLOR', (0, 0), (-1, 0), (50 / 255, 200 / 255, 100 / 255)), # 设置文本颜色('ALIGN', (0, 0), (-1, -1), 'CENTER'), # 设置对齐方式('FONTNAME', (0, 0), (-1, -1), 'SimSun'), # 设置字体('BOTTOMPADDING', (0, 0), (-1, 0), 20),('BACKGROUND', (0, 1), (-1, -1), colors.azure),('GRID', (0, 0), (-1, -1), 2, colors.blue) # 设置网格及网格样式 ,2为表格宽度
]table = Table(data, 100, 50) # 可指定表格大小
table.setStyle(table_style)
table.wrapOn(cav, 0, 0)
table.drawOn(cav, 50, 500)

保存
cav.save()
模板写入
创建模板对象
doc = SimpleDocTemplate(pdf_name)
段落及样式
ParagraphStyle: 段落支持大多数样式的设置,可见源码
# 设置段落样式
p_style = getSampleStyleSheet()['Normal']
par_style1 = ParagraphStyle(name='p_style1', parent=p_style, fontName='SimSun', spaceAfter=10, spaceBefore=10)
par_style2 = ParagraphStyle(name='p_style2', parent=p_style, fontName='华文彩云',fontSize=15, spaceAfter=30, spaceBefore=30)
# 添加段落
par1 = Paragraph('duanluo段落11' * 20, par_style1)
par2 = Paragraph('duanluo段落2' * 20, par_style2)

表格及样式
image = Image(r'E:\桌面\99\测试图片\3.jpg', width=40, height=60)
data = [['姓名', '性别', '年龄', '图片'], ['张', '男', 32], ['刘', '女', 23], ['马', '男', 24, image]]
table_style = [('BACKGROUND', (0, 0), (-1, 0), colors.aqua), # 设置标题背景色('TEXTCOLOR', (0, 0), (-1, 0), (50 / 255, 200 / 255, 100 / 255)), # 设置文本颜色('ALIGN', (0, 0), (-1, -1), 'CENTER'), # 设置对齐方式(左右对齐方式)('VALIGN', (0, 0), (-1, -1), 'MIDDLE'), # 设置对齐方式(垂直对齐方式),垂直居中('FONTNAME', (0, 0), (-1, -1), 'SimSun'), # 设置字体('FONTSIZE', (0, 0), (-1, -1), 20), # 设置字号('BOTTOMPADDING', (0, 0), (-1, 0), 20),('BACKGROUND', (0, 1), (-1, -1), colors.azure),('GRID', (0, 0), (-1, -1), 2, colors.blue), # 设置网格及网格线宽度和颜色 ,2为表格宽度('LINEBEFORE', (0, 0), (0, -1), 3, colors.dodgerblue), # 设置左边线宽度和颜色('LINEBEFORE', (1, 0), (1, -1), 6, colors.darkolivegreen), # 指定边框线颜色('SPAN', (0, 0), (0, -1)) # 合并单元格
]
table = Table(data, 100, 50) # 可指定表格大小
table.setStyle(table_style)

画框
d = Drawing()
d.background = Rect(0, 0, 300, 100, strokeWidth=1, strokeColor='#238E23', fillColor='#E47833')
图片
image = Image(r'E:\桌面\99\测试图片\2.jpg', width=300, height=400)
页眉页脚
页眉页脚可通过自定义构建画布函数在构建文件时执行添加
def page_layout(canvas, doc):canvas.setFont('华文彩云', 14)canvas.drawString(100, 770, "页眉")canvas.setFont('SimSun', 10)page_num = canvas.getPageNumber()canvas.drawString(500, 15, f"第{page_num}页")
添加图形
可支持添加各类统计图,如柱状图和饼形图,具体使用时自行参考文档
from reportlab.graphics.charts import piecharts, barcharts # 添加图形
构建pdf文件
# onFirstPage # 在第一页生效的内容
# onLaterPages # 在第一页之后生效的内容
content = [par1, par2, table, image, d]
doc.build(content, onFirstPage=page_layout, onLaterPages=page_layout)相关文章:
python+reportlab创建PDF文件
目录 字体导入 画布写入 创建画布对象 写入文本内容 写入图片内容 新增页 画线 表格 保存 模板写入 创建模板对象 段落及样式 表格及样式 画框 图片 页眉页脚 添加图形 构建pdf文件 reportlab库支持创建包含文本、图像、图形和表格的复杂PDF文档。 安装&…...
2024最新qrcode.min.js生成二维码Demo
找了一堆代码一堆GPT,终于给写对了: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…...
【Microi吾码】开源力量赋能低代码创新,重塑软件开发生态格局
我的个人主页 文章专栏:Microi吾码 一、引言 在当今数字化浪潮汹涌澎湃的时代,软件开发的需求呈现出爆发式增长。企业为了在激烈的市场竞争中脱颖而出,不断寻求创新的解决方案以加速数字化转型。传统的软件开发方式往往面临着开发周期长、技…...
Github - 如何提交一个带有“verified”标识的commit
Github - 如何提交一个带有“verified”标识的commit 前言(Why) 今天在Github上浏览某项目的commit记录的时候发现,有的commit记录带有verified绿色标识,有的带有橘色的Unverified标识,还有的什么都不显示。 既然我是根正苗红的作者(bushi)…...
HCIA笔记9--NAT、ACL与链路聚合
1. ACL ACL: 访问控制列表, Access Control List。 通过定义规则来允许或拒绝流量的通过。 1.1 ACL分类 1.2 配置实例 如图所示,对R2的访问只允许192.168.1.0/24网段。 我们可以配置基本acl来限制 acl 2000 acl number 2000 rule 5 permit source 192.168.1.0 0…...
SCSA:探索空间与通道注意力之间的协同效应
文章目录 摘要1 引言2 相关工作2.1 多语义空间信息2.2 注意力分解 3 方法3.1 共享多语义空间注意力:空间与通道分解3.2 渐进式通道自注意力3.3 协同效应3.4 注意力机制的整合 4 实验4.1 实验设置4.2 图像分类4.3 目标检测4.4 分割4.5 消融研究 5 可视化与分析5.1 注…...
深度学习助力股市预测:LSTM、RNN和CNN模型实战解析
作者:老余捞鱼 原创不易,转载请标明出处及原作者。 写在前面的话:众所周知,传统的股票预测模型有着各种各样的局限性。但在我的最新研究中,探索了一些方法来高效预测股市走势,即CNN、RNN和LSTM这些深度学习…...
组件库TDesign的表格<t-table>的使用,行列合并以及嵌入插槽实现图标展示,附踩坑
碎碎念:有点难用,不丝滑(以下介绍的难点不是真的难,只是有点点点难用) 背景:需要实现表格的行列合并以及图标的嵌入,想到使用组件库组件来方便开发 链接:TDesign Web Vue Next 难点…...
jwt在express中token的加密解密实现方法
在我们前面学习了 JWT认证机制在Node.js中的详细阐述 之后,今天来详细学习一下token是如何生成的,secret密钥的加密解密过程是怎么样的。 安装依赖 express:用于创建服务器jsonwebtoken:用于生成和验证JWTbody-parser࿱…...
结构体、共用体的字节对齐
结构体 结构体嵌套时:先算一下嵌套的结构体大小 嵌套进来的结构体大小为16字节,仍然进行,8字节对齐 typedef struct {char name[20];//20字节//000开始 20字节 019 struct{int day; //000开始 4字节 003char swx; //004开始 1…...
【YOLOv3】源码(train.py)
概述 主要模块分析 参数解析与初始化 功能:解析命令行参数,设置训练配置项目经理制定详细的施工计划和资源分配日志记录与监控 功能:初始化日志记录器,配置监控系统项目经理使用监控和记录工具,实时跟踪施工进度和质量…...
帧缓存的分配
帧缓存实际上就是一块内存。在 Android 系统中分配与回收帧缓存,使用的是一个叫 ION 的内核模块,App 使用 ioctl 系统调用后,会在内核内存中分配一块符合要求的内存,用户态会拿到一个 fd(有的地方也称之为 handle&…...
基于顺序表实现队列循环队列的处理
文章目录 1.假溢出的现象2.循环队列3.顺序表实现队列架构4.顺序表模拟实现队列5.设计循环队列(校招难度) 1.假溢出的现象 下面的这个就是我们的假溢出的这个现象的基本的来源: 我们的这个队列里面是有9个位置的,我们知道这个队列…...
磁珠选型规范
根据不同的应用场景,磁珠可以分为普通型磁珠,大电流型磁珠和尖峰型磁珠。 (1)普通型磁珠:主要用于电流比较小(小于600mA).无特殊要求的场景,普通型磁珠的直流电阻一般不超过1Ω&…...
linux 点对点语音通话及直播推流实践一: linux USB声卡或耳机 基本配置
inux USB声卡或耳机 基本配置 工具安装查看设备录放音操作录音放音声音配置获取控制信息音量配置本文介绍 linux下alsa声音原件 工具使用方法,包括设备查询、声卡基本配置、录音放音等。 保证 alsa套件可正常操作和配置声卡,是实现SIP语音通话、音视频 采集及推拉流功能的基础…...
3DMAX镂空星花球建模插件FloralStarBall使用方法
3DMAX镂空星花球建模插件FloralStarBall使用教程 就是那个3DMAX镂空星花球建模,再也不用手动做了,使用3DMAX镂空星花球建模FloralStarBall插件可以一键生成! 3DMAX镂空星花球建模插件FloralStarBall,经典星形球体的美丽变体。星形…...
window 安装 nodejs
方式一:使用 fnm 可能会出现 cmd 找不到 nodejs 和 npm 的情况,并且包也可能不知道哪一个 参考链接 Node.js — Download Node.js 使用 powershell 操作,要不然可能有些执行不了 # 安裝 fnm (快速 Node 管理器) winget install Schniz.fnm# …...
Autoware Universe 安装记录
前提: ubuntu20.04,英伟达显卡。 ROS2-Galactic安装 wget http://fishros.com/install -O fishros && . fishros 选择galactic(ROS2)版本,桌面版 ROS2-dev-tools安装 sudo apt install python3-testresources sudo apt update …...
每天40分玩转Django:Django部署概述
一、Django部署概述 在开发阶段,我们通常使用Django内置的轻量级开发服务器runserver。但在生产环境中,为了应对大量并发请求,需要使用高性能的WSGI服务器,如Gunicorn、uWSGI等。同时还要配置Nginx等Web服务器作为反向代理,实现负载均衡、静态文件处理等。下面是Django部署的整…...
使用VS Code开发ThinkPHP项目
【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《ThinkPHP 8高效构建Web应用 夏磊 编程与应用开发丛书 清华大学出版社》【摘要 书评 试读】- 京东图书 ThinkPHP 8开发环境安装-CSDN博客 安装ThinkPHP项目的IDE 常用的集成开发环境(IDE)包括P…...
硬币凑钱--动态规划--完全背包的变式
1.硬币凑钱import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int nsc.nextInt();//背包问题的其中一种int[] dpnew int[n1];for(int i1;i<n…...
【GIS】深入解析地理学中的尺度三重性:Size、Level、Relation的实践应用
1. 尺度三重性:GIS分析的基石 第一次接触"尺度"概念时,我也被各种术语绕晕过——为什么1:10000叫大比例尺却显示小范围?为什么生态学家说的"尺度"和城市规划师说的完全不是一回事?直到把尺度拆解成Size&#…...
Qwen2.5-14B-Instruct+Pixel Script Temple:高校戏剧系AI辅助教学实战案例
Qwen2.5-14B-InstructPixel Script Temple:高校戏剧系AI辅助教学实战案例 1. 项目背景与价值 在高校戏剧教育领域,剧本创作一直是教学难点。传统教学模式下,学生需要花费大量时间在格式规范、基础场景构建等基础性工作上,而教师…...
从旅游Vlog到新闻视频:QVHIGHLIGHTS数据集在跨领域应用中的实战指南
QVHIGHLIGHTS数据集:跨领域视频内容智能解析的工程实践 当你在旅行Vlog中搜索"日落时分的海滩漫步",或在新闻视频中寻找"抗议活动现场冲突画面",传统视频平台只能返回整段视频——这就像给你一整本书而不是精确的页码。Q…...
CloudFlare Workers实现高级邮箱转发:过滤垃圾邮件+自动分类实战
CloudFlare Workers实现高级邮箱转发:过滤垃圾邮件自动分类实战 邮箱已经成为现代人工作和生活中不可或缺的工具,但随之而来的垃圾邮件、广告推广和各类通知也让收件箱变得杂乱无章。对于开发者和技术爱好者来说,传统的邮箱转发功能往往不能满…...
如何高效配置Kodi PVR IPTV Simple:专业级家庭IPTV直播系统部署指南
如何高效配置Kodi PVR IPTV Simple:专业级家庭IPTV直播系统部署指南 【免费下载链接】pvr.iptvsimple IPTV Simple client for Kodi PVR 项目地址: https://gitcode.com/gh_mirrors/pv/pvr.iptvsimple Kodi PVR IPTV Simple是一款功能强大的开源IPTV客户端插…...
别再为日期格式头疼了!Oracle TO_TIMESTAMP函数保姆级使用指南(含常见报错解决)
Oracle TO_TIMESTAMP实战:从混乱字符串到精准时间戳的避坑指南 刚接手一个数据迁移项目时,我对着几十万条格式各异的日期记录发愁——有"2023/12/01"这样的斜杠分隔,也有"01-Dec-23 14.30.00.123"带英文月份缩写和毫秒的…...
告别msi2lmp参数缺失!手把手教你用Perl脚本insight2lammps搞定MS到LAMMPS的data文件转换
告别msi2lmp参数缺失!手把手教你用Perl脚本insight2lammps搞定MS到LAMMPS的data文件转换 分子动力学模拟研究者们常常遇到这样的困境:在Materials Studio(MS)中精心构建的模型,导出后却因LAMMPS自带的msi2lmp工具参数缺…...
bilibili-downloader开源工具:突破B站4K视频下载限制的全攻略
bilibili-downloader开源工具:突破B站4K视频下载限制的全攻略 【免费下载链接】bilibili-downloader B站视频下载,支持下载大会员清晰度4K,持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 在数字内容消…...
手把手教你用VSCode快速定位并修改RuoYi框架的页面标题和图标(避坑指南)
高效定制RuoYi前端界面:VSCode全局搜索实战指南 刚接触RuoYi框架的开发者常会遇到这样的困扰:想修改浏览器标签页标题或系统Logo,却不知从何下手。前后端分离的项目结构让配置文件散落在各处,而手动翻找无异于大海捞针。本文将带你…...
