#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? Обычно они очень хорошо отвечают на вопросы там?