Python利用pdfplumber实现读取PDF写入Excel

  • Post category:Python

下面为您详细讲解Python利用pdfplumber实现读取PDF写入Excel的完整实例教程。

第一步:导入依赖包

在使用pdfplumber、pandas和openpyxl操作PDF和Excel文件之前,请确保您已经安装了这些库。如果没有安装它们,可以使用以下命令安装:

pip install pdfplumber pandas openpyxl

然后在Python脚本中导入这些依赖包:

import pdfplumber
import pandas as pd
from openpyxl import Workbook

第二步:读取PDF文件并提取表格内容

我们使用pdfplumber库读取PDF文件并提取表格内容。为了提取PDF中的表格,需要执行以下步骤:

  1. 使用pdfplumber打开PDF文件

  2. 获取PDF文件中所有的页面,遍历它们

  3. 在每个页面上,获取所有的表格元素和它们的边框信息

  4. 针对每个表格元素,使用pandas库将它们转换为数据帧

下面是一个示例代码:

pdf_file = pdfplumber.open("example.pdf")
page_data = []

for page in pdf_file.pages:
    tables = page.extract_tables({
        "vertical_strategy": "text",
        "horizontal_strategy": "text"
    })
    for table in tables:
        df = pd.DataFrame(table[1:], columns=table[0])
        page_data.append(df)

pdf_file.close()

# 合并所有表格并进行数据清洗

data_frame = pd.concat(page_data, ignore_index=True)
data_frame = data_frame.applymap(lambda x: x.strip() if isinstance(x, str) else x)

第三步:将数据写入Excel文件

现在,我们已经成功地将PDF文件中的表格转换为数据帧并对其进行了数据清理。下一步是将数据帧写入Excel文件。

我们使用openpyxl库创建一个新的Excel文件,并将数据帧导入Excel文件中。下面是一个示例代码:

book = Workbook()
writer = pd.ExcelWriter("output.xlsx", engine="openpyxl")
writer.book = book
data_frame.to_excel(writer, index=False, sheet_name="Sheet1")
writer.save()

这会在当前目录中创建一个名为“output.xlsx”的新Excel文件,并将数据帧写入其中。

示例说明1:更改表格提取策略

在针对表格进行元素提取时,可以使用vertical_strategy和horizontal_strategy参数来设置表格边框的提取策略。这两个参数的默认值均为“lines”。

  • vertical_strategy参数指定如何提取垂直边框,可以设置为“lines”、“text”、“explicit”或自定义函数;

  • horizontal_strategy参数指定如何提取水平边框,可以设置为“lines”、“text”、“explicit”或自定义函数。

例如,假设我们指定使用文本提取垂直边框,则提取表格元素的代码如下:

tables = page.extract_tables({
    "vertical_strategy": "text",
    "horizontal_strategy": "lines"
})

示例说明2:合并多个工作表

如果在PDF文件中有多个表格,则您需要将这些表格合并到一个Excel工作簿中。可以使用openpyxl的Workbook对象将多个数据帧写入单个Excel文件中的不同工作表。

例如,假设我们的PDF文件中有四个表格,并将它们存储在名为“pdf_tables”的列表中。我们可以使用以下代码将这些表格写入Excel文件的不同工作表中:

book = Workbook()
writer = pd.ExcelWriter("output.xlsx", engine="openpyxl")
writer.book = book

for i, df in enumerate(pdf_tables):
    sheet_name = "Sheet{}".format(i+1)
    df.to_excel(writer, index=False, sheet_name=sheet_name)

writer.save()

这会在当前目录中创建一个名为“output.xlsx”的Excel文件,并将PDF中的所有表格数据写入单个文件的不同工作表中。