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

Python 图文:小白也能轻松生成精美 PDF 报告!

摘要:  还在为枯燥的数据报表发愁吗?想让你的 Python 项目报告瞬间高大上?本文将带你学习如何使用 Python 生成图文并茂的 PDF 文件,从此告别单调,让你的数据“活”起来!

一、 引言

想象一下,你正在为公司做一个用户行为分析,如果只是把一堆表格数据扔给老板,他可能很难理解。但如果你能用 Python 生成一份精美的 PDF 报告,包含了各种图表、分析结论,甚至还有代码示例,是不是瞬间就高大上了呢?

二、 Python 生成 PDF 的利器:ReportLab 库

Python 社区提供了丰富的库来处理 PDF 文件,其中 ReportLab 库功能强大且易于上手,非常适合用来生成图文并茂的报告。

安装 ReportLab:

pip install reportlab

三、 小试牛刀:生成简单的 PDF 文档

让我们先从一个简单的例子开始,了解 ReportLab 的基本用法:

from reportlab.pdfgen import canvas# 创建一个 PDF 文件
c = canvas.Canvas("hello.pdf")# 设置字体和字号
c.setFont("Helvetica", 16)# 在指定位置写入文本
c.drawString(100, 750, "Hello, world!")# 保存 PDF 文件
c.save()

代码解读:

1、from reportlab.pdfgen import canvas: 导入 canvas 模块,它提供了创建 PDF 文件的基本功能。

2、c = canvas.Canvas("hello.pdf"): 创建一个名为 "hello.pdf" 的 PDF 文件对象。

3、c.setFont("Helvetica", 16): 设置字体为 Helvetica,字号为 16。

4、c.drawString(100, 750, "Hello, world!"): 在坐标 (100, 750) 处写入文本 "Hello, world!"。

5、c.save(): 保存 PDF 文件。

运行这段代码,你会在当前目录下得到一个名为 "hello.pdf" 的文件,打开它,你就会看到 "Hello, world!" 这段文字。

四、 图文并茂:插入图片和表格

除了文本,ReportLab 还支持插入图片、表格等元素,让你的 PDF 报告更加丰富多彩。

插入图片:

from reportlab.lib.units import cm
from reportlab.pdfgen import canvas# 创建一个 PDF 文件
c = canvas.Canvas("hello.pdf")# 设置字体和字号
c.setFont("Helvetica", 16)# 在指定位置写入文本
c.drawString(100, 750, "Hello, world!")# 插入图片
c.drawImage("logo.png", 100, 650, width=5*cm, height=3*cm)# 保存 PDF 文件
c.save()

代码解读:

  • from reportlab.lib.units import cm: 导入单位转换模块,方便我们使用厘米作为单位。

  • c.drawImage("logo.png", 100, 650, width=5*cm, height=3*cm): 在坐标 (100, 650) 处插入名为 "logo.png" 的图片,并设置图片的宽度为 5 厘米,高度为 3 厘米。

请注意:  你需要将一张名为 "logo.png" 的图片放置在与代码相同的目录下,或者修改代码中的图片路径。

插入表格:

from reportlab.lib.units import cm
from reportlab.pdfgen import canvas
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle
from reportlab.lib import colors# 创建一个 PDF 文件
c = canvas.Canvas("hello.pdf")# 设置字体和字号
c.setFont("Helvetica", 16)# 在指定位置写入文本
c.drawString(100, 750, "Hello, world!")# 插入图片
c.drawImage("logo.png", 100, 650, width=5*cm, height=3*cm)# 创建表格数据
data = [['姓名', '年龄', '性别'],['张三', 25, '男'],['李四', 30, '女']]# 创建表格对象
table = Table(data)# 设置表格样式
style = TableStyle([('BACKGROUND', (0, 0), (-1, 0), colors.grey),('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke),('ALIGN', (0, 0), (-1, -1), 'CENTER'),('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'),('FONTSIZE', (0, 0), (-1, 0), 14),('BOTTOMPADDING', (0, 0), (-1, 0), 12),('BACKGROUND', (0, 1), (-1, -1), colors.beige),('GRID', (0, 0), (-1, -1), 1, colors.black)
])
table.setStyle(style)# 将表格添加到 PDF 文档
table.wrapOn(c, 100, 500)
table.drawOn(c, 100, 500)# 保存 PDF 文件
c.save()

代码解读:

1、from reportlab.platypus import SimpleDocTemplate, Table, TableStyle: 导入 Table 和 TableStyle 模块,用于创建和设置表格样式。

2、data = [['姓名', '年龄', '性别'], ...]: 创建一个二维列表作为表格数据。

3、table = Table(data): 创建一个表格对象。

4、style = TableStyle([...]): 创建一个表格样式对象,设置表格的背景颜色、字体颜色、对齐方式、边框等。

5、table.setStyle(style): 将样式应用到表格。

6、table.wrapOn(c, 100, 500): 计算表格的尺寸,为其在 PDF 文档中预留空间。

7、table.drawOn(c, 100, 500): 在坐标 (100, 500) 处绘制表格。

五、 实际案例:生成股票分析报告

以下是一个简单的股票分析报告的例子,你需要预先生成 K 线图并保存为 "k_line_chart.png" 文件:

from reportlab.pdfgen import canvas
from reportlab.lib.units import cm
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Image
from reportlab.lib.styles import getSampleStyleSheet# 假设我们已经获取了股票数据和分析结果
stock_name = "阿里巴巴"
stock_code = "BABA"
analysis_result = "预计未来一年股价将上涨 10%..."# 创建 PDF 文档
doc = SimpleDocTemplate("stock_report.pdf")# 创建故事流,用于存储 PDF 内容
story = []# 添加标题
styles = getSampleStyleSheet()
title = Paragraph(f"股票分析报告:{stock_name} ({stock_code})", styles['Heading1'])
story.append(title)
story.append(Spacer(1, 2*cm))# 添加分析结果
paragraph = Paragraph(analysis_result, styles['Normal'])
story.append(paragraph)
story.append(Spacer(1, 1*cm))# 添加 K 线图 (假设已经生成图片文件)
image = Image("k_line_chart.png", width=15*cm, height=8*cm)
story.append(image)# 生成 PDF 文件
doc.build(story)

请注意: 你需要将一张名为 "k_line_chart.png" 的图片放置在与代码相同的目录下,或者修改代码中的图片路径。

六、 总结

本文介绍了使用 Python 生成图文并茂 PDF 文件的基本方法,并通过股票分析报告的例子展示了 ReportLab 库的强大功能。当然,ReportLab 还有更多高级特性等待你去探索,比如自定义页面布局、添加水印、生成目录等等。相信通过不断学习和实践,你一定能用 Python 创建出更加精美实用的 PDF 文档!

相关文章:

Python 图文:小白也能轻松生成精美 PDF 报告!

摘要: 还在为枯燥的数据报表发愁吗?想让你的 Python 项目报告瞬间高大上?本文将带你学习如何使用 Python 生成图文并茂的 PDF 文件,从此告别单调,让你的数据“活”起来! 一、 引言 想象一下,你正在为公司…...

AQS的ReentrantLock源码

什么是AQS(全称AbstractQueuedSynchronizer) 代表:重入锁、独占锁/共享锁、公平锁/非公平锁 是JUC包中线程阻塞、阻塞队列、唤醒、尝试获取锁的一个框架 AbstractQueuedSynchronizer是全称,是一个模板模式,一些线程…...

CSP-J 模拟题2

如果x大于45&#xff0c;则输出-1 设定一个整数now&#xff0c;他的初始值为9&#xff1b; 当x>now&#xff0c;就x-now&#xff0c;并且now--; 根据解析写代码1&#xff1a; #include <bits/stdc.h> using namespace std; int a[101010]; int main(){int x;cin>…...

途牛养车省养车平台源码 买卖新车租车二手车维修装潢共享O2O程序源码

源码采用FastAdmin框架开发&#xff0c;功能成熟完善&#xff0c;已有成功案例。 业务涵盖保险、二手车、接送、拖车、租车、保养、维修、入驻等连接线上等基础和深度服务。 采用的是“线上 车主直控社区加盟店” 模式&#xff0c;其主要考虑是布局门店有助于让目标消费用户…...

开发中遇到的gzuncompress,DomDocument等几个小问题以及一次Php上线碰到的502问题及php异常追踪

一、开发中遇到的gzuncompress,DomDocument等几个小问题记在此 1&#xff0c;昨天在命令行模式行运行一个很复杂的程序&#xff0c;一开始执行php&#xff0c;刚刚连接数据库&#xff0c;都没怎么查几条记录&#xff0c;&#xff08;publish:October 27, 2017 -Friday&#xff…...

【Material-UI】Button 组件中的基本按钮详解

文章目录 一、基本按钮变体1. 文本按钮&#xff08;Text Button&#xff09;2. 实心按钮&#xff08;Contained Button&#xff09;3. 轮廓按钮&#xff08;Outlined Button&#xff09; 二、应用场景与注意事项1. 使用场景2. 注意事项 三、总结 Material-UI 的 Button 组件是前…...

人工智能自动驾驶三维车道线检测—PersFormer模型代码详解

文章目录 1. 背景介绍2. 数据加载和预处理3. 模型结构4. Loss计算5. 总结和讨论 1. 背景介绍 梳理了PersFormer 3D Lane这篇论文对应的开源代码。 2. 数据加载和预处理 数据组织方式参考&#xff1a;自动驾驶三维车道线检测系列—OpenLane数据集介绍。 坐标系参考&#xff…...

LangChain +Streamlit+ Llama :将对话式人工智能引入您的本地设备成为可能(上篇)

&#x1f99c;️ LangChain Streamlit&#x1f525; Llama &#x1f999;&#xff1a;将对话式人工智能引入您的本地设备&#x1f92f; 将开源LLMs和LangChain集成以进行免费生成式问答&#xff08;不需要API密钥&#xff09; 在过去的几个月中&#xff0c;大型语言模型(LLMs)得…...

sql注入部分总结和复现

一个端口对应一个服务 联合查询注入 所有的程序中&#xff0c;单双引号必须成对出现 需要从这个引号里面逃出来 在后面查询内容 ?id1 要查库名&#xff0c;表名&#xff0c;列名。但是联合查询要知道有多少列&#xff0c;所以通过order by 去查询 order by # 通过二分法…...

开源企业级后台管理的快速启动引擎:Ballcat

Ballcat&#xff1a;快速搭建&#xff0c;高效管理&#xff0c;Ballcat让企业后台开发更简单。 - 精选真开源&#xff0c;释放新价值。 概览 Ballcat&#xff0c;一个专为企业级后台管理而设计的快速开发框架&#xff0c;以其高效的开发模式和全面的安全特性&#xff0c;为开发…...

FashionAI比赛-服饰属性标签识别比赛赛后总结(来自 Top14 Team)

关联比赛: FashionAI全球挑战赛—服饰属性标签识别 推荐大家看本篇博客之前&#xff0c;看一下数据集制作的方法&#xff0c;如何做一个实用的图像数据集 PS&#xff1a;我是参加完比赛之后才看的&#xff0c;看完之后&#xff0c;万马奔腾.....&#xff0c;因为发现比赛中还…...

C语言 | Leetcode C语言题解之第319题灯泡开关

题目&#xff1a; 题解&#xff1a; int bulbSwitch(int n) {return sqrt(n 0.5); }...

【第十届泰迪杯数据挖掘挑战赛A题害虫识别】-农田害虫检测识别-高精度完整更新

农田害虫检测识别项目-高精度完整版 一、说明&#xff1a; 该版本为基于泰迪杯完整害虫数据重新制作数据集、优化增强数据集、重新进行模型训练&#xff0c;达到高精度、高召回率的最优模型代码。包含论文、最优模型文件以及相关文件、原始数据集、训练数据集XML版、增强扩充…...

【Linux】—— Linux进程状态(R、S、D、T、Z、X)

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;Linux跬步积累 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日一题 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0…...

重生之我在NestJS中使用EventStream

有一个需求是需要长连接等待后台的返回&#xff0c;我们使用的EventStream&#xff0c;在NestJS中使用很简单&#xff0c;框架基本上已经封装好了 0. 如果没有创建项目的&#xff0c;可以先创建一个项目&#xff0c;创建项目的直接跳转到下一个步骤去 全局安装 nest: npm inst…...

自动化工具Selenium IDE基本使用——脚本录制

1 简介 Selenium相信大家都知道&#xff0c;在做自动化操作时&#xff0c;要使用浏览器驱动直接控制浏览器操作的时候&#xff0c;大多会结合Selenium框架使用。 但在对网页操作自动化的时候&#xff0c;实际上有一种更轻量的做法&#xff0c;那就是直接使用Selenium IDE&…...

【第十一天】进程调度算法,进程间通信方式,进程同步和互斥

进程调度算法有哪些 进程调度算法是操作系统中用来管理和调度进程&#xff08;任务&#xff0c;作业&#xff09;执行的方法。这些方法决定了在多任务环境下&#xff0c;如何为各个进程分配CPU时间&#xff0c;以实现公平性、高吞吐量、低延迟等目标。 先到先服务调度算法&am…...

Python的lambda函数

Python中的lambda函数是一种小型匿名函数&#xff0c;它允许你在需要函数对象的地方快速定义单行的小函数。lambda函数通常用于编写简洁的代码&#xff0c;尤其是当使用高阶函数&#xff08;如map()、filter()、reduce()等&#xff09;时。它们可以接收任何数量的参数&#xff…...

java9-泛型

1.泛型的简介 1.1 什么是泛型 泛型是一种特殊的数据类型。 它是Java 的一个高级特性。在 Mybatis、Hibernate 这种持久化框架&#xff0c;泛型更是无处不在。 在这之前&#xff0c;不管我们在定义成员变量时&#xff0c;还是方法的形参时&#xff0c;都要规定他们的具体类型…...

zotero安装与使用

文献管理工具&#xff09; Zotero软件官网https://www.zotero.org/download&#xff0c;不修改安装位置&#xff0c;默认安装就行&#xff1b;安装完成官网直接邮箱注册一个账号&#xff0c;软件登陆账号:编辑-首选项-同步 修改论文保存位置&#xff0c;有从其它电脑拷贝过来的…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释

以Module Federation 插件详为例&#xff0c;Webpack.config.js它可能的配置和含义如下&#xff1a; 前言 Module Federation 的Webpack.config.js核心配置包括&#xff1a; name filename&#xff08;定义应用标识&#xff09; remotes&#xff08;引用远程模块&#xff0…...

鸿蒙HarmonyOS 5军旗小游戏实现指南

1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;采用DevEco Studio实现&#xff0c;包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...

对象回调初步研究

_OBJECT_TYPE结构分析 在介绍什么是对象回调前&#xff0c;首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例&#xff0c;用_OBJECT_TYPE这个结构来解析它&#xff0c;0x80处就是今天要介绍的回调链表&#xff0c;但是先不着急&#xff0c;先把目光…...

写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里

写一个shell脚本&#xff0c;把局域网内&#xff0c;把能ping通的IP和不能ping通的IP分类&#xff0c;并保存到两个文本文件里 脚本1 #!/bin/bash #定义变量 ip10.1.1 #循环去ping主机的IP for ((i1;i<10;i)) doping -c1 $ip.$i &>/dev/null[ $? -eq 0 ] &&am…...