如何确定PDF中多行文本的坐标

时间:2018-08-15 17:58:32

标签: java parsing pdf pdfbox multiline

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

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

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

pdf mapping in PDF Box

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

width = second.x - first.x 

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

1 个答案:

答案 0 :(得分:0)

就像我在之前的评论中所说,我已经找到了部分解决方案。这是基于两件事:

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

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