用Python将PDF表格提取到文本、CSV和Excel文件中

从PDF文档中提取表格并将其转换为更易于处理的格式(如文本、CSV和Excel文件),是数据分析和信息管理中的常见需求。此过程可显著简化表格数据的处理,使数据的操作、分析和与其他数据集的集成更加便捷。无论是财务报表、研究论文,还是包含结构化信息的其他文档,掌握这些表格准确转换的方法对于充分发挥数据潜力至关重要。

本文将介绍如何使用简单的Python代码从PDF文档中提取表格数据并将其写入文本、CSV和Excel文件,从而轻松实现PDF表格的自动化提取。

本文所需的库为Spire.PDF for Python。可通过PyPI安装:pip install spire.pdf

用于操作的示例PDF
Python提取PDF表格

如何使用Python提取PDF表格数据

库中的PdfTableExtractor类用于处理PDF文档的表格提取。可以通过PdfTableExtractor.ExtractTable(pageIndex: int)方法从PDF页面中提取表格,并以Utilities_PdfTable对象的集合形式返回表格数据。接着,可通过遍历表格并使用Utilities_PdfTable.GetCellText(rowIndex: int, columnIndex: int)方法获取每个单元格中的数据。

提取PDF表格数据的一般步骤如下:

  • 创建一个PdfDocument实例并使用PdfDocument.LoadFromFile()方法加载PDF文档。
  • 使用该文档创建PdfTableExtractor实例。
  • 使用PdfTableExtractor.ExtractTable(pageIndex: int)方法提取文档中每页的表格。
  • 遍历每个表格并使用Utilities_PdfTable.GetCellText(rowIndex: int, columnIndex: int)方法获取单元格值。
  • 将提取的表格数据写入其他文件。

注意:当使用提取的表格数据构建字符串时,如果单元格文本中包含换行符,最终生成的文本文件中可能会多出额外的换行符。为了避免造成混淆,应将这些换行符去除或替换为空格。

用Python将PDF表格数据提取为文本文件

提取PDF文档中的表格数据后,可直接将每个表格的数据写入字符串并保存到文本文件中,从而实现将PDF表格数据导出为文本文件。

具体步骤如下:

  1. 导入所需模块:PdfDocumentPdfTableExtractor
  2. 创建PdfDocument实例并使用PdfDocument.LoadFromFile()方法加载PDF文档。
  3. 使用该文档创建PdfTableExtractor实例。
  4. 使用PdfTableExtractor.ExtractTable(pageIndex: int)方法提取每页中的表格。
  5. 遍历提取的表格:
    • 创建一个str对象以存储表格数据。
    • 使用Utilities_PdfTable.GetCellText(rowIndex: int, columnIndex: int)方法获取单元格值。
    • 将单元格值追加到str对象中。
    • str对象写入文件。
  6. 释放资源。

代码示例

from spire.pdf import PdfDocument, PdfTableExtractor

# 创建一个 PdfDocument 对象
pdf = PdfDocument()
# 加载一个 PDF 文档
pdf.LoadFromFile("Sample.pdf")

# 创建一个 PdfTableExtractor 对象
extractor = PdfTableExtractor(pdf)

# 遍历所有页面
for pageIndex in range(pdf.Pages.Count):
    # 从每个 PDF 页面中提取表格
    tables = extractor.ExtractTable(pageIndex)
    # 如果存在多个表格,则遍历这些表格
    if tables is not None:
        for tableIndex in range(len(tables)):
            # 获取一个表格
            table = tables[tableIndex]
            # 创建一个字符串对象来存储表格数据
            tableData = ""
            # 遍历表格的行和列
            for rowIndex in range(table.GetRowCount()):
                for colIndex in range(table.GetColumnCount()):
                    # 获取单元格文本
                    text = table.GetText(rowIndex, colIndex)
                    text = text.replace("\n", " ")
                    # 将单元格文本添加到表格数据中
                    tableData += text
                    if colIndex < table.GetColumnCount() - 1:
                        tableData += "\t"
                tableData += "\n"
            # 将表格数据写入文本文件
            with open(f"output/Tables/Page{pageIndex+1}-Table{tableIndex+1}.txt", "w", encoding="utf-8") as f:
                f.write(tableData)

# 释放资源
pdf.Dispose()

输出结果
Python提取PDF表格到文本文件

用Python将PDF表格数据提取为CSV文件

同样,可以使用类似方法从PDF文档中提取表格数据,并利用Python标准库中的CSV模块将每个表格写入CSV文件。在此过程中也需注意去除或替换换行符,以改善CSV文件的结果。具体步骤如下:

  1. 导入所需模块:PdfDocumentPdfTableExtractorCSV
  2. 创建PdfDocument实例并使用PdfDocument.LoadFromFile()方法加载PDF文档。
  3. 使用该文档创建PdfTableExtractor实例。
  4. 使用PdfTableExtractor.ExtractTable(pageIndex: int)方法提取每页中的表格。
  5. 遍历提取的表格:
    • 创建CSV文件。
    • 遍历表格中的行并创建列表以存储行数据。
    • 使用Utilities_PdfTable.GetCellText(rowIndex: int, columnIndex: int)方法获取每行的单元格值并追加到列表中。
    • 使用csv.writer().writerow()方法将每行写入CSV文件。
  6. 释放资源。

代码示例

from spire.pdf import PdfDocument, PdfTableExtractor
import csv

# 创建一个 PdfDocument 对象
pdf = PdfDocument()
# 加载一个 PDF 文档
pdf.LoadFromFile("Sample.pdf")

# 创建一个 PdfTableExtractor 对象
extractor = PdfTableExtractor(pdf)

# 遍历所有页面
for pageIndex in range(pdf.Pages.Count):
    # 从每个 PDF 页面中提取表格
    tables = extractor.ExtractTable(pageIndex)
    # 如果存在多个表格,则遍历这些表格
    if tables is not None:
        for tableIndex in range(len(tables)):
            # 获取一个表格
            table = tables[tableIndex]
            # 创建一个 CSV 文件
            with open("output/Tables/Page" + str(pageIndex+1) + "-Table" + str(tableIndex+1) + ".csv", "w", newline='', encoding='utf-8') as csvFile:
                writer = csv.writer(csvFile)
                # 遍历表格的行和列
                for rowIndex in range(table.GetRowCount()):
                    row = []
                    for colIndex in range(table.GetColumnCount()):
                        # 获取单元格文本
                        text = table.GetText(rowIndex, colIndex)
                        text = text.replace('\n', ' ')
                        row.append(text)
                    writer.writerow(row)

# 释放资源
pdf.Dispose()

输出结果
Python提取PDF表格到CSV

用Python将PDF表格数据提取到Excel工作表

可使用另一库Spire.XLS for Python将提取的PDF表格数据写入Excel工作表。通过PyPI获取Spire.PDF for Python:pip install spire.xls
具体步骤如下:

  1. 导入所需模块:PdfDocumentPdfTableExtractorWorkbookspire.xls.FileFormat
  2. 创建PdfDocument实例并使用PdfDocument.LoadFromFile()方法加载PDF文档。
  3. 创建Workbook实例用于存储表格,并使用Workbook.Worksheets.Clear()方法清除默认工作表。
  4. 使用该文档创建PdfTableExtractor实例。
  5. 使用PdfTableExtractor.ExtractTable(pageIndex: int)方法提取每页中的表格。
  6. 遍历提取的表格:
    • 使用Workbook.Worksheets.Add(sheetName: str)方法为每个表格添加工作表。
    • 使用Utilities_PdfTable.GetCellText(rowIndex: int, columnIndex: int)方法获取表格的单元格值。
    • 通过Worksheet.Range[rowIndex + 1, colIndex + 1].Text属性将单元格值写入相应的工作表单元格。
  7. 使用Workbook.SaveToFile()方法保存工作簿。
  8. 释放资源。

代码示例

from spire.pdf import PdfDocument, PdfTableExtractor
from spire.xls import Workbook, FileFormat, HorizontalAlignType

# 创建一个 PdfDocument 对象
pdf = PdfDocument()
# 加载一个 PDF 文档
pdf.LoadFromFile("Sample.pdf")

# 创建一个 Workbook 对象
workbook = Workbook()
# 清除默认的工作表
workbook.Worksheets.Clear()

# 创建一个 PdfTableExtractor 对象
extractor = PdfTableExtractor(pdf)

# 从每个 PDF 页面中提取表格
for pageIndex in range(pdf.Pages.Count):
    tables = extractor.ExtractTable(pageIndex)
    # 如果存在多个表格,则遍历这些表格
    if tables is not None:
        for tableIndex in range(len(tables)):
            # 获取一个表格
            table = tables[tableIndex]
            # 为表格创建一个工作表
            sheet = workbook.Worksheets.Add(f"Page{pageIndex + 1}-Table{tableIndex + 1}")
            # 遍历表格的行和列
            for rowIndex in range(table.GetRowCount()):
                for colIndex in range(table.GetColumnCount()):
                    # 获取单元格值
                    text = table.GetText(rowIndex, colIndex)
                    cellText = text.replace("\n", "")
                    # 将单元格值写入工作表的相应单元格
                    sheet.Range[rowIndex + 1, colIndex + 1].Text = cellText

            # 可选:自定义表格的外观
            # 设置标题行样式
            sheet.Rows.get_Item(0).Style.Font.FontName = "Yu Gothic UI"
            sheet.Rows.get_Item(0).Style.Font.Size = 12
            sheet.Rows.get_Item(0).Style.Font.IsBold = True
            sheet.Rows.get_Item(0).Style.HorizontalAlignment = HorizontalAlignType.Center
            # 设置数据行样式
            for i in range(1, sheet.Rows.Count):
                sheet.Rows.get_Item(i).Style.Font.FontName = "Yu Gothic UI"
                sheet.Rows.get_Item(i).Style.Font.Size = 12
                sheet.Rows.get_Item(i).Style.HorizontalAlignment = HorizontalAlignType.Left
            # 自动调整列宽
            for j in range(1, sheet.Columns.Count):
                sheet.AutoFitColumn(j)

# 保存工作簿
workbook.SaveToFile("output/PDFTableToExcel.xlsx", FileFormat.Version2016)
# 释放资源
workbook.Dispose()
pdf.Close()

输出结果
Python提取PDF表格到Excel工作表

使用Python直接将PDF转换为Excel文件

还可以使用PdfDocument.SaveToFile(fileName: str, FileFormat.XLSX)方法将PDF文档直接转换为Excel文件。此方法适用于以表格为主的PDF文档,有助于尽可能保留表格的原始外观。
为减少转换后Excel表格中的空白,可以在转换前去除PDF文档的边距。参考以下文章:
Python删除PDF文档的页边距

直接将PDF文档转换为Excel文件的具体步骤如下:

  1. 导入所需模块:PdfDocumentFileFormat
  2. 创建一个PdfDocument实例。
  3. 使用PdfDocument.LoadFromFile()方法加载PDF文档。
  4. 将文档转换为Excel文件并使用PdfDocument.SaveToFile(fileName: str, FileFormat.XLSX)方法保存。
  5. 释放资源。

代码示例

from spire.pdf import PdfDocument, FileFormat

# 创建一个 PdfDocument 实例
pdf = PdfDocument()

# 加载一个 PDF 文档
pdf.LoadFromFile("Sample.pdf")

# 将 PDF 文档转换为 Excel 文件
pdf.SaveToFile("output/PDFToExcel.xlsx", FileFormat.XLSX)

# 关闭 PDF 文档
pdf.Close()

输出结果
Python转换PDF为Excel

本文展示了如何用Python将PDF表格提取到文本、CSV和Excel文件,并将PDF文档转换为Excel工作簿。

申请免费License

<think>好的,用户想用Python读取PDF中的表格数据并进行编辑。首先,我需要回忆一下常用的库。根据之前的知识,PyPDF2、pdfminer.six、tabula-py、pandas这些都可能相关。 用户提到的PyPDF2,我记得它主要用于基本操作,比如合并、拆分,但提取复杂表格可能不够。示例中的引用[1]提到PyPDF2提取文本,但表格可能需要更高级的处理。这时候可能需要tabula-py,因为它专门处理表格,特别是基于Java的Tabula,能识别表格结构。引用[2]中的示例代码使用tabula读取PDF到DataFrame,然后转为CSV,这应该适用。 另外,pdfplumber也是一个选项,引用[4]指出它适合结构化数据复杂表格。可能需要比较tabula-pypdfplumber的优缺点。比如,pdfplumber不需要Java环境,而tabula-py依赖Java,但可能在表格识别上更准确。 用户还提到数据修改,这可能需要pandas处理DataFrame,修改后再导出。然后如何保存回PDF?这里可能需要ReportLab或PyMuPDF来生成新的PDF,但编辑现有PDF表格比较困难,通常的做法是提取数据,修改后生成新PDF。 需要注意的问题包括表格识别的准确性,特别是合并单元格或复杂布局。此外,处理加密或扫描的PDF可能需要OCR,但用户的问题里没提到,暂时忽略。 步骤应该是:1. 使用tabula或pdfplumber提取表格为DataFrame;2. 用pandas修改数据;3. 用库如ReportLab重新生成PDF。但用户可能不知道保存回PDF的复杂性,需要说明。 检查引用内容,引用[4]提到pdfplumber适合复杂表格,所以可能需要优先推荐。同时引用[3]的pdfminer.six可能用于文本提取,但表格处理可能不如前两者。 综上,回答应该分步骤:提取(用tabula-py或pdfplumber)、处理(pandas)、输出(如生成CSV或新PDF)。同时要提到不同库的适用场景,比如简单表格用tabula,复杂用pdfplumber。编辑后的保存可能需要生成新PDF,而直接修改原PDF困难,建议导出为其他格式。</think>以下是Python读取编辑PDF表格数据的解决方案: ### 一、PDF表格提取技术路线 1. **简单表格推荐使用tabula-py**: - 基于Java的Tabula实现,能识别表格结构 - 输出为pandas DataFrame方便后续处理 ```python import tabula # 读取PDF中的表格(自动识别) dfs = tabula.read_pdf("input.pdf", pages="all", multiple_tables=True) # 查看第一个表格 print(dfs[0].head()) ``` 2. **复杂表格使用pdfplumber**: - 支持精准定位表格边界合并单元格识别[^4] ```python import pdfplumber with pdfplumber.open("input.pdf") as pdf: page = pdf.pages[0] table = page.extract_table() df = pd.DataFrame(table[1:], columns=table[0]) ``` ### 二、数据修改处理流程 ```python import pandas as pd # 示例:修改表格数据 df = dfs[0] # 获取第一个表格 df["新列"] = df["原列"] * 2 # 新增计算列 df.loc[df["金额"] > 1000, "状态"] = "超标" # 条件修改 # 数据清洗 df = df.dropna() # 删除空值行 df = df.astype({"数量": "int32"}) # 类型转换 ``` ### 三、数据输出方案 | 输出格式 | 推荐方法 | 特点 | |---------|---------|------| | CSV | `df.to_csv()` | 通用数据交换格式 | | Excel | `df.to_excel()` | 保留格式公式 | | PDF | 使用ReportLab重新生成 | 需要定义完整排版模板 | ### 四、常见问题解决方案 1. **表格识别错位**: - 调整`lattice=True`参数强制使用格线检测 - 指定表格区域:`area=[top, left, bottom, right]` 2. **多页表格拼接**: ```python from tabula import read_pdf dfs = read_pdf("input.pdf", pages="1-3", stream=True) full_table = pd.concat(dfs) ``` 3. **中文乱码处理**: ```python tabula.read_pdf(..., encoding='gbk') # 指定编码 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值