Pdfbox PDFTextStripperByArea координаты смещены - PullRequest
2 голосов
/ 04 января 2012

У меня проблемы с координатами.Область PDFTextStripperByArea, кажется, выдвинута слишком высоко.

Рассмотрим следующий пример фрагмента:

...
PDPage page = (PDPage) allPages.get(0);
PDFTextStripperByArea stripper = new PDFTextStripperByArea();

// define region for extraction -- the coordinates and dimensions are x, y, width, height
Rectangle2D.Float region = new Rectangle2D.Float(x, y, width, height);
stripper.addRegion("test region", region);

// overlay the region with a cyan rectangle to check if I got the coordinates and dimensions right 
PDPageContentStream contentStream = new PDPageContentStream(document, page, true, true);
contentStream.setNonStrokingColor( Color.CYAN );
contentStream.fillRect(x, y, width, height );
contentStream.close();

// extract the text from the defined region
stripper.extractRegions(page);
String content = stripper.getTextForRegion("test region"); 
... 
document.save(...); ...

Голубой прямоугольник красиво перекрывает нужную область.С другой стороны, стриппер пропускает пару линий в нижней части прямоугольника и включает в себя пару линий над прямоугольником - похоже, он смещен «вверх» (по координате y).Что здесь происходит?

Ответы [ 2 ]

2 голосов
/ 04 августа 2017

Как сказал Кристиан в своем комментарии, проблема в том, что система координат для метода fillRect () и система для PDFTextStripperByArea различаются.

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

Итак, чтобы заставить его работать, измените область, заданную для PDFTextStripperByArea, на:

Rectangle2D.Float region = new Rectangle2D.Float(x, ph - y - height, width, height);

, где ph этовысота страницы:

float ph = page.getMediaBox().getUpperRightY();

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

1 голос
/ 27 февраля 2012

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

Грубый эскиз: текстовое поле начинается за пределами области захвата, но текст течет внутри нее.Это не может быть захвачено.

____________
|Page      |
|   _______|
|   |Area ||
|   |     ||
| ..|.....||
| ⁞ |Text⁞||
| ⁞ |____⁞||
| ⁞......⁞ |
|__________|
...