使用基于坐标和Rectangle2D.Double的pdfbox库进行文本提取

时间:2015-09-08 06:02:39

标签: pdfbox

我正在尝试使用pdfbox库根据pdf文件中的单词的坐标/位置提取文本。

我一直遵循的步骤:

  • 我使用" PrintTextLocations"获得职位的课程。我制造了一个 通过构建一个特定区域来提取文本的试验 Rectangle2D.Double对象。但是,如果我尝试将步骤1和步骤1联系起来第2步 ,我找不到任何相似性,如x和y坐标,宽度和 高度。我的疑问是,我如何通过吟唱两种方式来提取文本 这样的方式:
  •   

    获取角色的位置   用它们构建一个区域(矩形)   从该区域提取文本。   例如:CAT。是我想从pdf中提取的词。

    - String [441.38,411.02002 fs = 8.0 xscale = 8.0 height = 5.544    space = 2.2240002 width = 5.776001] C
      字符串[447.156,411.02002 fs = 8.0    xscale = 8.0 height = 5.544 space = 2.2240002 width = 5.776001] A
       字符串[452.932,411.02002 fs = 8.0 xscale = 8.0 height = 5.544    space = 2.2240002 width = 4.8880005] T
    字符串[457.82,411.02002 fs = 8.0    xscale = 8.0 height = 5.544 space = 2.2240002 width = 2.223999]

我通过构建具有以下尺寸的区域来提取相同的单词。 Rectangle2D.Double head1ColTwo = new Rectangle2D.Double( 300, 380,160, 35 ); 这是我建立的矩形区域并成功获得了单词" CAT。" 我遵循这种方式的原因是,我的数据库中有一些字段,只有人可以读取并获取这些字段的值。我想自动化这个过程。这里的主要问题是,字段名称不会出现在pdf文件中。 如果这是根据我上面提到的要求,请建议我,如果没有,建议替代。

1 个答案:

答案 0 :(得分:0)

您的问题是由PDFBox怪癖引起的,在其文本提取代码中,它使用不同坐标系中的坐标。例如。在PrintTextLocations方法writeString中,输出生成如下:

for (TextPosition text : textPositions)
{
    System.out.println( "String[" + text.getXDirAdj() + "," +
            text.getYDirAdj() + " fs=" + text.getFontSize() + " xscale=" +
            text.getXScale() + " height=" + text.getHeightDir() + " space=" +
            text.getWidthOfSpace() + " width=" +
            text.getWidthDirAdj() + "]" + text.getUnicode() );
}

并且在PDFTextStripperByArea类中(我假设您使用此类进行基于坐标和Rectangle2D.Double 的提取),它会像这样过滤:

if( rect.contains( text.getX(), text.getY() ) )

getXgetY返回的坐标以及getXDirAdjgetYDirAdj返回的坐标可能会有很大差异。两者都基于实际的默认用户空间坐标,但

  • getXgetY是使用PDF页面旋转条目和
  • 派生的
  • getXDirAdjgetYDirAdj是使用从当前转换矩阵派生的轮播派生的。

因此,我建议阅读TextPosition使用的PDFTextStripperByArea过滤

所用的相同坐标