python+reportlab创建PDF文件

ops/2024/12/27 8:02:27/

目录

字体导入

画布写入

创建画布对象

写入文本内容

写入图片内容

新增页

画线

表格

保存

模板写入

创建模板对象

段落及样式

表格及样式

画框

图片

页眉页脚

添加图形

pdf%E6%96%87%E4%BB%B6-toc" style="margin-left:80px;"> 构建pdf文件


reportlab库支持创建包含文本、图像、图形和表格的复杂PDF文档。

安装:pip install reportlab -i https://pypi.tuna.tsinghua.edu.cn/simple

字体导入

在写入中文内容时会出现中文乱码的情况,如下图,所以需要导入对应的字体库,一般Windows系统自带的字体库文件在C:\Windows\Fonts下

python">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支持画布写入内容和模版框架写入

创建画布对象

python">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)  # 设置字体和字体大小

写入文本内容

难过的一点,画布写入内容过长(长文本)不会自动换行!!!!

python"># 写入文字内容
cav.drawString(100, 600, '测试文本数据' * 150)  # 添加文本内容,可设置左边距和下边距
cav.drawCentredString(20, 50, 'test测试' * 100)

写入图片内容

python"># 写入图片方法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 为左边距和下边距

新增页

python">cav.showPage()  # 新增页面

画线

python">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)

表格

python">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)

保存

python">cav.save()

模板写入

创建模板对象

python">doc = SimpleDocTemplate(pdf_name)

段落及样式

ParagraphStyle: 段落支持大多数样式的设置,可见源码

python"># 设置段落样式
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)

表格及样式

python">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)

画框

python">d = Drawing()
d.background = Rect(0, 0, 300, 100, strokeWidth=1, strokeColor='#238E23', fillColor='#E47833')

图片

python">image = Image(r'E:\桌面\99\测试图片\2.jpg', width=300, height=400)

页眉页脚

页眉页脚可通过自定义构建画布函数在构建文件时执行添加

python">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}页")

添加图形

可支持添加各类统计图,如柱状图和饼形图,具体使用时自行参考文档

python">from reportlab.graphics.charts import piecharts, barcharts  # 添加图形

pdf%E6%96%87%E4%BB%B6"> 构建pdf文件

# onFirstPage  # 在第一页生效的内容
# onLaterPages  # 在第一页之后生效的内容

python">content = [par1, par2, table, image, d]
doc.build(content, onFirstPage=page_layout, onLaterPages=page_layout)

http://www.ppmy.cn/ops/145324.html

相关文章

JWT认证机制在Node.js中的详细阐述

一、概念 JWT(JSON Web Token)是一种基于Token的认证机制,它允许服务器无状态地验证用户身份。JWT是一个开放标准(RFC 7519),它定义了一种简洁的、自包含的用于各方之间安全传输信息的JSON对象。JWT通常被…

论文研读:AnimateDiff—通过微调SD,用图片生成动画

1.概述 AnimateDiff 设计了3个模块来微调通用的文生图Stable Diffusion预训练模型, 以较低的消耗实现图片到动画生成。 论文名:AnimateDiff: Animate Your Personalized Text-to-Image Diffusion Models without Specific Tuning 三大模块: 视频域适应…

vue前端项目中实现电子签名功能(附完整源码)

文章目录 一、具体思路二、所需依赖三、添加签名面板2.1 canvas 转base642.2 电子签名等比例缩小 四、html转cavas(原始文档)五、合成图片六、效果测试七、完整源码 一、具体思路 在vue项目中使用以下步骤思路去实现: 起初的原始文档的格式都…

Scala课堂小结

(一)数组: 1.不可变数组 2.创建数组

路由器转发数据报的封装过程

✍作者:柒烨带你飞 💪格言:生活的情况越艰难,我越感到自己更坚强;我这个人走得很慢,但我从不后退。 📜系列专栏:网路安全入门系列 目录 路由器转发数据的封装过程 路由器转发数据的封…

游戏引擎学习第61天

回顾并计划接下来的事情 我们现在的目标是通过创建一个占位符版本的游戏来展示我们所做的工作。这个版本的游戏包含了许多基本要素,目的是快速构建一些东西,进行测试,并观察代码结构的形成。这些代码的实施是为了理解系统如何工作&#xff0…

朗速ERP FileUploadApi.ashx 文件上传致RCE漏洞复现

0x01 产品简介 郎速ERP是一款功能强大的企业资源计划(ERP)软件,专为中小企业量身打造,旨在帮助企业优化管理流程、提升运营效率。不仅适用于制造业,还广泛适用于零售、物流、服务等多个行业。例如,在制造业中,通过生产计划、物料需求计划等功能,提升生产效率和降低生产…

网络安全研究中的网络攻击

网络安全研究中的网络攻击 在网络安全研究中,多种网络攻击场景可用于测试系统的安全性,以下是一些常见的网络攻击场景、模拟方法、相关软件及其使用示例: 分布式拒绝服务(DDoS)攻击 模拟方法:利用工具向目标系统发送大量的请求流量,耗尽其网络带宽、系统资源(如 CPU、…