PDFBox:区分透明和非透明文本

PDFBox: Differentiating between transparent and non-transparent text

我有一个任务,我必须提取图像后面的文本并从图像本身进行 OCR 编辑。此文本是透明的。问题是有一个图像后面有没有经过 OCR 编辑的文本,它只是普通文本并且不透明。如何区分需要(透明)和不需要(非透明)的文本?

这是一个有代表性的 pdf 文件:https://easyupload.io/rbo333 图像OCR文本应该在第2、3、12页提取,但在第4页也提取了文本。在第4页,图像后面没有OCR文本,但图像下面有常规文本。我需要以某种方式过滤掉它,因为我只需要 OCR 文本。

因此图像前面或后面有透明文本。我认为这意味着它们没有颜色,但@mkl 说它们可能有颜色,但它们是空字形。 pdf 规范还指出,即使它们是透明的,它们也可以有颜色。要真正透明,需要既不使用描边颜色也不使用非描边颜色来渲染字符。

PDFBoxFontbox 中有一个 RenderingMode 枚举正是为了这个目的,并且它的 NEITHER 值表示某物是否透明。我可以借助 .

提取它

解决方案代码如下所示。

@Override
protected void processTextPosition(TextPosition character) {
    characterRenderingModes.put(character, getGraphicsState().getTextState().getRenderingMode());
    super.processTextPosition(character);
}

这是 PDFTextStripper class 的重写方法,它遍历 page/s 上的每个字符并获取它们的渲染模式。之后,当需要时,我根据需要检查的字符从地图中获取 RenderingModes。