【问题标题】:Scrape data from an ill-formed pdf table从格式错误的 pdf 表中抓取数据
【发布时间】:2016-12-05 15:20:42
【问题描述】:

我正在尝试从布局不佳的 pdf(以下代码中的 URL)中抓取数据。我将需要使用有关表格线条/边框位置的信息来制作有意义的数据记录。

url="http://www.cmc.gv.ao/sites/main/pt/Lists/CMC%20%20PublicaesFicheiros/Attachments/89/Lista%20de%20Institui%C3%A7%C3%B5es%20Registadas%20(actualizado%2004.07.16).pdf"

import scraperwiki, urllib2, re
u = urllib2.urlopen(url)
xml=scraperwiki.pdftoxml(u.read()) # interpret pdf as xml

XML 的行并不表明表格行如何分解信息。典型的行如下所示:

<text top="678" left="493" width="103" height="12" font="6">Besa Património </text>

在我的浏览器的元素检查器中,HTML 稍微详细一些,但我仍然看不到有关表格行位置的信息。

我已经花了相当多的时间来解决这个问题,所以如果首先尝试任何推测性的答案,我将不胜感激。问题是,我如何获得表格线的位置?

【问题讨论】:

  • 这是tagged PDF
  • 我主要担心的是它丢失了关于第一列如何将 39 条记录组合在一起的信息。将pdf转换成这种形式可能很有用,我可以通过Python输出带标签的pdf吗?
  • 尝试从可重复的已知 PDF 结构中获取信息是可能的(也许),尝试从 any PDF 中获取信息几乎是不可能的,如果不是不可能的话。获取原始数据。
  • 已知的 PDF 结构是什么意思?问题在于如何以编程形式表示 pdf 表格的行。

标签: html css regex python-2.7 pdf


【解决方案1】:

要获得表格的边框,您需要:

  • 解压 PDF 并遍历对象(不确定,但也许 pdfrw 可以遍历 objects
  • 在 PDF 中搜索线条和矩形。这个特定的 PDF 将线条表示为以下矩形(4 个值后跟 re 命令):

270.17 749.85 182.81 20.67 re

270.17 414.16 182.81 20.76 re

如果您设法解压缩 PDF(使用 pdfrw 或其他工具),那么您可以尝试制作一个简单的解析器,或者只是对所有对象运行正则表达式以:

  • 收集所有矩形
  • 按相似的 X 和 Y 坐标对矩形进行分组
  • 查找 X 和 Y 边界的坐标
  • 最终将文本 sn-ps 与特定的列或行边界匹配(注意 Y 坐标在 PDF 中是倒置的,请参阅pdf specification

这基本上就是 ByteScout PDF Multitool 实用程序(不幸的是仅适用于 Windows)和其他实用程序的工作方式

【讨论】:

    猜你喜欢
    • 2020-05-01
    • 2015-07-04
    • 1970-01-01
    • 2021-07-23
    • 2021-03-29
    • 2020-11-26
    • 2021-03-22
    • 2018-01-11
    • 2020-11-08
    相关资源
    最近更新 更多