Получить крайнее правое, левое, верхнее, нижнее положение изображения - Itext

Я устанавливаю поле для pdf и проверяю, превышает ли содержимое страницы поле.

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

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

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

Обновить после 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);
}

person Abhinav    schedule 04.09.2015    source источник
comment
Итак, по сути, вы хотите, чтобы изображение было ограничено краем (т.е. не расширялось над ним) или вы хотите, чтобы флаг поднимался, когда кто-то проходит (чтобы вы могли выполнить действие)?   -  person insidesin    schedule 04.09.2015
comment
Именно это мое ограничение.   -  person Abhinav    schedule 04.09.2015
comment
Я использую TextMarginFinder. Рассмотрите возможность использования MarginFinder вместо этого класс, используемый в этом ответе. Этот класс также рассматривает растровые изображения и векторную графику; однако для последних он находится в состоянии проверки концепции.   -  person mkl    schedule 04.09.2015
comment
На самом деле я использую тот же класс для поиска положения текстов, которые я могу, но не изображений. Можете ли вы предоставить фрагмент кода или что-то, связанное с тем, что вы говорите?   -  person Abhinav    schedule 04.09.2015
comment
На самом деле я использую тот же класс для определения положения текстов. Вы уверены, что уже используете класс, на который я ссылаюсь? В таком случае можете ли вы поделиться образцом PDF, в котором он не возвращает позицию произвольного содержимого, включая изображения? Можете ли вы предоставить фрагмент кода - дайте ответ, на который я ссылался.   -  person mkl    schedule 04.09.2015
comment
о, подожди, извини, не тот класс, дай мне проверить и вернуться,   -  person Abhinav    schedule 04.09.2015
comment
Привет, @mkl, спасибо, что указал мне на этот класс, не могли бы вы немного объяснить, как использовать этот класс в моем случае? Извините, если это звучит глупо, потому что я больше PHP-разработчик.   -  person Abhinav    schedule 04.09.2015
comment
Вы сказали, что уже используете TextMarginFinder (я полагаю, вы имеете в виду тот, что из банки iText). Вы можете просто использовать класс MarginFinder в качестве замены. Если это не работает для вас, покажите свой код (работает для TextMarginFinder), тогда мы сможем настроить его для вашего варианта использования.   -  person mkl    schedule 04.09.2015
comment
@mkl: Привет, большое спасибо за ваше предложение, я сделал это соответственно, хотя чувствую, что с самого начала делал что-то не так. Я обновил свой код, пожалуйста, проверьте его. Я полагаю, что метод getUrx() дает мне всю ширину, чего не должно быть.   -  person Abhinav    schedule 04.09.2015
comment
getUrx должен дать вам координату x самой правой части содержимого. Если в вашем случае это доходит до правого конца страницы, то, вероятно, какой-то контент идет так далеко. Например. некоторые программы сначала рисуют белый прямоугольник, покрывающий всю страницу. Так ли это или что-то более тонкое, я не могу сказать без образца PDF.   -  person mkl    schedule 04.09.2015
comment
Привет @mkl Я нашел решение. То, что дает getUrx, - это координата x справа налево, мне просто нужно было сделать небольшое вычитание из моего pdf width с getUrx() и сравнить его с моим значением поля. Большое спасибо за ваш класс :)   -  person Abhinav    schedule 05.09.2015
comment
Может быть, вы должны опубликовать это как ответ, я приму это :)   -  person Abhinav    schedule 05.09.2015


Ответы (1)


Это скорее ответ на то, что на самом деле хотел OP, способ получить ограничивающую рамку всего контента на странице.

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

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

Пожалуйста, будьте осторожны:

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

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

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

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

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

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

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

person mkl    schedule 05.09.2015
comment
Мой код работал, но внезапно перестал работать, и я получаю следующую ошибку, и я не знаю, почему :(, не могли бы вы помочь мне с этим 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 - это мой класс, в котором я написал бизнес-логику - person Abhinav; 22.09.2015
comment
В этой функции вашего класса, когда я попробовал это, я узнал, что textRectangle имеет значение null, if condition оценивалось public float getLlx() { if (textRectangle == null){ System.out.println("It is null"); } } , почему это должно быть null ?? - person Abhinav; 22.09.2015
comment
Вы правы, что textRectangle является null до тех пор, пока не вступит первый бит контента с местоположением и экстентом. Таким образом, например. практически пустая страница может оставить ее null. Если рассматриваемая страница не пуста, не могли бы вы поделиться ею для анализа? Потому что я не могу придумать фактического контента, полностью пропущенного MarginFinder. - person mkl; 22.09.2015
comment
О, чувак, большое тебе спасибо .... ты прав, я получил эту ошибку на самой второй странице и угадай, что это за пустая страница, я тянул голову со вчерашнего дня, большое спасибо, я включил необходимое условие, когда Он встречает null :) - person Abhinav; 22.09.2015