【Python实战】一键生成 PDF 报告,图文并茂,代码全公开

news2024/12/24 10:10:00

话接上篇:

  • 自动化处理 PDF 文档,完美实现 WPS 会员功能
  • 如何优雅地实现 PDF 去水印?

后台有小伙伴们问:能否基于已有的内容(文本、图像等),一键生成 PDF 文档?

或者说,能否将其他格式的文档一键转换成 PDF ?

必须能!

今天带来的这款 Python 工具 - reportlab,可以完美实现上述功能,希望给有类似需求的小伙伴一点帮助~

话不多说,我们直接上实操。

目录

    • 0. 前置准备
    • 1. 引入必要模块
    • 2. 实现不同功能
      • 2.1 插入标题
      • 2.2 插入文本段落
      • 2.3 插入图片
      • 2.4 插入表格
    • 3. 生成 PDF
    • 写在最后

0. 前置准备

首先需要在电脑上准备好 Python 环境,有不了解的小伙伴,送你一份保姆级教程:【7天Python入门系列】Day1:环境准备之Conda和VS code安装

生成 PDF 文档,需要用到 reportlab 这个工具包,打开终端,一键安装:

pip install reportlab

reportlab 这个库可以实现编辑文字、画图、绘表格等众多功能,最终输出为 PDF 文档,非常强大。

1. 引入必要模块

from reportlab.pdfbase import pdfmetrics   # 注册字体
from reportlab.pdfbase.ttfonts import TTFont # 字体类
from reportlab.platypus import Table, SimpleDocTemplate, Paragraph, Image  # 报告内容相关类
from reportlab.lib.pagesizes import letter  # 页面的标志尺寸(8.5*inch, 11*inch)
from reportlab.lib.styles import getSampleStyleSheet  # 文本样式
from reportlab.lib import colors  # 颜色模块
from reportlab.graphics.charts.barcharts import VerticalBarChart  # 图表类
from reportlab.graphics.charts.legends import Legend  # 图例类
from reportlab.graphics.shapes import Drawing  # 绘图工具
from reportlab.lib.units import cm  # 单位:cm

然后,我们引入本地电脑支持的字体,注册注册一个字体:

pdfmetrics.registerFont(TTFont('simkai', 'C:\Windows\Fonts\simkai.ttf'))

Windows 电脑中,字体默认保存在 C:\Windows\Fonts\,文件后缀为 .ttf,在其中找到想要想要生成的字体路径,填入上述代码片段对应位置。

2. 实现不同功能

2.1 插入标题

下方的示例代码给出了一级标题的默认配置。

def draw_title(title, color=colors.black, title_style='Heading1', font_size=18):
    # 获取所有样式表
    style = getSampleStyleSheet()
    # 设置标题样式
    ct = style[title_style]
    # 单独设置样式相关属性
    ct.fontName = 'simkai'      # 字体名
    ct.fontSize = font_size     # 字体大小
    ct.leading = 50             # 行间距
    ct.textColor = color   # 字体颜色
    ct.alignment = 1    # 居中
    ct.bold = True
    # 创建标题对应的段落,并且返回
    return Paragraph(title, ct)

如果要插入二级标题,可以设置标题样式为 style['Heading2'],然后字体大小设置为 16。

当然,getSampleStyleSheet()已经设置好了默认配置,也可以直接使用,示例代码是为了给大家实现更多定制化,提供参考。

2.2 插入文本段落

def draw_text(text: str):
    # 获取所有样式表
    style = getSampleStyleSheet()
    # 获取普通样式
    ct = style['Normal']
    ct.fontName = 'simkai'
    ct.fontSize = 15
    ct.wordWrap = 'CJK'     # 设置自动换行
    ct.alignment = 0        # 左对齐
    ct.firstLineIndent = 24 # 第一行开头空格
    ct.leading = 25
    return Paragraph(text, ct)

和标题的设置基本一致,如果要设置首行缩进,需要修改 ct.firstLineIndent

2.3 插入图片

def draw_img(path, width=10*cm, height=5*cm):
    img = Image(path)           # 读取指定路径下的图片
    img.drawWidth = width       # 设置图片的宽度
    img.drawHeight = height     # 设置图片的高度
    img.hAlign = 'CENTER'       # 设置图片的水平居中
    return img

可以自定义图像大小 以及 居中表示。

2.4 插入表格

def draw_table(*args):
    col_width = 120 # 列宽度
    style = [
        ('FONTNAME', (0, 0), (-1, -1), 'simkai'),  # 字体
        ('FONTSIZE', (0, 0), (-1, 0), 12),  # 第一行的字体大小
        ('FONTSIZE', (0, 1), (-1, -1), 10),  # 第二行到最后一行的字体大小
        ('BACKGROUND', (0, 0), (-1, 0), '#d5dae6'),  # 设置第一行背景颜色
        ('ALIGN', (0, 0), (-1, -1), 'CENTER'),  # 第一行水平居中
        ('ALIGN', (0, 1), (-1, -1), 'LEFT'),  # 第二行到最后一行左右左对齐
        ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),  # 所有表格上下居中对齐
        ('TEXTCOLOR', (0, 0), (-1, -1), colors.darkslategray),  # 设置表格内文字颜色
        ('GRID', (0, 0), (-1, -1), 0.5, colors.grey),  # 设置表格框线为grey色,线宽为0.5
    ]
    table = Table(args, colWidths=col_width, style=style)
    return table

style 中设置表格样式,其中(0, 0)代表的位置。*args传入表格内容。

3. 生成 PDF

接下来,采用上述函数,我们给出一个简单的生成 PDF 的示例。

content = []
# 添加标题
content.append(draw_title('猴哥的AI知识库'))
# 添加小标题
content.append(draw_title('By 猴哥', color=colors.darkslategray, title_style='Heading2', font_size=16))
# 添加段落文字
content.append(draw_text('你好!欢迎来到猴哥的AI知识库,这里汇集了猴哥在AI领域的一些经验和知识。'))
# 添加表格
data = [
    ('编程语言', '排名', '较上年增长'),
    ('Python', '1', '2.7%'),
    ('C++', '2', '-0.4%'),
    ('Java', '3', '-2.1%')
]
content.append(draw_table(*data))
content.append(draw_text(' '))
# 添加图片
content.append(draw_img('1.png'))
# 生成pdf文件
doc = SimpleDocTemplate('1.pdf', pagesize=letter)
doc.build(content)

最终合成的效果如下:

上面仅是一个简单的示例,感兴趣的小伙伴可以结合自己的需求进行尝试。

写在最后

本文带大家采用 Python 和 reportlab 库,实现了一键生成 PDF 文档,旨在帮助大家提供办公效率。

如果本文对你有帮助,欢迎点赞收藏备用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1973652.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

性能测试强化训练营*-可看(随意)

一.性能测试:目的/意义,误区 功能测试 VS 性能测试:测试一辆汽车: 功能: 轮子转不转,方向盘转向动不动,点火能不能打开发动机… --使用者,功能能否按照我的想法去正常使用(应用) 性能: 噪音大不大,百公里加速多少秒&a…

会员制重启却陷“过期门”,盒马鲜生扩张背后隐忧重重

在新零售浪潮中,盒马鲜生曾以“新鲜每一刻”为口号,迅速崛起并赢得了众多消费者的青睐。然而,随着其会员制的重启,一系列食品安全问题却如同阴霾般笼罩在这家新零售巨头的上空,让新老会员倍感失望与不安。 近日&#x…

跳表Java

跳表(Skip List)是一种用于有序数据存储的数据结构,它在链表的基础上增加了多级索引,从而提高了查找、插入和删除操作的效率。跳表的平均时间复杂度为 O ( log ⁡ n ) O(\log n) O(logn),与平衡二叉搜索树&#xff08…

编程小白如何成为大神?——新生入门指南

编程小白如何成为大神?——新生入门指南 作为一名已经从985高校毕业的研究生,我深刻体会到编程已成为当代大学生的必备技能。无论是为了学术研究,还是未来的职业发展,掌握编程都能为我们提供更多的机会和竞争优势。然而&#xff…

vscode启动不了的问题解决

1、安全模式下启动vscode从中查看日志: code --verbose at Ce.d (C:\Users\yonghu\AppData\Local\Programs\Microsoft VS Code\resources\app\out\vs\code\electron-main\main.js:116:3783)at Ce.a (C:\Users\yonghu\AppData\Local\Programs\Microsoft VS Code\res…

ts保姆级学习指南

什么是 TypeScript? TypeScript,简称 ts,是 JavaScript 的超集,而且它最大的特点之一就是引入了静态类型支持。这意味着开发者可以在 TypeScript 中定义变量、函数参数等的类型,编译器会在编译时进行类型检查&#xf…

Ubuntu配置Ngbatis学习环境

引言 经过考虑,我感觉与NebulaGraph交互的ORM框架还是Ngbatis好。因为现在这个框架开发的比较完善,而且还在不断更新,社区活跃的用户多。从今日开始学习,首先要配置一下环境。 1.安装maven和jdk 选择的版本是maven3.8和jdk17.以…

iPhone可运行的谷歌Gemma 2 2B模型,性能超GPT-3.5

在数字化浪潮的推动下,人工智能(AI)正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展,捕捉行业动态;提供深入的新闻解读,助您洞悉技术背后的逻辑;汇聚行业专家的见解,…

关于inet_addr()中的参数不能是 sring类型的 只能是 string类型变量.c_str()

源码展示: extern in_addr_t inet_addr (const char *__cp) __THROW inet_addr中的参数是const char *类型的 定义一个string 类型的ip 使用这个inet_addr()接口 local.sin_addr.s_addr inet_addr(ip_.c_str()); local.sin_addr.s_addr inet_addr(&ip_);…

ELK对业务日志进行收集

ELK对业务日志进行收集 下载httpd 进到文件设置收集httpd的文件进行 设置 编辑内容 用于收集日志的内容 将日志的内容发送到实例当中 input {file{path > /etc/httpd/logs/access_logtype > "access"start_position > "beginning"}file{path &g…

基于SpringBoot+Vue的健身俱乐部网站(带1w+文档)

基于SpringBootVue的健身俱乐部网站(带1w文档) 基于SpringBootVue的健身俱乐部网站(带1w文档) 该系统采用java技术,结合ssm框架使页面更加完善,后台使用MySQL数据库进行数据存储。系统主要分为三大模块:即管理员模块和用户模块、教练模块。本…

openstack之nova-conductor工作原理及常见问题处理

openstack之nova-conductor工作原理及常见问题处理 这里写目录标题 openstack之nova-conductor工作原理及常见问题处理一、简介1. 概念2. 作用3. 体系结构 二、组件1. nova-api2. nova-scheduler3. nova-compute4. nova-conductor5. nova-api-metadata6. nova-placement-api7. …

Java AI伪原创视频创作视频提取文案改写去水印系统小程序源码

🔥AI赋能创作新纪元!伪原创视频文案提取改写去水印全能系统大揭秘 🚀 开篇:创意无界,AI来助力 在这个视觉盛行的时代,视频创作成为了表达自我、传递信息的重要方式。但你是否曾为寻找灵感、撰写文案、处理…

SD-WAN的两种方案及其价值

SD-WAN(软件定义广域网)作为一种新兴的网络架构解决方案,给企业网络带来了极大的灵活性和可扩展性。它允许企业以更低的成本将广泛分布的分支机构连接到数据中心或其他分支机构,同时还能优化网络性能和用户体验。 SD-WAN的工作原理…

C语言之“文件操作”

文章目录 1. 什么是文件?(1. 为什么使用文件?(2.什么是文件2.1 程序文件2.2 数据文件2.3 文件名 2. 二进制文件和文本文件?3. 文件的打开和关闭3.1 流和标准流3.2 文件指针(用来管理流的)3.3 文件的打开与关闭 4. 文件…

vitis (eclipse) 的Indexer不能搜索、不能跳转到函数和变量定义和声明不能打开调用层次的解决方法

在使用vitis(2021.1) 过程中,有一个非常方便实用的功能,就是在函数或变量等源代码上通过右键菜单或快捷键F3、F4、CtrlAltH,也可以按住Ctrl键然后鼠标停留在函数名或变量名上,点击出现的链接,可以跳转到函数或变量的定…

linux磁盘可视化分析工具

在 Linux 系统中,了解磁盘使用情况对于系统维护和优化至关重要。文件和目录随着时间的推移会占据大量磁盘空间,了解哪些部分占用的空间最多可以帮助我们更好地管理和清理磁盘。Baobab,也称为 GNOME Disk Usage Analyzer,是一款非常…

数据化信息时代中开源 AI 智能名片拓客微信小程序的角色与价值

摘要:本文深入探讨了数据化信息的特性,包括其数字化基础、多媒体表现、可转化性及增值利用特点。同时,着重阐述了开源 AI 智能名片拓客微信小程序在这一背景下的重要作用和独特价值,为信息传播与利用提供了新的视角和思路。 关键…

WCF 禁止第三方访问,避免泄露元数据信息

开发的时候,服务端的web.config,将httpGetEnabled和httpsGetEnabled置true,这个时候客户端就可以添加服务引用。开发结束后,部署的时候,将这俩配置改成false

Bug 解决 | 后端项目无法正常启动,或依赖服务连接失败

目录 1、版本问题 2、依赖项问题 明明拷贝的代码,为什么别人行,我启动就报错? 这篇文章我就理一下最最常见的项目启动报错的两种原因! 1、版本问题 比如明明项目的 Java 版本是 8,你非得拿 5 跑?那不是…