Извлечение текста в определенной области страницы PDF с помощью ICEpdf

#java #pdf #extraction #text-extraction #icepdf

#java #PDF #извлечение #извлечение текста #icepdf

Вопрос:

Есть ли какой-либо способ извлечь текст из определенной области с помощью ICEpdf? Я смог извлечь целые страницы, но это не то, что я хочу делать.

(Я знаю, что PDFBox прекрасно извлекает текст в определенной прямоугольной области страницы. Однако, поскольку рендеринг изображений работает намного лучше в ICEpdf, я бы хотел использовать эту библиотеку.)

Ответ №1:

ДЛЯ объекта Page, представляющего страницу, вы можете вызвать метод:

pageText Текст страницы = document.getPageText(номер страницы);

Аналогично примеру с пакетом ./examples/extraction/PageTextExtraction.java

Объект pageText содержит все объекты LineText-> WordText-> GlyphText для страницы. LineText, WordText и GlyphText расширяют AbstractText, который имеет метод getBounds(). Границы этих объектов находятся в пользовательском пространстве PDF, 1-м геометрическом квадранте. Java2D находится в 4-м геометрическом квадранте. Предполагая, что у вас уже есть selectionRectangle, код будет следующим:

// текущее выбранное состояние, игнорировать выделенное.
currentPage.getViewText().clearSelected();

// получить преобразование страницы, одинаковое для всех вычислений
AffineTransform pageTransform = currentPage.getPageTransform(
 Страница.BOUNDARY_CROPBOX, 
DocumentViewModel.getViewRotation(), 
 DocumentViewModel.getViewZoom());

Rectangle2D.Float pageSpaceSelectRectangle = 
 Преобразование в текстовое пространство (selectionRectangle, pageTransform);
ArrayList pageLines = pageText.getPageLines(); 
для (LineText pageLine : строки страницы) {
 // проверьте наличие содержимого, если да, разбейте на слова.
 if (pageLine.getBounds().intersects(pageSpaceSelectRectangle )) {
 // у вас есть некоторый выделенный текст. 
 }
}



 /**
 * Преобразует прямоугольник в пространство, указанное в форме страницы. Это
 * это служебный метод для преобразования прямоугольника выделения в пространство страницы
 * чтобы можно было вычислить пересечение для определения выбранного состояния.
 *
 * @param Выделите прямоугольником мыши, чтобы преобразовать пространство 
 * @param pageTransform преобразование страницы
 * @возвращает преобразованный прямоугольник.
 */ 
 private Rectangle2D convertRectangleToPageSpace(Прямоугольное наведение курсора мыши,
 AffineTransform pageTransform) {
 Общий путь shapePath;
 попробуйте {
 AffineTransform transform = pageTransform.createInverse();
 shapePath = новый общий путь (наведение курсора мыши);
 shapePath.transform(преобразование);
 возвращает shapePath.getBounds2D();
 } catch (исключение NoninvertibleTransformException e) { 
 logger.log(уровень.СЕРЬЕЗНАЯ,
 "Ошибка преобразования точки мыши в пространство страницы"., e);
 }
 возвращает значение null; 
 }

Комментарии:

1. большое спасибо за ваш вклад, я доработаю его и опубликую здесь, ваше решение уже довольно классное (однако я буду работать над точностью)

Ответ №2:

Размещали ли вы сообщения на форумах icepdf? Обычно они очень хорошо отвечают на вопросы там?