Извлечение текста в определенной области страницы PDF с помощью ICEpdf
Есть ли способ извлечь текст определенного региона с помощью ICEpdf? Я смог извлечь целые страницы, но это не то, что я хочу сделать.
(Я знаю, что PDFBox прекрасно извлекает текст в определенной прямоугольной области страницы. Однако, поскольку рендеринг изображений работает намного лучше в ICEpdf, я хотел бы использовать эту библиотеку.)
2 ответа
На объекте Page, представляющем страницу, вы можете вызвать метод:
PageText pageText = document.getPageText (pagNumber);
Аналогично примеру пакета./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( Page.BOUNDARY_CROPBOX, documentViewModel.getViewRotation(), documentViewModel.getViewZoom()); Rectangle2D.Float pageSpaceSelectRectangle = convertRectangleToPageSpace(selectionRectangle, pageTransform); ArrayList pageLines = pageText.getPageLines(); for (LineText pageLine: pageLines) { // проверка на наличие содержимого, если это так, разбить на слова. if (pageLine.getBounds().intersects(pageSpaceSelectRectangle)) { // у вас есть выделенный текст. } } /** * Преобразует прямоугольник в пространство, указанное преобразованием страницы. * Это служебный метод для преобразования прямоугольника выбора в пространство страницы *, чтобы можно было рассчитать пересечение для определения выбранного состояния. * * @param mouseRect прямоугольник для преобразования пространства * @param pageTransform page transform * @return преобразованный прямоугольник. */ private Rectangle2D convertRectangleToPageSpace(Rectangle mouseRect, AffineTransform pageTransform) { GeneralPath shapePath; try { AffineTransform tranform = pageTransform.createInverse(); shapePath = new GeneralPath(mouseRect); shapePath.transform(tranform); return shapePath.getBounds2D(); } catch (NoninvertibleTransformException e) { logger.log(Level.SEVERE, "Ошибка преобразования точки мыши в пространство страницы.", e); } return null; }
Вы публиковали на форумах icepdf? Там обычно очень хорошо отвечают на вопросы?