2015-09-04 3 views
1

Я устанавливаю разницу для pdf и проверяю, превышает ли содержимое страницы предел.Получить крайнее правое, левое, верхнее, нижнее положение изображения - Itext

Я легко могу это сделать, если содержимое страницы - это просто текст.

Вот то, что я делаю:

Я использую TextMarginFinder. Я буду установитьleft margin значения pdf на основе размера книги. и проверьте с помощью 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) Если у него есть изображение, как я могу получить его крайние положения?

Update после 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); 
} 
+0

По существу, вы хотите, чтобы изображение было ограничено положением (то есть не расширялось над ним), или вы хотите, чтобы флаг поднимался, когда кто-то переходил (чтобы вы могли совершить какое-либо действие)? – insidesin

+0

Точно это мое ограничение. – Abhinav

+0

* Я использую 'TextMarginFinder' * - рассмотрю использование [MarginFinder] (https://github.com/mkl-public/testarea-itext5/blob/master/src/main/java/mkl/testarea/itext5/content/ MarginFinder.java) вместо этого, класс, используемый в [этом ответе] (http://stackoverflow.com/a/20212172/1729265). Этот класс также рассматривает растровые изображения и векторную графику; для последних они находятся в состоянии доказательной концепции. – mkl

ответ

1

Это больше ответ на то, что на самом деле хотел О.П., способ получения ограничительной рамки всего содержимого страницы.

В OP уже используется класс прослушивания iText TextMarginFinder, чтобы определить ограничивающий прямоугольник текста на странице. В контексте this answer был разработан аналогичный класс MarginFinder, который не только рассматривает текст, но и другой вид контента, например. растровых изображений и векторной графики.

Таким образом, замена TextMarginFinder на MarginFinder позволяет найти ограничивающую рамку любого содержания на странице.

Обратите внимание:

  • считается любое содержание, запас искатель не проверяет, имеет ли содержание разница. Например. подумайте о белом тексте, белых растровых областях или белых прямоугольниках, все они считаются содержимым, и поэтому ограничивающая рамка также охватывает такой невидимый контент. Особенно последний пример, белые прямоугольники, может быть проблемой здесь или там, поскольку какое-то программное обеспечение сначала рисует белый прямоугольник по всей области страницы.

  • Обтравочный контур не не рассматривается. Таким образом, даже контент, который никогда не нарисован (потому что он отсечен), расширяет ограничительную рамку.

  • Границы страницы не считается, либо.Таким образом, внестраничный контент, такой как метки принтера, может еще больше расширить ограничительную рамку.

  • Неверный код, вычисляющий ограничительную рамку для векторной графики: он просто возвращает ограничивающий прямоугольник всех контрольных точек, которые в случае кривых Безье могут быть ложными. Его игнорирование ширины линий и типов клина также приводит к получению нескольких координат.

  • Аннотации: не. Таким образом, результирующая ограничивающая рамка может быть малой, если ожидается, что аннотации также будут рассмотрены, например. для форм.

Несмотря на эти недостатки, прослушиватель рендера обычно возвращает правильные результаты. Если этого недостаточно, класс может быть продлен соответствующим образом.

PS: Любой, кто интересуется исходным вопросом, может найти ответы в классе прослушивания MarginFinder и его использовании.

+0

Мой код работал, но внезапно прекратил работать, и я получаю ошибку ниже, и я не знаю, почему :(, можете ли вы помочь меня на этом 'Ошибка: Исключение в потоке" main "java.lang.NullPointerException \t at mkl.testarea.itext5.content.MarginFinder.getLlx (MarginFinder.java:53) \t at itext.MarginFinderFinal.addFullMarginRectangle (MarginFinderFinal.java: 184) \t at itext.MarginFinderFinal.main (MarginFinderFinal.java:246) ', MarginFinderFinal - это мой класс, где я написал бизнес-логику – Abhinav

+0

В этой функции вашего класса, когда я пробовал это, я узнал что textRectangle имеет значение null, значение 'if condition' получает значение' public float getLlx() { if (textRectangle == null) { \t System.out.println («Это значение равно null»); }} ', почему это должно быть null? – Abhinav

+1

Вы правы, что 'textRectangle' является' null ', пока не будет достигнут первый бит контента с расположением и расширением. Таким образом, например, по существу пустая страница может оставить ее «null». Если эта страница не пуста, можете ли вы поделиться ею для анализа? Потому что я не могу думать о том, что фактическое содержимое полностью не пропущено «MarginFinder». – mkl

Смежные вопросы