我正在尝试使用pdfbox库根据pdf文件中的单词的坐标/位置提取文本。
我一直遵循的步骤:
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文件中。
如果这是根据我上面提到的要求,请建议我,如果没有,建议替代。
答案 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() ) )
getX
和getY
返回的坐标以及getXDirAdj
和getYDirAdj
返回的坐标可能会有很大差异。两者都基于实际的默认用户空间坐标,但
getX
和getY
是使用PDF页面旋转条目和getXDirAdj
和getYDirAdj
是使用从当前转换矩阵派生的轮播派生的。因此,我建议阅读TextPosition
使用的PDFTextStripperByArea
过滤