Python中的PDF处理工具:PyPDF2和ReportLab使用指南

Python中的PDF处理工具:PyPDF2和ReportLab使用指南

在日常工作和项目中,PDF 文件处理是个常见需求,不论是合并报告、加密文档、填充表单,还是生成发票。Python 中有许多用于操作 PDF 文件的库,其中 PyPDF2ReportLab 是两个广泛使用的工具:前者用于 PDF 文档的读取和修改,后者用于从头生成 PDF 文件。在这篇博客中,我们将介绍如何使用 PyPDF2 和 ReportLab 完成一些常见的 PDF 处理任务。

一、安装 PyPDF2 和 ReportLab

要开始使用 PyPDF2 和 ReportLab,首先需要安装它们。可以在终端或命令提示符中执行以下命令:

pip install PyPDF2 reportlab

安装完成后,即可使用它们进行 PDF 的读写和生成操作。


二、使用 PyPDF2 操作 PDF 文件

PyPDF2 是一个强大的 PDF 处理库,它提供了多种功能,可以让我们读取、合并、拆分、加密和解密 PDF 文件。以下是 PyPDF2 的一些常见操作。

1. 读取 PDF 文件

首先,让我们看看如何用 PyPDF2 打开并读取 PDF 文件的内容。

from PyPDF2 import PdfReader# 打开 PDF 文件
reader = PdfReader("example.pdf")# 获取页面数
num_pages = len(reader.pages)
print(f"Total pages: {num_pages}")# 读取每一页的内容
for page_num in range(num_pages):page = reader.pages[page_num]text = page.extract_text()print(f"Page {page_num + 1}:\n{text}")

在这个例子中,我们使用 PdfReader 类打开 PDF 文件,并通过 extract_text() 方法提取每一页的文本内容。这种方式适合从 PDF 中读取纯文本内容,比如报告和文档。

2. 合并 PDF 文件

合并多个 PDF 文件是 PyPDF2 的强项之一。以下是将两个 PDF 文件合并成一个 PDF 文件的示例:

from PyPDF2 import PdfWriter, PdfReader# 创建 PDF 写入器
writer = PdfWriter()# 读取两个 PDF 文件并将它们的页面添加到写入器中
pdf_files = ["file1.pdf", "file2.pdf"]
for pdf_file in pdf_files:reader = PdfReader(pdf_file)for page in reader.pages:writer.add_page(page)# 保存合并后的 PDF 文件
with open("merged_output.pdf", "wb") as output_pdf:writer.write(output_pdf)

在这个示例中,我们创建了一个 PdfWriter 实例,依次读取每个 PDF 文件,并将其页面添加到写入器中。最终,合并后的 PDF 文件会保存为 merged_output.pdf

3. 拆分 PDF 文件

如果需要将 PDF 文件中的某些页面提取出来,也可以通过 PyPDF2 实现。例如,提取 PDF 文件中的第 1 页到第 3 页:

from PyPDF2 import PdfWriter, PdfReaderreader = PdfReader("example.pdf")
writer = PdfWriter()# 提取特定页
for i in range(3):  # 这里表示提取第1页到第3页writer.add_page(reader.pages[i])# 保存拆分后的文件
with open("split_output.pdf", "wb") as output_pdf:writer.write(output_pdf)

此代码将 example.pdf 的前 3 页提取并保存为 split_output.pdf

4. 加密和解密 PDF 文件

对于机密文件,PyPDF2 提供了加密和解密功能。我们可以使用 encrypt 方法设置密码保护 PDF 文件:

writer = PdfWriter()
reader = PdfReader("example.pdf")# 添加所有页面
for page in reader.pages:writer.add_page(page)# 加密并设置密码
writer.encrypt("password123")# 保存加密的文件
with open("encrypted_output.pdf", "wb") as output_pdf:writer.write(output_pdf)

在这个例子中,encrypted_output.pdf 文件只能通过密码“password123”打开,确保了文件的安全性。


三、使用 ReportLab 生成 PDF 文件

ReportLab 是另一个强大的 PDF 库,适合从头生成 PDF 文件,并支持复杂的布局和样式。ReportLab 使用 画布(Canvas)进行 PDF 内容的绘制,可以生成包含文本、图形和表格的 PDF 文件。

1. 创建 PDF 文件并添加文本

首先,让我们看如何使用 ReportLab 创建一个简单的 PDF 文件并添加文本:

from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas# 创建 PDF 文件
pdf_path = "generated_example.pdf"
pdf_canvas = canvas.Canvas(pdf_path, pagesize=A4)# 添加文本
pdf_canvas.drawString(100, 750, "Hello, ReportLab!")
pdf_canvas.drawString(100, 730, "This is a simple PDF file created using Python.")# 保存并关闭 PDF
pdf_canvas.save()
print(f"PDF saved as {pdf_path}")

在此代码中,drawString 方法可以指定文本位置,单位为点(pt),A4 页面的尺寸是 595x842 pt。在 100, 750 位置写入文本 “Hello, ReportLab!”。

2. 添加图片和图形

ReportLab 允许将图片插入到 PDF 中,并能绘制各种形状,这对于生成图表或带有图像的报告非常有用。

from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas# 创建 PDF 文件
pdf_path = "pdf_with_image.pdf"
pdf_canvas = canvas.Canvas(pdf_path, pagesize=A4)# 添加图片
pdf_canvas.drawImage("example_image.jpg", 100, 500, width=200, height=150)# 绘制矩形
pdf_canvas.setStrokeColorRGB(0, 0, 1)  # 蓝色边框
pdf_canvas.setFillColorRGB(0.8, 0.8, 1)  # 浅蓝填充
pdf_canvas.rect(100, 450, 200, 100, fill=True)# 保存 PDF
pdf_canvas.save()
print(f"PDF with image and shapes saved as {pdf_path}")

在这里,我们插入了一张图片,并绘制了一个蓝色矩形,位置在 (100, 450),尺寸为 200x100drawImage 方法可以用来插入图像文件,支持 JPG 和 PNG 格式。

3. 添加表格

ReportLab 的 Table 类可以方便地创建和格式化表格。以下示例展示了如何在 PDF 中插入一个包含数据的表格:

from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas
from reportlab.platypus import Table, TableStyle
from reportlab.lib import colors# 创建 PDF 文件
pdf_path = "pdf_with_table.pdf"
pdf_canvas = canvas.Canvas(pdf_path, pagesize=A4)# 表格数据
data = [["Product", "Price", "Quantity"],["Widget", "$25.00", "10"],["Gadget", "$15.00", "30"],["Doohickey", "$5.00", "50"]
]# 创建表格
table = Table(data)
table.setStyle(TableStyle([("BACKGROUND", (0, 0), (-1, 0), colors.grey),("TEXTCOLOR", (0, 0), (-1, 0), colors.whitesmoke),("ALIGN", (0, 0), (-1, -1), "CENTER"),("GRID", (0, 0), (-1, -1), 0.5, colors.black),("BACKGROUND", (0, 1), (-1, -1), colors.beige),
]))# 将表格添加到 PDF
table.wrapOn(pdf_canvas, 400, 300)
table.drawOn(pdf_canvas, 100, 600)# 保存 PDF
pdf_canvas.save()
print(f"PDF with table saved as {pdf_path}")

在此代码中,我们创建了一个包含产品、价格和数量信息的表格,并设置了样式,包括背景颜色、对齐方式和边框线。


四、汇总

PyPDF2 和 ReportLab 是处理 PDF 文件的两大主要工具,各有其强项:

  • PyPDF2:适用于读取、合并、拆分和加密 PDF 文件,主要用于处理现有的 PDF 文件。
  • ReportLab:用于从头生成 PDF 文件,可以精确控制布局,适合创建发票、报表和其他定制文档。

这两个库的结合可以帮助我们实现全面的 PDF 处理需求,从简单的文件合并到复杂的图表和表格创建,Python 都能轻松完成。希望这篇指南能帮您更好地掌握这两个库的使用方法,实现 PDF 的自动化处理。


五、综合应用:生成发票 PDF 示例

在这里,我们将 PyPDF2 和 ReportLab 结合使用,生成一个包含公司信息、客户信息和项目列表的发票 PDF。这种场景在实际应用中非常常见。

1. 创建发票模板

首先,我们使用 ReportLab 创建一个发票模板文件 invoice_template.pdf,包括公司标志、发票标题和必要的表格格式:

from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas
from reportlab.platypus import Table, TableStyle
from reportlab.lib import colorsdef create_invoice_template():pdf_path = "invoice_template.pdf"pdf_canvas = canvas.Canvas(pdf_path, pagesize=A4)# 设置页面标题pdf_canvas.setFont("Helvetica-Bold", 16)pdf_canvas.drawString(220, 800, "Invoice")# 公司信息pdf_canvas.setFont("Helvetica", 12)pdf_canvas.drawString(50, 780, "Company Name: XYZ Ltd.")pdf_canvas.drawString(50, 765, "Address: 123 Example St., City")pdf_canvas.drawString(50, 750, "Phone: (123) 456-7890")pdf_canvas.drawString(50, 735, "Email: contact@xyz.com")# 客户信息部分pdf_canvas.drawString(50, 700, "Bill To:")pdf_canvas.drawString(50, 685, "Customer Name:")pdf_canvas.drawString(50, 670, "Customer Address:")# 添加表格表头data = [["Item", "Description", "Quantity", "Unit Price", "Total"]]table = Table(data)table.setStyle(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), 12),("BOTTOMPADDING", (0, 0), (-1, 0), 12),("GRID", (0, 0), (-1, -1), 0.5, colors.black),]))table.wrapOn(pdf_canvas, 450, 400)table.drawOn(pdf_canvas, 50, 600)# 保存模板pdf_canvas.save()print(f"Invoice template saved as {pdf_path}")# 生成模板
create_invoice_template()

在这个代码中,我们设置了发票的基本结构,包括公司和客户信息的显示位置,以及一张带有标题的表格,用于填写产品或服务明细。

2. 使用 PyPDF2 填写客户信息和项目详情

接下来,我们用 PyPDF2 在生成的模板上填写客户信息和项目详情。我们将客户信息和项目列表写入 invoice_filled.pdf 文件。

from PyPDF2 import PdfReader, PdfWriter
from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas
from io import BytesIOdef fill_invoice(customer_name, customer_address, items):# 打开模板reader = PdfReader("invoice_template.pdf")writer = PdfWriter()# 创建一个内存缓冲区来绘制覆盖内容packet = BytesIO()pdf_canvas = canvas.Canvas(packet, pagesize=A4)# 填写客户信息pdf_canvas.setFont("Helvetica", 12)pdf_canvas.drawString(150, 685, customer_name)pdf_canvas.drawString(150, 670, customer_address)# 填写项目明细y = 580for item in items:pdf_canvas.drawString(50, y, item["item"])pdf_canvas.drawString(150, y, item["description"])pdf_canvas.drawString(250, y, str(item["quantity"]))pdf_canvas.drawString(350, y, f"${item['unit_price']:.2f}")pdf_canvas.drawString(450, y, f"${item['quantity'] * item['unit_price']:.2f}")y -= 20  # 调整 y 坐标,确保每一项在新行# 保存绘制的内容pdf_canvas.save()# 将覆盖内容作为新页面内容合并packet.seek(0)overlay = PdfReader(packet)for page in reader.pages:page.merge_page(overlay.pages[0])writer.add_page(page)# 保存带内容的发票with open("invoice_filled.pdf", "wb") as output_pdf:writer.write(output_pdf)print("Invoice filled and saved as invoice_filled.pdf")# 示例数据
customer_name = "John Doe"
customer_address = "456 Example Ave., City"
items = [{"item": "Widget", "description": "High-quality widget", "quantity": 5, "unit_price": 20.00},{"item": "Gadget", "description": "Advanced gadget", "quantity": 3, "unit_price": 35.00},{"item": "Doohickey", "description": "Multi-purpose tool", "quantity": 2, "unit_price": 15.50},
]# 生成发票
fill_invoice(customer_name, customer_address, items)

在这个代码中,我们使用 fill_invoice 函数将客户信息和项目明细填充到 invoice_template.pdf 的模板中,并将其保存为 invoice_filled.pdf。每个项目明细按行填写,包括产品名称、描述、数量、单价和总价。


六、总结

在本教程中,我们学习了如何使用 PyPDF2 和 ReportLab 来处理 PDF 文件,从读取和合并现有文件,到从头生成和填充内容的自定义发票。这些技术为日常工作中的 PDF 操作带来了高效的解决方案,使自动化 PDF 处理成为可能。

借助 PyPDF2 和 ReportLab,您可以轻松创建自动化脚本生成 PDF 报告,处理包含敏感数据的加密文件,或构建批量文件处理系统。希望通过这篇博客,您能够灵活运用这两个库,提高 PDF 文件处理的效率。

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

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

相关文章

【系统面试篇】进程和线程类(1)(笔记)——区别、通讯方式、同步、互斥、锁分类

目录 一、问题综述 1. 进程和线程的区别? 2. 进程的状态有哪些? 3. 进程之间的通信方式? (1)管道 (2)消息队列 (3)共享内存 (4)信号量 &#xff08…

nginx(四):如何在 Nginx 中配置以保留真实 IP 地址

如何在 Nginx 中配置以保留真实 IP 地址 1、概述2、nginx配置示例2.1、配置说明2.2、客户端获取真实IP2.2.1、代码说明 3、插曲4、总结 大家好,我是欧阳方超,可以我的公众号“欧阳方超”,后续内容将在公众号首发。 1、概述 当使用nginx作为…

C++《list的模拟实现》

在上一篇C《list》专题当中我们了解了STL当中list类当中的各个成员函数该如何使用,接下来在本篇当中我们将试着模拟实现list,在本篇当中我们将通过模拟实现list过程中深入理解list迭代器和之前学习的vector和string迭代器的不同,接下来就开始…

本篇万字,博客最细,oled多级菜单代码解析,与实现教程,指针实现(含源码)!!!

目录 教程前言 多级菜单基本知识 驱动文件创建 ​编辑 ​编辑 ​编辑 定义菜单数据类型代码解析 按键代码解析 菜单数据赋值代码解析 菜单按键切换显示代码解析 项目工程移植地址 教程前言 前言:编写不易&#xf…

华为HarmonyOS打造开放、合规的广告生态 - 贴片广告

场景介绍 贴片广告是一种在视频播放前、视频播放中或视频播放结束后插入的视频或图片广告。 接口说明 接口名 描述 loadAd(adParam: AdRequestParams, adOptions: AdOptions, listener: AdLoadListener): void 请求单广告位广告,通过AdRequestParams、AdOptions…

Leetcode137只出现一次的数字|| 及其拓展

简述: 虽然标题是这么描述的,但是我们不是一上来就解这道题,先看一下他的子题和扩展 子题:136. 只出现一次的数字 - 力扣(LeetCode) 扩展题: 所以我们由易到难,先来看第一道&#x…

【解决办法】无法使用右键“通过VSCode打开文件夹”

个人博客:苏三有春的博客 前言 作者的编程环境为VScode,工作时常使用VScode打开整个工程文件夹。如果先打开VScode再从VScode中选择文件夹打开效率太慢,作者一般使用的方式是右键文件夹,直接选择"通过code打开文件夹"…

数据揭秘:掌握K-means聚类算法的精髓与实践

数据揭秘:掌握K-means聚类算法的精髓与实践 在机器学习领域,聚类是一种探索性的数据挖掘技术,用于将数据集中的样本划分成若干个簇,使得同一簇内的样本相似度高,而不同簇之间的样本相似度低。本文将深入探讨聚类分析的…

ADNI蛋白质数据集下载

(我发现这个网站最近又更新了界面,现在变得很好看很简洁,但是有一些入口变了) 1.官网链接 https://ida.loni.usc.edu/home/projectPage.jsp?projectADNI 2.登录 选择ADNI(其实PPMI数据也是这样下的)&a…

【数据分享】2024年我国省市县三级的生活服务设施数量(46类设施/Excel/Shp格式)

人才市场、售票处、旅行社等生活服务设施的配置情况是一个城市公共基础设施完善程度的重要体现,一个城市生活服务设施种类越丰富,数量越多,通常能表示这个城市的公共服务水平越高! 本次我们为大家带来的是我国各省份、各地级市、…

彻底解决idea不识别java项目

需求背景 下载了一个java swing的项目,通过idea导入后,项目无法识别。打开java文件,也不会报错,也不编译。 无法识别效果图 可以看到左侧的菜单,项目是没有被识别。 打开java文件,可以看到没有识别,java的图标也没有出现。 解决方法 1、打开Project Structure 2、修改…

HTMLCSS:打造酷炫下载安装模拟按钮

效果演示 这段代码通过HTML和CSS创建了一个具有交互效果的下载按钮&#xff0c;当复选框被选中时&#xff0c;会触发一系列动画和样式变化&#xff0c;模拟了一个下载和安装的过程&#xff0c;包括圆形的动画、文本的显示和隐藏等。 HTML <div class"container&quo…

Multi Agents协作机制设计及实践

01 多智能体协作机制的背景概述 在前述博客中&#xff0c;我们利用LangChain、AutoGen等开发框架构建了一个数据多智能体的平台&#xff0c;并使用了LangChain的Multi-Agents框架。然而&#xff0c;在实施过程中&#xff0c;我们发现现有的框架存在一些局限性&#xff0c;这些…

ML2001-1 机器学习/深度学习 Introduction of Machine / Deep Learning

图片说明来自李宏毅老师视频的学习笔记&#xff0c;如有侵权&#xff0c;请通知下架 影片参考 【李宏毅】3.第一节 - (上) - 机器学习基本概念简介_哔哩哔哩_bilibili 1. 机器学习的概念与任务类型 概念&#xff1a;机器学习近似于寻找函数&#xff0c;用于处理不同类型的任…

90%会展主办方都会用的6款数字化工具

在会展行业&#xff0c;数字化转型已成为提升竞争力的关键。面对日益增长的运营成本和收入增长的瓶颈&#xff0c;主办方需要借助数字化工具来实现效率提升和成本控制。 今天介绍几种常见的数字化工具和应用方式。 一、线上展览平台 构建线上展览平台是会展主办方拓展线上销…

JMeter快速造数之数据导入导出

导入数据 输入表格格式如下 创建CSV Data Set Config 在Body Data中调用 { "username": "${email}", "password": "123456", "client_id": "00bb9dbfc67439a5d42e0e19f448c7de310df4c7fcde6feb5bd95c6fac5a5afc"…

渗透测试-快速获取目标中存在的漏洞(小白版)

《Java代码审计》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484219&idx1&sn73564e316a4c9794019f15dd6b3ba9f6&chksmc0e47a67f793f371e9f6a4fbc06e7929cb1480b7320fae34c32563307df3a28aca49d1a4addd&scene21#wechat_redirect 《Web安全》h…

[免费]基于Python的Django+Vue3在线考试系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的基于Python的DjangoVue3在线考试系统&#xff0c;分享下哈。 项目视频演示 【免费】基于Python的DjangoVue3在线考试系统 Python毕业设计_哔哩哔哩_bilibili 项目介绍 本论文提出并实现了一种基于Python…

Unity3D学习FPS游戏(9)武器音效添加、创建敌人模型和血条

前言&#xff1a;虽然已经实现了基本玩家操作&#xff0c;但是游戏运行起来并没有音效。既然是FPS游戏有了玩家和武器&#xff0c;肯定还得有敌人。本篇演示如何给武器添加音效和创建敌人。 武器音效添加和创建敌人 武器音效添加Audio Source代码控制 创建敌人目标敌人模型敌人…

雷池社区版新版本功能防绕过人机验证解析

前两天&#xff0c;2024.10.31&#xff0c;雷池社区版更新7.1版本&#xff0c;其中有一个功能&#xff0c;新增请求防重放 更新记录&#xff1a;hhttps://docs.waf-ce.chaitin.cn/zh/%E7%89%88%E6%9C%AC%E6%9B%B4%E6%96%B0%E8%AE%B0%E5%BD%95 仔细研究了这个需求&#xff0c;…