从 PDF 中提取包含空单元格且没有可见边缘的表格

问题描述 投票:0回答:1

我正在使用

pdfplumber
从以下 PDF 页面中提取数据:

Data in the test pdf file

import pdfplumber
 

pdf_file = 'D:/Input/Book1.pdf'
pdf = pdfplumber.open(pdf_file)

page = pdf.pages[0]
text = page.extract_text()
table  = page.extract_tables()

for line in text.split("\n"):
    print(line)

当我使用

page.extract_tables()
时,我只获取行标题,而不是表中的关联数据。

由于

extract_tables()
不起作用,我正在使用
page.extract_text()
逐行循环它。然而,
extract_text()
在读取一行时似乎忽略了表格数据中的空单元格。

使用

extract_text()
时提取以下数据:

Weekly test report with multiple lines of hedder of the each page of report
col1 col2 col3 Start End Col Group
Name Name Name Date Date Col5 Col6 Col7 Currency
123 ABC 26/8/2024 26/8/2024 1000 20000 26/8/2024 USD
456 DEF New 26/8/2024 2000 15000 27/8/2024 INR
789 GES DDD 26/8/2024 26/8/2023 4000 20/4/2024 AUD

我想使用 PDF 中的表格数据创建一个数据框。

python pdf pdfplumber
1个回答
1
投票

似乎没有直接的方法可以使用

extract_tables()
访问表数据,因为我的表没有轮廓。

要阅读表格,我需要使用

extract_table()
table_settings

import os
import pandas as pd
import pdfplumber


pdf_file = 'D:/Input/Book1.pdf'

page_vertical_lines = [40,102,152,203,253,305,360,408,458,510]
table_settings={"vertical_strategy": "explicit", 
                "horizontal_strategy": "text"
                ,"explicit_vertical_lines": page_vertical_lines,
                }
pdf = pdfplumber.open(pdf_file)
df1 = pd.DataFrame(pdf.pages[0].extract_table(table_settings))

此代码从 pdf 文件中提取了所需的列数。

这里的挑战是获得

explicit_vertical_lines
位置

我已使用

matplotlib
库通过以下代码识别正确的位置。您需要根据您的报告栏调整位置。

import pdfplumber
import matplotlib.pyplot as plt

pdf_file = 'D:/Input/Book1.pdf'

with pdfplumber.open(pdf_file) as pdf:
    page = pdf.pages[0]
    im = page.to_image()
    
    vertical_lines = [40,102,152,203,253,305,360,408,458,510]
    for x in vertical_lines:
        im.draw_vline(x,stroke="blue",stroke_width=1)
    
    plt.imshow(im.annotated)
    plt.show()

当您运行此代码时,它会根据 pdf 上的

vertical_lines
值给出蓝线,如下图所示。根据您的需要调整
vertical_lines
值。

PDF page with blue lines

© www.soinside.com 2019 - 2024. All rights reserved.