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

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&#xff0c;终于给写对了&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…...

【Microi吾码】开源力量赋能低代码创新,重塑软件开发生态格局

我的个人主页 文章专栏&#xff1a;Microi吾码 一、引言 在当今数字化浪潮汹涌澎湃的时代&#xff0c;软件开发的需求呈现出爆发式增长。企业为了在激烈的市场竞争中脱颖而出&#xff0c;不断寻求创新的解决方案以加速数字化转型。传统的软件开发方式往往面临着开发周期长、技…...

Github - 如何提交一个带有“verified”标识的commit

Github - 如何提交一个带有“verified”标识的commit 前言(Why) 今天在Github上浏览某项目的commit记录的时候发现&#xff0c;有的commit记录带有verified绿色标识&#xff0c;有的带有橘色的Unverified标识&#xff0c;还有的什么都不显示。 既然我是根正苗红的作者(bushi)…...

HCIA笔记9--NAT、ACL与链路聚合

1. ACL ACL: 访问控制列表, Access Control List。 通过定义规则来允许或拒绝流量的通过。 1.1 ACL分类 1.2 配置实例 如图所示&#xff0c;对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 共享多语义空间注意力&#xff1a;空间与通道分解3.2 渐进式通道自注意力3.3 协同效应3.4 注意力机制的整合 4 实验4.1 实验设置4.2 图像分类4.3 目标检测4.4 分割4.5 消融研究 5 可视化与分析5.1 注…...

深度学习助力股市预测:LSTM、RNN和CNN模型实战解析

作者&#xff1a;老余捞鱼 原创不易&#xff0c;转载请标明出处及原作者。 写在前面的话&#xff1a;众所周知&#xff0c;传统的股票预测模型有着各种各样的局限性。但在我的最新研究中&#xff0c;探索了一些方法来高效预测股市走势&#xff0c;即CNN、RNN和LSTM这些深度学习…...

组件库TDesign的表格<t-table>的使用,行列合并以及嵌入插槽实现图标展示,附踩坑

碎碎念&#xff1a;有点难用&#xff0c;不丝滑&#xff08;以下介绍的难点不是真的难&#xff0c;只是有点点点难用&#xff09; 背景&#xff1a;需要实现表格的行列合并以及图标的嵌入&#xff0c;想到使用组件库组件来方便开发 链接&#xff1a;TDesign Web Vue Next 难点…...

jwt在express中token的加密解密实现方法

在我们前面学习了 JWT认证机制在Node.js中的详细阐述 之后&#xff0c;今天来详细学习一下token是如何生成的&#xff0c;secret密钥的加密解密过程是怎么样的。 安装依赖 express&#xff1a;用于创建服务器jsonwebtoken&#xff1a;用于生成和验证JWTbody-parser&#xff1…...

结构体、共用体的字节对齐

结构体 结构体嵌套时&#xff1a;先算一下嵌套的结构体大小 嵌套进来的结构体大小为16字节&#xff0c;仍然进行&#xff0c;8字节对齐 typedef struct {char name[20];//20字节//000开始 20字节 019 struct{int day; //000开始 4字节 003char swx; //004开始 1…...

【YOLOv3】源码(train.py)

概述 主要模块分析 参数解析与初始化 功能&#xff1a;解析命令行参数&#xff0c;设置训练配置项目经理制定详细的施工计划和资源分配日志记录与监控 功能&#xff1a;初始化日志记录器&#xff0c;配置监控系统项目经理使用监控和记录工具&#xff0c;实时跟踪施工进度和质量…...

帧缓存的分配

帧缓存实际上就是一块内存。在 Android 系统中分配与回收帧缓存&#xff0c;使用的是一个叫 ION 的内核模块&#xff0c;App 使用 ioctl 系统调用后&#xff0c;会在内核内存中分配一块符合要求的内存&#xff0c;用户态会拿到一个 fd&#xff08;有的地方也称之为 handle&…...

基于顺序表实现队列循环队列的处理

文章目录 1.假溢出的现象2.循环队列3.顺序表实现队列架构4.顺序表模拟实现队列5.设计循环队列&#xff08;校招难度&#xff09; 1.假溢出的现象 下面的这个就是我们的假溢出的这个现象的基本的来源&#xff1a; 我们的这个队列里面是有9个位置的&#xff0c;我们知道这个队列…...

磁珠选型规范

根据不同的应用场景&#xff0c;磁珠可以分为普通型磁珠&#xff0c;大电流型磁珠和尖峰型磁珠。 &#xff08;1&#xff09;普通型磁珠&#xff1a;主要用于电流比较小&#xff08;小于600mA&#xff09;.无特殊要求的场景&#xff0c;普通型磁珠的直流电阻一般不超过1Ω&…...

linux 点对点语音通话及直播推流实践一: linux USB声卡或耳机 基本配置

inux USB声卡或耳机 基本配置 工具安装查看设备录放音操作录音放音声音配置获取控制信息音量配置本文介绍 linux下alsa声音原件 工具使用方法,包括设备查询、声卡基本配置、录音放音等。 保证 alsa套件可正常操作和配置声卡,是实现SIP语音通话、音视频 采集及推拉流功能的基础…...

3DMAX镂空星花球建模插件FloralStarBall使用方法

3DMAX镂空星花球建模插件FloralStarBall使用教程 就是那个3DMAX镂空星花球建模&#xff0c;再也不用手动做了&#xff0c;使用3DMAX镂空星花球建模FloralStarBall插件可以一键生成&#xff01; 3DMAX镂空星花球建模插件FloralStarBall&#xff0c;经典星形球体的美丽变体。星形…...

window 安装 nodejs

方式一&#xff1a;使用 fnm 可能会出现 cmd 找不到 nodejs 和 npm 的情况&#xff0c;并且包也可能不知道哪一个 参考链接 Node.js — Download Node.js 使用 powershell 操作&#xff0c;要不然可能有些执行不了 # 安裝 fnm (快速 Node 管理器) winget install Schniz.fnm# …...

Autoware Universe 安装记录

前提&#xff1a; ubuntu20.04&#xff0c;英伟达显卡。 ROS2-Galactic安装 wget http://fishros.com/install -O fishros && . fishros 选择galactic(ROS2)版本&#xff0c;桌面版 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 常用的集成开发环境&#xff08;IDE&#xff09;包括P…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...