【问题标题】:How to determine coordinates of multi-line text in PDF如何确定PDF中多行文本的坐标
【发布时间】:2019-01-22 15:27:59
【问题描述】:

我正在使用 Apache PdfBox 2.0 来解析 pdf 文件。有了一些固定的字符串,我能够创建一个基于:

  1. 固定文本,作为起点
  2. 下一个单元格/文本位置,或 null
  3. 底部区域,用于确定矩形的高度。

使用起点,我正在计算 x 和 y(见下图 PDF 框中的 pdf 结构:

使用“下一个”文本块(这是另一个固定值,例如字段或表格标题),我正在使用公式确定所需区域的宽度:

width = second.x - first.x 

或类似的东西。因此,例如,在表格中,预先知道标题名称,很容易检测列。我正在尝试做的(到目前为止未能以准确的方式这样做)是确定 pdf 表中的行。此表有时包含某些列中的缺失值以及某些行/列的多行值。我已经扩展了我的“系统”(第一,下一个,底部)以与表格行一起工作,当我有“规范化”表格(例如,没有空格和/或至少没有多行值)时,这非常有用。但它不适用于现实世界的数据,因为到目前为止我找不到确定多行值位置(x、y、宽度、高度)的方法。 PDF Box甚至可以做到这一点吗?有人建议先将pdf转换为html,然后再解析html。这是一个可行的选择吗?有人使用过this 库吗?接下来我会尝试使用它。

【问题讨论】:

  • 如果您只是使用文本绘图操作符,则从 PDF 解析表格数据并非易事。如果幸运的话,PDF 会被标记,您可以离开结构树而不是提取的文本。您知道您将使用的 PDF 是否被标记?
  • 我其实有pdf文件,但我不知道如何检查它是否被标记。
  • 致电document.getDocumentCatalog.getStructTreeRoot()。 (可能有错字)它是空的吗?那么它没有被标记。
  • 我已经评估了表达式:document.getDocumentCatalog().getStructureTreeRoot(),它为空。因此,我猜它没有被标记。
  • 更多可能有用也可能没用的东西:stackoverflow.com/questions/38931422/… 和 PrintTextLocations.java 示例。另请参阅“Tabula”项目。

标签: java parsing pdf pdfbox multiline


【解决方案1】:

就像我在之前的 cmets 中所说的那样,我找到了解决问题的部分方法。这是基于两件事:

  1. 首先,我假设每个表的一列仅包含不超过 1 行的不同值。
  2. 接下来,由于我在文档中也有一些固定的文本,我已经确定了这些文本的坐标,并将它们用作包含我要提取的文本的区域的分隔符。例如,“当前、下一个、底部”系统(我称之为)可以包含例如:“列名 A”、“列名 B”、“固定文本 C”(或同一表中的第二行 - 确定基于唯一的单行值)。

它并不完美,如果固定文本可能在文档中出现多次,则可能会出现问题。当然,可以通过使用垂直坐标等过滤正确的出现来进行改进,但是目前我将关闭这个问题,因为这个问题似乎没有标准答案,目前也没有开源库能够从 pdf 中提取表格数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-02
    • 2015-10-23
    • 2011-09-05
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    相关资源
    最近更新 更多