获取图像的极右,左,上,下位置 - Itext

时间:2015-09-04 09:23:12

标签: java pdf itext pdf-parsing pdfrenderer

我正在为pdf设置保证金,并检查页面内容是否超出保证金。

如果页面内容只是文本,我很容易就能做到。

这就是我正在做的事情:

我正在使用TextMarginFinder。我会根据图书大小设置 pdf的left margin值。并使用finder.getLlx();进行检查,因为finder.getLlx();会让我获得该页面中文本的最左侧位置。

TextMarginFinder finder;
if(leftmar>=finder.getLlx())
   {
        errormargin=1; //left margin error
        System.out.println("Page: "+i+"Margin Error:LeftMArginError ");
   }

但是,如果页面包含图像,则不起作用。虽然图像超出了边距,但我没有收到上述代码的错误,因为finder.getLlx();函数似乎只适用于文本。

两个问题:

1)在循环浏览pdf中的页面时,如果该页面中有图像,我该如何检查该特定页面是否包含图像?

2)如果它包含图像,我怎样才能获得其极端位置?

mkl建议后更新

     if(leftmar>=finder.getLlx())
{
    errormargin=1; //left margin error
    System.out.println("finder.getLlx() value ="+finder.getLlx()+", leftmar Value="+leftmar);

}



     if(rightmar<= finder.getUrx()){
            errormargin=1; //right margin error
            System.out.println("finder.getUrx() value ="+finder.getUrx()+", rightmar Value="+rightmar);
     }


if(margintop >= finder.getUry()){
    errormargin=3; //top margin error
    System.out.println("finder.getUry() value ="+finder.getUry()+", margintop Value="+margintop);
}


if(marginbottom >= finder.getLly()){
    errormargin=3; //bottom margin error
    System.out.println("finder.getLly() value ="+finder.getLly()+", marginbottom Value="+marginbottom);
}

1 个答案:

答案 0 :(得分:1)

这更像是OP实际需要的答案,是一种检索页面上所有内容的边界框的方法。

OP已经使用iText TextMarginFinder渲染侦听器类来确定页面上文本的边界框。在this answer的上下文中,已经开发了类似的类MarginFinder,其不仅考虑文本而且考虑其他类型的内容,例如位图图像和矢量图形。

因此,用TextMarginFinder替换MarginFinder的使用可以找到页面上任何内容的边界框。

请注意:

  • 考虑任何内容,保证金查询程序不会检查内容是否有所作为。例如。考虑白色文本,白色位图区域或白色矩形,都被认为是内容,因此,边界框也包含这样的不可见内容。特别是后一个例子,白色矩形,在这里或那里可能是一个问题,因为一些软件首先在整个页面区域上绘制一个白色矩形。

  • 剪切路径。因此,即使是从未绘制的内容(因为它被剪掉)也会使边界框扩展。

  • 页面边框也是。因此,像打印机标记这样的页外内容可能会使边界框更加扩展。

  • 计算矢量图形边界框的代码不正确:它只返回所有控制点的边界框,如果贝塞尔曲线可能为假。忽略线宽和楔形类型也会导致坐标略微偏离。

  • 注意。因此,如果预期也考虑注释,则所得到的边界框可以是小的,例如,表格。

尽管存在这些缺点,渲染侦听器通常会返回正确的结果。如果这还不够,可以相应地扩展课程。

PS:对原始问题感兴趣的任何人都可以在MarginFinder渲染侦听器类及其使用中找到答案。