【问题标题】:Tabula-py omitting pages from a PDF document I am trying to extractTabula-py 从我试图提取的 PDF 文档中省略页面
【发布时间】:2018-07-29 23:46:50
【问题描述】:

我正在尝试使用 tabula-py 从多页 PDF 中提取表格,虽然 PDF 某些页面上的表格被完美提取,某些页面被完全省略

这些遗漏似乎是随机的,不遵循 PDF 上任何可见的视觉特征(因为每个页面看起来都一样),因此制表符省略了第 1 页,提取的第 2 页,省略了第 3 和第 4 页,提取了第 5 页,省略第 6 页,提取第 8 和 9 页,省略 10,提取 11 等。我有 macOS Sierra 10.12.6 和 Python 3.6.3 :: Anaconda 自定义(64 位)。

我尝试将 PDF 分成更短的部分,甚至分成单页,但无论我尝试什么,似乎都无法提取被省略的页面。我已经阅读了 Tabula-py GitHub 页面以及 Stack Overflow 上的相关文档并提交了问题,但我似乎没有找到解决方案。

我通过 iPython notebooks 使用的代码如下:

通过终端安装tabula:

pip install tabula-py

提取我的 PDF 中的表格:

from tabula import read_pdf
df = read_pdf("document_name.pdf", pages="all")

我也尝试了以下,没有任何区别

df = read_pdf("document_name", pages="1-361")

要将数据框保存到 csv 中:

df.to_csv('document_name.csv')

如果您能帮我解决这个问题,我会非常感谢,因为我觉得我被 PDF 卡住了,我只能从中提取大约 50% 的数据。这真令人气愤,因为 50% 看起来绝对完美,但其他 50% 似乎超出我的能力范围,使得分析数据的更大项目变得不可能。

我还想知道这是否可能是 PDF 而不是 Tabula 的问题 - 文件是否会被错误地设置为受保护或锁定,你们中是否有人知道我如何检查并打开它?

提前致谢!

【问题讨论】:

  • 361 页表格?是不是内存不够了?
  • 感谢@Yohst 的评论!我认为这里的记忆不是问题。省略了 361 页文档的第一页,并尝试在该页面上单独使用相同的代码(作为 1 页文档)。当我尝试打印数据框时,我刚刚收到一条响应文本,说明“无”,所以我认为 Tabula-py 在此页面上不起作用,就像其他一些被省略的页面一样。 @Yohst 您还有其他建议吗?
  • 我尝试运行您的设置,但在 read_pdf() 上出现 java 错误。我认为 tabula 在后台运行 java,可能需要特定的配置。我在 macOS 上,所以不想对此感到困惑。也许是时候联系 lib 的作者了?
  • 感谢您再次关注@Yohst!我也尝试重新安装java,但已经有了最新版本。图书馆的作者@chezou 要求通过 Stack Overflow 向他提出所有问题,但我似乎没有办法将我的问题通知他,所以只是希望他能在某个时候看到这一点。

标签: python pdf tabula pdf-extraction


【解决方案1】:

这可能是因为您在 PDF 文件中的数据区域超出了 tabula 正在读取的区域。请尝试以下操作:

首先获取数据的位置,将其中一个页面解析为 JSON 格式(这里我选择了第 2 页),然后提取并打印位置:

tables = read_pdf("document_name.pdf", output_format="json", pages=2, silent=True)
top = tables[0]["top"]
left = tables[0]["left"]
bottom = tables[0]["height"] + top
right = tables[0]["width"] + left
print(f"{top=}\n{bottom=}\n{left=}\n{right=}")

您现在可以尝试通过实验稍微扩展这些位置,直到您从 PDF 文档中收到更多数据:

# area = [top, left, bottom, right]
# Example from page 2 json output: area = [30.0, 59.0, 761.0, 491.0]
# You could then nudge these locations slightly to include a wider data area:
test_area = [10.0, 30.0, 770.0, 500.0]

df = read_pdf(
    "document_name.pdf",
    multiple_tables=True,
    pages="all",
    area=test_area,
    silent=True,  # Suppress all stderr output
)

df 变量现在将保存带有 PDF 数据的表格。

【讨论】:

    【解决方案2】:

    尝试使用java_options,例如: java_options="-Xmx4g"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-10
      • 1970-01-01
      • 2023-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多