Python实现PDF文本与表格转换
📑 PDF内容提取与转换指南
✨ 摘要
本文将介绍如何使用Python将PDF中的文本内容转换到Word,以及如何将PDF中的表格数据提取到Excel。你会了解到多个工具和方法,包括pdf2docx
、popdf
、tabula-py
和camelot
等,并附上简单的代码示例和选择建议。
1. PDF文本转换到Word
将PDF中的文本转换到Word文档,推荐使用以下工具:
1.1 使用 pdf2docx 库
pdf2docx
是一个基于 Python 的第三方库,它利用 PyMuPDF(解析 PDF 内容)和 python-docx(生成 Word 文档)来实现转换。
优点:免费开源、简单易用(仅需少量代码即可完成转换)、支持批量处理、轻量级。
局限性:对复杂布局(如多栏排版、数学公式)支持较弱,转换可能错位;对嵌套表格或复杂边框的表格解析精度有限;无法处理受密码保护的 PDF;如果 PDF 使用了特殊字体,在 Word 中可能显示异常。
安装命令:
bash
pip install pdf2docx
基本转换代码示例:
python
from pdf2docx import Converterpdf_path = "input.pdf" docx_path = "output.docx"# 初始化转换器 cv = Converter(pdf_path) # 执行转换(start=起始页,end=结束页,None表示到最后一页) cv.convert(docx_path, start=0, end=None) # 释放资源 cv.close()
参数说明:
可以通过
start
和end
参数指定转换的页码范围(例如start=0, end=5
转换前5页)。cv.convert
方法还支持一些选项参数,例如layout=True
(保留页面布局)、tables=True
(解析表格)、images=True
(提取图片)。
1.2 使用 popdf 库
popdf
库提供了非常简洁的 API,尤其适合快速简单的转换任务,并且支持批量处理。
安装命令:
bash
pip install popdf
单文件转换代码示例:
python
from popdf import pdf2docxpdf2docx(input_file=r"D:/example.pdf", output_file=r"D:/example.docx")
批量转换代码示例:
python
from popdf import pdf2docxpdf2docx(input_path=r"D:/pdf_folder/", output_path=r"D:/docx_folder/")
1.3 文本转换的注意事项
转换效果:PDF 本身并非总是对内容结构有完美描述,其“不可编辑”的特性使得转换过程本质上是“解析和重建”。因此,转换效果很大程度上取决于原始 PDF 的质量和复杂程度。布局简单、以文字为主的 PDF 转换效果较好;而包含多栏排版、复杂表格、数学公式或特殊字体的 PDF,转换后可能需要较多的手动调整。
字体问题:如果 PDF 使用了系统未安装的特殊字体,转换后的 Word 文档中可能出现字体显示异常或替换的情况。
加密文件:上述工具通常无法处理受密码保护的加密 PDF 文件。
2. PDF表格提取到Excel
从 PDF 中提取表格数据并导出到 Excel,推荐使用以下工具:
2.1 使用 tabula-py 库
tabula-py
是 tabula-java
的 Python 封装,专门用于从 PDF 文件中提取表格数据,尤其擅长处理结构不规则或包含扫描图像的 PDF 中的表格。它能够将提取的结果直接转换为 pandas DataFrame 对象,方便后续处理和导出。
安装命令:
bash
pip install tabula-py
注意:tabula-py
依赖于 Java 8 或更高版本的环境。
基本提取示例:
python
import tabula# 提取所有页面的所有表格 tables = tabula.read_pdf("input.pdf", pages='all', multiple_tables=True) # tables 是一个由 DataFrame 组成的列表 for i, df in enumerate(tables):# 将每个 DataFrame 保存为单独的 Excel 文件df.to_excel(f"table_{i}.xlsx", index=False)
使用 lattice 模式提升精度:
如果 PDF 中的表格有清晰的线条(即“格子”结构),使用 lattice=True
参数可以显著提高提取精度。
python
tables = tabula.read_pdf("input_with_lines.pdf", pages='all', multiple_tables=True, lattice=True)
处理提取后的数据清洗:
提取的表格数据可能会包含一些冗余的列(例如 "Unnamed: X"),通常需要后续清洗。
python
import tabula import pandas as pdtables = tabula.read_pdf("input.pdf", pages='1', multiple_tables=True, lattice=True) cleaned_tables = []for df in tables:# 移除包含 'Unnamed' 的列cols_to_drop = [col for col in df.columns if 'Unnamed' in str(col)]cleaned_df = df.drop(columns=cols_to_drop)# 可选:检查并移除全为空的行cleaned_df = cleaned_df.dropna(how='all')cleaned_tables.append(cleaned_df)# 保存清洗后的第一个表格 cleaned_tables[0].to_excel("cleaned_table.xlsx", index=False)
2.2 使用 camelot 库
Camelot
也是一个专门用于从 PDF 中提取表格数据的 Python 库,它特别适用于基于文本的 PDF。
安装命令:
bash
pip install camelot-py[cv]
基本使用示例:
python
import camelot# 提取 PDF 中的表格 tables = camelot.read_pdf('my_file.pdf', pages='all', flavor='lattice') # 对于有线的表格 # 或者使用 flavor='stream' 对于无线的表格 # tables = camelot.read_pdf('my_file.pdf', pages='all', flavor='stream')print(f"总共提取了 {tables.n} 个表格。")# 查看第一个表格的数据 print(tables[0].df)# 将第一个表格导出为 Excel tables[0].to_excel('table_0.xlsx')# 导出所有表格 tables.export('all_tables.xlsx', f='excel')
2.3 表格提取的注意事项
表格识别:从 PDF 中提取表格并非完美无缺。提取的准确性取决于原始 PDF 中表格的结构清晰度。没有边框的表格、合并单元格、分页表格等都会增加提取的难度。
模式选择:
lattice (格子模式):适用于有明确表线(边框)的表格,精度通常较高。
stream (流模式):适用于没有表线或表线不完整的表格,它通过分析文本的相对位置来推断表格结构。
指定区域提取:如果页面只有一部分是表格,可以使用
area
参数指定要分析的页面部分(例如area=[x1, y1, x2, y2]
),这可以提高提取准确性并减少无关内容的干扰。tabula-py
也支持类似的area
参数。结果验证:务必检查提取后的数据,特别是数字和格式,因为自动化工具可能出错。
3. 工具对比与选择建议
下面用一个表格帮你快速了解这几个主要工具的特点和适用场景:
功能 | 工具/库 | 主要优点 | 主要缺点/注意事项 | 适用场景 |
---|---|---|---|---|
PDF转Word | pdf2docx | 免费、开源、支持批量、布局保留尚可 | 复杂布局和表格易错位、不支持加密PDF | 简单文档转换、批量处理报告、合同等文字为主的PDF |
popdf | API极其简洁、支持批量 | 功能相对基础,可能基于其他库封装 | 快速简单转换、批量处理 | |
PDF表格提取 | tabula-py | 功能强大、支持复杂表格、输出DataFrame便于后期清洗 | 依赖Java环境 | 从各类PDF(包括扫描件)中提取结构复杂的表格数据 |
camelot | 专精表格提取、输出格式丰富(df, csv, excel等) | 对于无框线或复杂合并单元格的表格效果可能不佳 | 从有清晰表格线的PDF中高精度提取数据 | |
在线转换器 | Smallpdf等 | 无需安装软件、操作简单 | 有隐私风险、文件大小和次数限制、需要网络 | 偶尔转换单个非敏感文件 |
如何选择?
只想把PDF里的文字和版面弄到Word里:优先试试
pdf2docx
。如果想用更简单的代码,可以看看popdf
。主要想获取PDF里的表格数据到Excel:
如果表格有清晰的边框线,
camelot
(lattice模式) 和tabula-py
(lattice=True) 都是不错的选择。如果表格没有边框线,可以尝试
camelot
或tabula-py
的 stream 模式。如果需要对提取的数据进行复杂的清洗和处理,
tabula-py
返回的 Pandas DataFrame 会非常方便。
只是偶尔转换一两个文件,不想写代码:可以考虑使用在线转换工具(如 Smallpdf, ILovePDF),但务必注意文件隐私和安全。
4. 实用技巧与总结
批量处理:上述大多数库(如
pdf2docx
,popdf
,tabula-py
)都支持批量处理。你可以遍历一个文件夹中的所有 PDF 文件进行转换,这能极大提高效率。处理加密PDF:如果PDF有密码保护,需要先用相应的库(如
pikepdf
)解密后再进行处理。tabula-py
的read_pdf
函数支持password
参数。调整提取区域:对于表格提取,如果自动识别不准,尝试使用
area
参数手动指定表格在页面上的坐标区域,可以显著改善效果。心态准备:PDF 转换不是一个完美无缺的过程,特别是对于布局复杂或扫描质量的 PDF。通常需要结合多种工具,并辅以一定的手动检查和调整。