当前位置: 首页 > 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;有从其它电脑拷贝过来的…...

Elasticsearch未授权访问漏洞

7.Elasticsearch未授权访问漏洞 Elasticsearch服务普遍存在一个未授权访问的问题&#xff0c;攻击者通常可以请求一个开放9200或9300的服务器进行恶意攻击。 步骤一:使用以下Fofa语法进行Elasticsearch产品搜索 "Elasticsearch" && port"9200" …...

【FPGA】module中CLOCK RESET iCall oDone的含义

一般的module并不只有iData和oData,还有其他的控制信号,如CLOCK RESET iCall oDone 基本的模式为 module cordicSinhCosh (input CLOCK,RESET,input iCall, output oDone,input [31:0]iData, output [31:0]oData, );reg [31:0] x;initial begin x = ...endreg signed [31:…...

OpenGL实现3D游戏编程【连载2】——了解并创建3D空间模型

1、本节实现的内容 上一节我们创建一个简单的窗口&#xff0c;本节我们需要了解一下细节内容&#xff0c;同时为了方便观看&#xff0c;我们需要显示一个世界坐标轴&#xff0c;建立一个直观的三维空间。 2、我们的眼睛设定&#xff08;gluPerspective函数&#xff09; 上一…...

Java-文件操作和IO

文件介绍 文件本身有多重含义,狭义的文件,特指硬盘上的文件(以及保存文件的目录),广义的文件:计算机上的很多硬件设备,软件资源,在操作系统中,都会被视为是"文件" 文件除了有数据内容之外,还有一部分信息,例如文件名,文件类型,文件大小,这些信息可以称作文件的元信…...

AI智能化赋能电商经济,守护消费净土,基于轻量级YOLOv8n开发构建公共生活景下的超大规模500余种商品商标logo智能化检测识别分析系统

在数字经济浪潮的推动下&#xff0c;全力发展新质生产力已成为当今社会发展的主旋律。各行各业正经历着前所未有的变革&#xff0c;其中&#xff0c;电商行业作为互联网经济的重要组成部分&#xff0c;更是以惊人的速度重塑着商业格局与消费模式。AI智能化技术的深度融合&#…...

C语言菜鸟入门·数据结构·链表超详细解析

目录 1. 单链表 1.1 什么是单链表 1.1.1 不带头节点的单链表 1.1.2 带头结点的单链表 1.2 单链表的插入 1.2.1 按位序插入 &#xff08;1&#xff09;带头结点 &#xff08;2&#xff09;不带头结点 1.2.2 指定结点的后插操作 1.2.3 指定结点的前插操作 1.3 …...

C# Unity 面向对象补全计划 七大原则 之 依赖倒置原则 (DIP)难度:☆☆ 总结:多抽象,多接口,少耦合

本文仅作学习笔记与交流&#xff0c;不作任何商业用途&#xff0c;作者能力有限&#xff0c;如有不足还请斧正 本系列作为七大原则和设计模式的进阶知识&#xff0c;看不懂没关系 请看专栏&#xff1a;http://t.csdnimg.cn/mIitr&#xff0c;查漏补缺 1.依赖倒置原则 (DIP) 这…...

大模型面试问题

综合基础 1、讲讲制作一个LLM的流程以及各阶段的作用 2、发现模型性能不好&#xff0c;如何从各个阶段去排查问题 查看各阶段中是否有对应训练数据&#xff0c;然后再向下排查。预训练 1、Transfomer模型介绍一下 2、讲讲 Q、K、V 3、Transfomer模型中Encoder输出给Decoder的…...

keeplive配置详解与haproxy配置详解

一、keepalive相关知识 1.1 keepalive介绍 keepalive即LVS集群当中的高可用架构&#xff0c;只是针对调度器的高可用。是高可用的HA架构。 keepalive就是基于VRRP协议来实现LVS高可用的方案。 1、组播地址 224.0.0.18&#xff0c;根据组播地址进行通信&#xff0c;主备之间发…...

vivado里的LUT、LUTRAM、FF、BRAM、DSP、IO、BUFG、MMCM资源介绍

vivado里的LUT、LUTRAM、FF、BRAM、DSP、IO、BUFG、MMCM资源介绍 提示&#xff1a;以下是本篇文章正文内容&#xff0c;写文章实属不易&#xff0c;希望能帮助到各位&#xff0c;转载请附上链接。 vivado实现电路用到的资源类型 LUT&#xff08;Look-Up Table&#xff09;&am…...