1

有没有办法使用 ICEpdf 提取特定区域的文本?我能够提取整个页面,但这不是我想要做的。

(我知道 PDFBox 可以很好地提取页面特定矩形区域中的文本。但是,由于图像渲染在 ICEpdf 中效果更好,我想使用该库。)

4

2 回答 2

3

在代表页面的 Page 对象上,您可以调用该方法:

PageText pageText = document.getPageText(pageNumber);

类似于捆绑示例 ./examples/extraction/PageTextExtraction.java

PageText 对象包含页面的所有 LineText->WordText->GlyphText 对象。LineText、WordText 和 GlyphText 都扩展了具有 getBounds() 方法的 AbstractText。这些对象的边界位于 PDF 用户空间中,即第一几何象限。Java2D 位于第四几何象限。假设您已经有了 selectionRectangle ,代码如下:

// 当前选中状态,忽略高亮。
currentPage.getViewText().clearSelected();

// 获取页面变换,所有计算都一样
仿射变换 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 页面转换
     * @return 转换后的矩形。
     */
    私有 Rectangle2D convertRectangleToPageSpace(矩形 mouseRect,
                                                    仿射变换页面变换){
        通用路径 shapePath;
        尝试 {
            AffineTransform 变换 = pageTransform.createInverse();
            shapePath = new GeneralPath(mouseRect);
            shapePath.transform(变换);
            返回 shapePath.getBounds2D();
        } 捕捉(NoninvertibleTransformException e){
            logger.log(Level.SEVERE,
                    "将鼠标点转换为页面空间时出错。", e);
        }
        返回空值;
    }
于 2011-05-02T20:25:33.890 回答
2

你在icepdf 论坛上发过帖子吗?他们通常很擅长回答那里的问题?

于 2011-05-02T11:16:04.387 回答