如何用Python提取PDF文件中的文本
在日常工作和学习中,我们会接触到各种PDF文档,有时需要从它们之中提取纯文本内容进行分析、存档或二次利用,如果只用手动的复制粘贴无疑效率低下且易出错。在Python中使用pdfplumber库可以轻松实现从PDF中提取文本、图片以及表格。
本文将介绍如何用pdfplumber快速将PDF文档转化为可编辑的纯文本文件(对应的视频课程已先在微信视频号「退役程序员」中发布),在以后的文章中会陆续介绍如何提取PDF中的图片和表格,欢迎大家继续关注。
所需要的库pdfplumber
有很多的库都可以用于处理PDF文档,例如PyMuPDF、PyPDF2、pdfplumber、pikepdf等等,它们各自有着特定的优势和用途,为了实现对文本、图片和表格的简单提取功能,这里我选用的是pdfplumber,大家可以访问下面链接来对这个库有个大致了解:
https://pypi.org/project/pdfplumber/
在开始写代码前,我们需要用以下命令对这个库进行安装:
pip install pdfplumber
完整代码
# pdfconverter.py
import pdfplumber
import sys
def extract_text(file_path):
"""
Extracts text from a PDF file and saves it as a TXT file.
Args:
file_path (str): Path to the PDF file.
Returns:
None
"""
output_file = file_path.split('.')[0] + '.txt'
try:
with pdfplumber.open(file_path) as pdf:
txt = ''
for page in pdf.pages:
txt += page.extract_text()
with open(output_file, 'w', encoding='utf-8') as f:
f.write(txt)
except FileNotFoundError:
print(f"Error: The file '{file_path}' does not exist.")
except Exception as e:
print(f"Error: An error occurred while processing the file: {e}")
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Usage: python pdfconverter.py <pdf_file>")
else:
file_path = sys.argv[1]
extract_text(file_path)代码解析
导入必要的库
代码的开头部分引入了执行任务所需的外部功能:
import pdfplumber:
这一行导入了pdfplumber库。pdfplumber
是我们脚本的核心,负责处理PDF的打开和内容解析。
import sys:
这一行导入了sys模块。sys模块提供了与Python解释器及其环境交互的功能。在这个脚本中,我们主要使用它来访问命令行参数,这意味着我们可以告诉脚本要处理哪个PDF文件。
定义函数extract_text
在视频课程《利用AI优化提取PDF文本代码》中,为了让代码可以重复利用,我利用AI将代码的核心功能封装在一个名为
extract_text 的函数中。
def extract_text(file_path): 这一行定义了一个名为
extract_text的函数,它接受一个参数file_path。file_path会是我们想要处理的PDF文件的路径(例如,"document.pdf")。
output_file = file_path.split('.')[0] + '.txt':
这一行代码根据输入的PDF文件路径生成输出文本文件的名称。 -
file_path.split('.'):
这会将文件路径字符串按照.分割成一个列表。例如,如果file_path是"myfile.pdf",那么
split('.')会得到['myfile', 'pdf']。 -
[0]:
接着,我们取这个列表的第一个元素,即文件名部分,不包含扩展名(在我们的例子中是"myfile")。
- + '.txt':
最后,我们在这个文件名后面加上.txt,形成完整的输出文件名,例如"myfile.txt"。
try:这是一个异常处理的开始。try块中的代码是可能出错的部分。如果try块中的代码发生错误,程序不会立即崩溃,而是会跳转到except块来处理错误。
with pdfplumber.open(file_path) as pdf:
这一行是打开PDF文件的关键。 - pdfplumber.open(file_path):
使用pdfplumber库打开指定的PDF文件。 -
with ... as ...:
这是一个Python的上下文管理器。它的好处是,无论代码执行是否成功,它都会确保PDF文件在处理完毕后被正确关闭,从而避免资源泄漏。
- as pdf: 将打开的PDF文件对象赋值给变量
pdf。
txt = '': 初始化一个空字符串变量
txt。这个变量将用于累积从PDF中提取的所有文本。
for page in pdf.pages::
这是一个循环。pdf.pages会返回PDF文件中的所有页面对象。这个循环会遍历PDF中的每一个页面。
txt += page.extract_text():
在循环的每一次迭代中,这一行代码从当前页面中提取文本。 -
page.extract_text(): 调用当前页面对象的
extract_text()方法,它会返回该页面上的所有文本。 -
txt += ...:
将提取到的文本追加到txt变量的末尾。
with open(output_file, 'w', encoding='utf-8') as f::
当所有页面文本都提取完毕后,这一行打开一个新的文件来写入这些文本。 -
open(output_file, 'w', encoding='utf-8'): 打开
output_file
指定的文件。其中'w'表示以写入模式打开文件。如果文件不存在,它会被创建;如果文件已存在,其内容会被清空。encoding='utf-8'指定了文本的编码格式为UTF-8,这对于处理包含各种语言(包括中文)的文本非常重要,可以避免乱码问题。
- as f: 将打开的文件对象赋值给变量f。
f.write(txt):
这一行将累积在txt变量中的所有文本写入到刚刚打开的输出文件中。
except FileNotFoundError::
如果在try块中尝试打开的文件不存在,Python会抛出FileNotFoundError异常。这个except块会捕获这种特定的错误。
print(f"Error: The file '{file_path}' does not exist."):
如果捕获到
FileNotFoundError,这行代码会打印出错误消息。
except Exception as e::
这是一个更通用的异常捕获。如果try块中发生了任何其他类型的错误(不是FileNotFoundError),都会被这个except块捕获。
- as e: 将捕获到的异常对象赋值给变量e。
print(f"Error: An error occurred while processing the file: {e}"):
打印一个通用的错误消息,并显示具体的错误信息e。
主程序入口
这一部分代码用于决定在命令行中直接运行这个Python文件时要做什么。
if __name__ == "__main__":确保只有当脚本作为主程序直接运行时,if
语句块中的代码才会执行,而不是当它被其他代码作为模块导入时。
if len(sys.argv) != 2::
这一行检查用户在命令行中提供了多少个参数。 - sys.argv:
这是一个列表,包含所有命令行参数。sys.argv[0]总是脚本本身的名称(例如
pdfconverter.py),sys.argv[1]是第一个实际参数,以此类推。
- len(sys.argv): 获取参数的数量。如果用户只输入了
python pdfconverter.py 而没有指定PDF文件,那么
len(sys.argv)将是1。如果用户提供了PDF文件,例如
python pdfconverter.py my_document.pdf,那么
len(sys.argv)将是2。 - != 2:
检查参数数量是否不等于2。这意味着脚本期望除了它自己的名字之外,只接收一个参数(即PDF文件路径)。
print("Usage: python pdfconverter.py <pdf_file>"):
如果参数数量不正确,这行代码会打印一个使用说明,告诉用户如何正确运行脚本。
else::
如果参数数量是正确的(即等于2),则执行else块中的代码。
file_path = sys.argv[1]:
这一行将用户在命令行中提供的第一个参数(也就是PDF文件的路径)赋值给file_path变量。
extract_text(file_path): 最后,调用我们之前定义的
extract_text
函数,并将获取到的file_path传递给它,开始PDF文本的提取过程。