将PDF文件转换为Excel格式对于数据分析、报告制作和工作流程自动化至关重要。Python提供了多个库来高效完成这一任务。本文将介绍两种使用免费Python API的不同方法:
- 将整个PDF页面或文档转换为Excel
- 从PDF中提取表格并导出到Excel
我们将对这两种方法进行比较,帮助您根据需求选择最佳方案。
安装所需库
首先,您需要安装以下库:
- Free Spire.PDF for Python:一款功能强大的免费PDF处理库,支持PDF转Excel和表格提取功能 (支持处理10页以内的PDF文档)。
- openpyxl:流行的开源库,用于读取、写入和修改Excel文件。
使用 pip 安装:
pip install spire.pdf.free openpyxl
安装完成后,让我们深入了解两种转换方法。
方法一:将整个PDF页面或文档转换为Excel
此方法将PDF的全部内容(包括文本、图像和格式)转换为Excel文件,同时保留原始布局。
转换关键参数
XlsxLineLayoutOptions类控制PDF到Excel的转换方式。其构造函数接受以下参数:
- convertToMultipleSheet (bool) — 若为True,每个PDF页面将转换为单独的工作表;若为False,则只转换首页。
- rotatedText (bool) — 决定是否显示PDF中的旋转文本。
- splitCell (bool) — 若为True,PDF单元格中的多行文本将拆分为多个Excel单元格;若为False,则保留在单个单元格中。
- wrapText (bool) — 启用Excel单元格中的文本自动换行。
- overlapText (bool) — 控制是否显示重叠文本。
示例代码
from spire.pdf.common import *
from spire.pdf import *
# 创建PdfDocument对象
doc = PdfDocument()
# 加载PDF文件
doc.LoadFromFile("C:\Users\Administrator\Desktop\input.pdf")
# 设置XLSX布局转换选项
options = XlsxLineLayoutOptions(False, False, False, True, False)
# 应用转换选项到文档
doc.ConvertOptions.SetPdfToXlsxOptions(options)
# 将文档保存为XLSX文件
doc.SaveToFile("output/ToExcel.xlsx", FileFormat.XLSX)
# 关闭文档
doc.Close()
优缺点分析
✅ 保留PDF布局(文本位置、图像、格式)
✅ 适合格式复杂的文档
❌ 可能导致单元格合并或行高/列宽意外调整
❌ 文本连贯性可能受损(被拆分到不同单元格)
方法二:从PDF中提取表格并导出到Excel
此方法仅从PDF中提取表格数据并导出到Excel,确保输出内容清晰、结构化。
代码示例
from spire.pdf import *
from openpyxl import Workbook
from openpyxl.utils import get_column_letter
# 创建PdfDocument对象
doc = PdfDocument()
# 加载PDF文件
doc.LoadFromFile("C:/Users/Administrator/Desktop/AI.pdf")
# 为PDF文档设置表格提取器
extractor = PdfTableExtractor(doc)
# 创建新的Excel工作簿并移除默认工作表
workbook = Workbook()
workbook.remove(workbook.active)
# 逐页从PDF中提取表格
for page_index in range(doc.Pages.Count):
tables = extractor.ExtractTable(page_index)
for t_index, table in enumerate(tables):
# 为每个提取的表格创建新工作表
sheet = workbook.create_sheet(title=f"第{page_index+1}页_表{t_index+1}")
# 初始化列表,记录各列的最大长度
max_lengths = [0] * table.GetColumnCount()
for row in range(table.GetRowCount()):
for col in range(table.GetColumnCount()):
# 获取单元格文本,清理后写入Excel工作表
text = table.GetText(row, col).replace("\n", " ").strip()
sheet.cell(row=row + 1, column=col + 1, value=text)
# 更新列的最大长度
max_lengths[col] = max(max_lengths[col], len(text))
# 根据最大长度自动调整列宽
for col in range(table.GetColumnCount()):
adjusted_width = (max_lengths[col] + 2) # 添加适当边距
sheet.column_dimensions[get_column_letter(col + 1)].width = adjusted_width
# 保存工作簿到Excel文件
workbook.save("output/TableData.xlsx")
优缺点分析
✅ 仅提取表格数据,输出结构清晰
✅ Excel中可读性更好(无合并单元格或格式问题)
❌ 不保留非表格内容(图像、自由文本等)
❌ PDF中需要有明确的表格结构才能准确提取
两种方法对比
| 方法 | 数据完整性 | PDF布局保留程度 | Excel可读性 | 适用场景 |
|---|---|---|---|---|
| 转换整页 | 所有数据均被转换 | 高(保留原始布局) | 中等(合并单元格、间距调整) | 布局复杂的文档 |
| 提取表格 | 仅提取表格数据 | 低(丢失非表格格式) | 高(清晰的结构化数据) | 表格结构明确的PDF |
总结
- 如果需要保留PDF原始布局(包括图像和自由文本),请使用整页转换方法(例如处理法律文档或格式要求严格的文档)
- 如果只需要结构清晰的表格数据用于分析,请使用表格提取方法
两种方法各有优势,请根据项目具体需求做出选择。