【问题标题】:Get the Extreme right , left,top,bottom position of an image - Itext获取图像的极右、左、上、下位置 - Itext
【发布时间】:2015-11-30 09:38:01
【问题描述】:

我正在为 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);
}

【问题讨论】:

  • 所以本质上您希望图像受到边距的限制(即不扩大它)或者您是否希望在一个确实经过时升起一个标志(以便您可以执行操作) ?
  • 这正是我的限制。
  • 我正在使用 TextMarginFinder - 考虑使用 MarginFinder 代替,this answer 中使用的类。此类还考虑位图图像和矢量图形;不过,对于后者,它处于概念验证状态。
  • 事实上我使用的是同一个类,用于查找我能够找到的文本的位置,但不是图像的位置。您能否提供一些代码 sn-p 或与您所说的内容相关的内容?
  • 事实上我正在使用同一个类来查找文本的位置 - 你确定你已经使用了我链接到的类吗?在这种情况下,您能否分享一个不返回任意内容(包括图像)位置的示例 PDF? 你能提供一些代码 sn-p - 给出我链接到的答案。

标签: java pdf itext pdf-parsing pdfrenderer


【解决方案1】:

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

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

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

请注意:

  • 考虑任何内容,边距查找器不检查内容是否有区别。例如。想想白色文本、白色位图区域或白色矩形,它们都被视为内容,因此边界框也包含这些不可见的内容。尤其是后一个示例,白色矩形,可能会在这里或那里出现问题,因为某些软件首先会在整个页面区域上绘制一个白色矩形。

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

  • 考虑页面边框。因此,像打印机标记这样的页外内容可能会使边界框扩大得更多。

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

  • 考虑注释。因此,如果还需要考虑注释,则生成的边界框可能会很小,例如用于表格。

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

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

【讨论】:

  • 我的代码正在工作,但突然停止工作,我收到以下错误,我不知道为什么:(,你能帮我解决这个问题吗Error: Exception in thread "main" java.lang.NullPointerException at mkl.testarea.itext5.content.MarginFinder.getLlx(MarginFinder.java:53) at itext.MarginFinderFinal.addFullMarginRectangle(MarginFinderFinal.java:184) at itext.MarginFinderFinal.main(MarginFinderFinal.java:246) ,MarginFinderFinal 是我的班级编写业务逻辑
  • 在你班级的这个函数中,当我尝试这个时,我知道 textRectangle 为空,if condition 正在评估 public float getLlx() { if (textRectangle == null){ System.out.println("It is null"); } } ,为什么会为空??
  • 你是对的,textRectanglenull,直到第一个包含位置和范围的内容流入。因此,例如一个基本上是空的页面可能会留下它null。如果有问题的页面不是空的,您可以分享它以供分析吗?因为我想不出MarginFinder 没有完全错过任何实际内容。
  • 哦,谢谢你……你说得对,我在第二页本身就有这个错误,猜猜那是一个空白页,我从昨天开始就在拉我的头,谢谢你很多,当它遇到null时,我已经包含了必要条件:)
猜你喜欢
  • 2013-09-02
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
  • 2014-06-01
  • 1970-01-01
  • 2013-12-22
相关资源
最近更新 更多