Python实战:使用pdfplumber高效提取PDF文本与表格
本文详解Python中利用pdfplumber库进行PDF文件处理的全流程。重点介绍如何安装配置该库,掌握open()、extract_text()及extract_tables()等核心API的使用。通过代码示例展示文本与表格的精准提取方法,并解析Page对象的属性与参数配置,帮助开发者高效解决PDF内容解析需求。
实战场景
Python工程师在日常开发工作中,经常需要解析和处理PDF文件。实际业务需求主要涵盖以下几个方面:
- 提取PDF文档中的文字内容
- 将PDF文档的每一页转换为图片格式
- Word文档转换为PDF格式
- PDF文件的生成、编辑、导入与导出操作
- PDF文件的在线渲染展示
除最后一项在线渲染需前端配合外,其余功能均可在Python后端直接实现。
本次实战选用pdfplumber库进行深入学习。建议提前安装该库,但需注意,该库主要专注于读取PDF并进行操作,暂不支持写入和编辑功能,即本文聚焦于一款专用于PDF内容提取的工具库。
> pip install pdfplumber -i https://pypi.tuna.tsinghua.edu.cn/simple
pdfplumber库具备以下核心特点:
- 能够访问PDF对象中的任意元素详细信息;
- 支持提取文本和表格,且使用方式简单直观;
- 集成了可视化调试功能。
Python PDF实战编码
接下来编写PDF操作的基础代码。
import pdfplumber
with pdfplumber.open('./dddd.pdf') as pdf:
for page in pdf.pages:
print(page.extract_text())
# 每页打印一分页分隔
print('---------- 分页分隔 ----------')
导入pdfplumber模块后,使用pdfplumber.open('./dddd.pdf')打开本地PDF文件,随后通过pdf.pages遍历所有页面,再利用页对象的.extract_text()方法提取文本信息。
pdfplumber.open()方法的签名如下所示:
pdfplumber.open("文件名", password = "密码", laparams = { "line_overlap": 0.7 })
其中各参数描述如下:
file_name:文件名,必选参数;password:PDF文件的密码;laparams:布局参数。
此外,若希望读取PDF,还可以使用load()方法,该方法同样返回pdfplumber.PDF类的实例。
pdfplumber.PDF对象实例主要包含两个重要属性:
.metadata:从PDF的Info中获取元数据键/值对字典,通常包括“CreationDate”、“ModDate”、“Producer”等;.pages:包含pdfplumber.Page实例的列表,每个实例代表PDF中每一页的信息。
上文提及的pdfplumber.Page实例是pdfplumber的核心,后续对PDF的大量操作均围绕该类的属性和方法展开,其重要属性如下所示:
page_number:页码顺序,第一页的序号为1;witdh:页面宽度;height:页面高度;.objects/.chars/.lines/.rects/.curves/.figures/.images:获取PDF页中的重要数据。
核心方法如下所示:
extract_text():提取页面中的文本;extract_words():提取所有单词及其相关信息;extract_tables():提取页面中的表格。
extract_text()呈现结果

extract_words()呈现结果

extract_tables()呈现效果,由于示例PDF中无表格,因此每页得到的结果均为空。

补充
当然,Python除了读取PDF文件外,还有一些其他功能,例如加密PDF、旋转和叠加页面等,下面是实现的示例代码。
旋转和叠加页面
import PyPDF2
from PyPDF2.pdf import PageObject
# 创建一个读PDF文件的Reader对象
reader = PyPDF2.PdfFileReader('resources/XGBoost.pdf')
# 创建一个写PDF文件的Writer对象
writer = PyPDF2.PdfFileWriter()
# 对PDF文件所有页进行循环遍历
for page_num in range(reader.numPages):
# 获取指定页码的Page对象
current_page = reader.getPage(page_num) # type: PageObject
if page_num % 2 == 0:
# 奇数页顺时针旋转90度
current_page.rotateClockwise(90)
else:
# 偶数页反时针旋转90度
current_page.rotateCounterClockwise(90)
writer.addPage(current_page)
# 最后添加一个空白页并旋转90度
page = writer.addBlankPage() # type: PageObject
page.rotateClockwise(90)
# 通过Writer对象的write方法将PDF写入文件
with open('resources/XGBoost-modified.pdf', 'wb') as file:
writer.write(file)加密PDF文件
import PyPDF2
reader = PyPDF2.PdfFileReader('resources/XGBoost.pdf')
writer = PyPDF2.PdfFileWriter()
for page_num in range(reader.numPages):
writer.addPage(reader.getPage(page_num))
# 通过encrypt方法加密PDF文件,方法的参数就是rre
#设置的密码
writer.encrypt('foobared')
with open('resources/XGBoost-encrypted.pdf', 'wb') as file:
writer.write(file)批量添加水印
import PyPDF2
from PyPDF2.pdf import PageObject
reader1 = PyPDF2.PdfFileReader('resources/XGBoost.pdf') reader2 = PyPDF2.PdfFileReader('resources/watermark.pdf')
writer = PyPDF2.PdfFileWriter()
# 获取水印页
watermark_page = reader2.getPage(0)
for page_num in range(reader1.numPages):
current_page = reader1.getPage(page_num) # type: PageObject current_page.mergePage(watermark_page)
# 将原始页和水印页进行合并
writer.addPage(current_page)
# 将PDF写入文件
with open('resources/XGBoost-watermarked.pdf', 'wb') as file:
writer.write(file)到此这篇关于Python读取PDF文件的文章就介绍到这了,更多相关Python读取PDF文件内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









