查各龙 發表於 2025-12-29 11:19:00

Python 将 PDF 表格数据提取至 TXT 或 Excel

<p>在数据处理与办公自动化场景中,PDF 表格因格式稳定被广泛使用,但不可直接编辑的特性,给数据统计、分析和二次加工带来诸多不便。手动复制粘贴不仅效率低下,还容易出现数据错位、遗漏等问题。</p>
<p>本文将分享一种高效的解决方案—基于Python结合Spire系列库,实现 PDF 表格数据的精准提取,并分别导出为 TXT 文本和 Excel 表格格式。该方案无需复杂的正则表达式或OCR识别,代码简洁易上手,适合批量处理各类PDF表格文件。</p>
<h2 id="一准备工作安装所需-python-库">一、准备工作:安装所需 Python 库</h2>
<p>本次实战需要两个核心库,分别负责 PDF 表格提取和 Excel 文件生成,功能分工明确:</p>
<ul>
<li><strong>Spire.PDF for Python</strong>:一款轻量级 PDF 处理库,支持直接识别 PDF 中的表格结构,精准提取单元格数据,无需依赖额外的 OCR 工具。</li>
<li><strong>Spire.XLS for Python</strong>:专业的 Excel 操作库,可实现 Excel 文件的创建、数据写入、格式优化等功能,完美适配各类 Excel 版本。</li>
</ul>
<p>打开命令行终端,执行以下pip命令完成安装(建议在虚拟环境中操作,避免版本冲突):</p>
<pre><code class="language-bash">pip install Spire.PDF
pip install Spire.XLS
</code></pre>
<h2 id="二实战1提取-pdf-表格数据到-txt-文件">二、实战1:提取 PDF 表格数据到 TXT 文件</h2>
<p>TXT 文件具有体积小、兼容性强的特点,适合快速查看和传输数据。使用 Spire.PDF for Python 提取数据并写入 TXT 的核心逻辑,是按<strong>页面→表格→行→列</strong>的层级遍历 PDF 内容,最终将数据格式化输出。</p>
<h3 id="实现步骤拆解">实现步骤拆解</h3>
<ol>
<li><strong>加载 PDF 文档</strong>:通过 <code>PdfDocument</code> 类的 <code>LoadFromFile()</code> 方法读取目标 PDF 文件,支持相对路径和绝对路径。</li>
<li><strong>初始化提取工具</strong>:创建 <code>PdfTableExtractor</code> 对象,用于识别并提取 PDF 页面中的表格数据。</li>
<li><strong>层级遍历数据</strong>:依次遍历 PDF 的每一页、每页中的每个表格、表格的每一行和每一列,通过 <code>GetText(rowIndex, columnIndex)</code> 方法获取单元格文本。</li>
<li><strong>写入 TXT 文件</strong>:将提取的数据按“列用空格分隔、行用换行分隔”的格式整理,写入TXT文件并指定 UTF-8 编码,避免中文乱码。</li>
</ol>
<h3 id="完整代码示例含详细注释">完整代码示例(含详细注释)</h3>
<pre><code class="language-python">from spire.pdf.common import *
from spire.pdf import *

# 1. 加载PDF文档,替换为你的目标PDF文件路径
pdf_doc = PdfDocument()
pdf_doc.LoadFromFile("表格.pdf")

# 2. 创建列表存储提取的数据,便于后续拼接
data_list = []

# 3. 初始化表格提取器
table_extractor = PdfTableExtractor(pdf_doc)

# 4. 遍历PDF的每一页
for page_idx in range(pdf_doc.Pages.Count):
    # 提取当前页面的所有表格
    tables = table_extractor.ExtractTable(page_idx)
    # 判断当前页面是否存在表格,避免空指针异常
    if tables is not None and len(tables) &gt; 0:
      # 遍历每个表格
      for table in tables:
            row_num = table.GetRowCount()# 获取表格总行数
            col_num = table.GetColumnCount()# 获取表格总列数
            # 遍历表格的每一行
            for i in range(row_num):
                row_data = []
                # 遍历该行的每一列
                for j in range(col_num):
                  # 获取单元格文本
                  cell_text = table.GetText(i, j)
                  row_data.append(cell_text)
                # 用空格分隔列数据,拼接成一行
                data_list.append(" ".join(row_data))
            # 不同表格之间添加空行,区分数据边界
            data_list.append("")

# 5. 将数据写入TXT文件
with open("提取PDF表格.txt", "w", encoding="utf-8") as f:
    f.write("\n".join(data_list))

# 6. 释放资源,避免内存占用
pdf_doc.Close()
</code></pre>
<h2 id="三实战2提取-pdf-表格数据到-excel-文件">三、实战2:提取 PDF 表格数据到 Excel 文件</h2>
<p>Excel 文件支持数据筛选、公式计算、图表生成等高级功能,是数据分析的首选格式。本示例需要结合 <code>Spire.PDF for Python</code> 和 <code>Spire.XLS for Python</code>,在提取数据的基础上,实现 Excel 文件的创建和数据写入。</p>
<h3 id="实现步骤拆解-1">实现步骤拆解</h3>
<p>数据提取的步骤与 TXT 示例一致,额外增加 Excel 文件操作的3个核心步骤:</p>
<ol>
<li><strong>创建Excel工作簿</strong>:实例化 <code>Workbook</code> 对象,清空默认工作表,为后续添加新表格做准备。</li>
<li><strong>数据写入单元格</strong>:Excel 的行列索引从1开始(与Python的0索引不同),因此需要将表格的行、列索引分别+1,确保数据写入正确位置。</li>
<li><strong>优化表格格式</strong>:调用 <code>AutoFitColumns()</code> 方法设置列宽自适应内容,提升表格可读性,最后保存为指定版本的Excel文件。</li>
</ol>
<h3 id="完整代码示例含详细注释-1">完整代码示例(含详细注释)</h3>
<pre><code class="language-python">from spire.pdf import *
from spire.xls import *

# 1. 加载PDF文档
pdf_doc = PdfDocument()
pdf_doc.LoadFromFile("表格.pdf")

# 2. 创建Excel工作簿并清空默认工作表
excel_workbook = Workbook()
excel_workbook.Worksheets.Clear()

# 3. 初始化表格提取器
table_extractor = PdfTableExtractor(pdf_doc)

# 4. 工作表编号,用于命名新工作表
sheet_index = 1

# 5. 遍历PDF的每一页
for page_idx in range(pdf_doc.Pages.Count):
    tables = table_extractor.ExtractTable(page_idx)
    if tables is not None and len(tables) &gt; 0:
      # 遍历当前页面的每个表格
      for table in tables:
            # 创建新工作表,命名为“sheet+编号”
            worksheet = excel_workbook.Worksheets.Add(f"sheet{sheet_index}")
            row_num = table.GetRowCount()
            col_num = table.GetColumnCount()
            # 遍历表格单元格
            for i in range(row_num):
                for j in range(col_num):
                  cell_text = table.GetText(i, j)
                  # Excel索引从1开始,需将i和j分别+1
                  worksheet.Range.Value = cell_text
            # 设置列宽自适应内容,优化显示效果
            worksheet.AllocatedRange.AutoFitColumns()
            # 工作表编号递增
            sheet_index += 1

# 6. 保存Excel文件,指定保存路径和Excel版本
excel_workbook.SaveToFile("导出PDF表格到Excel.xlsx", ExcelVersion.Version2016)

# 7. 释放资源
pdf_doc.Close()
excel_workbook.Dispose()
</code></pre>
<h2 id="四关键注意事项">四、关键注意事项</h2>
<ol>
<li><strong>文件路径问题</strong>:若运行代码时提示“文件不存在”,请检查 PDF 文件路径是否正确,建议使用绝对路径(如 <code>C:/data/表格.pdf</code>)避免路径错误。</li>
<li><strong>中文乱码处理</strong>:写入 TXT 文件时,务必指定 <code>encoding="utf-8"</code>;导出 Excel 文件时,Spire.XLS for Python 默认支持中文,无需额外配置。</li>
<li><strong>资源释放</strong>:使用 <code>Close()</code> 和 <code>Dispose()</code> 方法释放 PDF 和 Excel 对象,避免长时间运行导致内存泄漏。</li>
</ol>
<h2 id="五总结">五、总结</h2>
<p>基于Spire系列库,能够快速实现 PDF 表格数据的提取与格式转换,相比传统的手动操作,效率提升数十倍。该方案适用于各类场景,如批量提取财务报表、科研数据、政务文件中的 PDF 表格,为数据自动化处理提供了可靠的技术支撑。</p><br><br>
来源:https://www.cnblogs.com/jazz-z/p/19414736
頁: [1]
查看完整版本: Python 将 PDF 表格数据提取至 TXT 或 Excel