Извлечение текста в определенной области страницы 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? Там обычно очень хорошо отвечают на вопросы?

Другие вопросы по тегам