修复使用 Tabula 读取 PDF 文件中的表格时缺少的标题

Fix missing header while reading table in PDF file using Tabula

提问人:khankhattak 提问时间:10/2/2023 最后编辑:khankhattak 更新时间:10/6/2023 访问量:84

问:

我想从PDF文件中1992年至1993年的统计进出口数据下面的PDF文件图像中提取表格数据

我想要的数据是创建数据集的数值数据。我尝试使用 tabula.py 库,但我获得的数据不可用或不可纠正:Tabula 库提取的表格数据

代码片段:

# Modules Imported
import tabula
from tabula import read_pdf
from tabulate import tabulate
import pandas as pd

# PDF file is being read and tables are being stored in a dataframe
df = read_pdf(PDF_FILE_PATH, stream=True, pages = "all")

此外,即使使用 area 和 columns 参数,另一个代码片段也会产生相同的结果

pdf_reader = pypdf.PdfReader(PDF_FILE_PATH)

num_pages = len(pdf_reader.pages)
num_pages

table_pdf = read_pdf(
    PDF_FILE_PATH,
    guess = False,
    pages = 1,
    stream = True,
    encoding = 'utf-8',
    area = (0, 0, 200, 250),
    columns = None,
)


任何建议将不胜感激。

原始文件在这里: PBS 政府统计表格数据

Python 熊猫 PDF 白板

评论

0赞 OCa 10/2/2023
如果这些都不能 stackoverflow.com/q/56017702/12846804,您是否考虑过先处理较小的文件?
0赞 khankhattak 10/2/2023
@OCa你能详细说明一下,问题是如果我为pdf文档分配边界,那么它只适用于该特定文档,我需要对所有文档都这样做。
0赞 OCa 10/2/2023
我的意思是你是一个新用户,所以我们不得不问:你是否能够使表格与更简单的pdf文件一起工作?
0赞 khankhattak 10/3/2023
@OCa是的,为了提取更简单的 pdf 文件文本,我面临的问题是在使用 tabula.py 库时表格未格式化并且缺少某些值。我怎样才能正确地做到这一点,或者我是否使用了错误的方法。请帮忙。
1赞 khankhattak 10/4/2023
添加了代码片段,两者都是。

答:

1赞 K J 10/6/2023 #1

当您有固定间距的文本(例如来自 LinePrinter)时,您可以使用一个世纪很久以前的旧方法。所以自从我记得 Excel 4 以来?导入了 MSDos 文本,所以我通常使用 Office 97 进行此类输出,无论如何,这里使用 2013 年,因为它只有十年的历史,我们可以按顺序查看输入。

enter image description here

因此,从程序上讲,它是非常手动的,一行代码和人眼。

上面的数据帧是由

poppler\22.02>pdftotext -nopgbrk -fixed 6  imports.pdf

需要真正的 MacroCoding 以人性化的逻辑方式整理第三列,以处理转换时剥离的任何缺失的包装。

但是,要删除这些不需要的页面标题,最好使用相当于DOS Findstr的现代标题,因此要排除页码和----我们需要运行第二行代码。

让我们先检查一下它是否反向工作,我们要确保它们将被排除在外,在这里我们注意到,在 1005 页之后,还有一个次要的 12 页需要考虑。

enter image description here

这已经足够好了,所以预处理数据。

findstr /v /l "IMPORTS Value \| ity ------" imports.txt > cleaner.txt

enter image description here

因此,文本现在适合在列中导入到 Excel,但请注意第三列,确保它是向右的。NO

回到那个排除所有标题(包括第 1 页的 2 个 ! 我们只需要先导出第一个集合,所以现在我们想要:

enter image description here

所以整个命令集是

pdftotext -nopgbrk -fixed 6 -f 1 -l 1 -H 140 -W 900 imports.pdf DataFrame.txt
pdftotext -nopgbrk -fixed 6  imports.pdf -| findstr /v /l "IMPORTS Value \| ity ------" imports.txt >> DataFrame.txt

运行 2 行程序不到 10 秒

enter image description here

然后 Python 或 Excel /e 或 /m(使用合适的导入宏)加载 DataFrame:.txt

评论

0赞 khankhattak 10/19/2023
非常感谢您的回答。这比我所做的要简单得多。再次感谢。@k-J @K J