PDFBox:区分透明和非透明文本
Posted
技术标签:
【中文标题】PDFBox:区分透明和非透明文本【英文标题】:PDFBox: Differentiating between transparent and non-transparent text 【发布时间】:2021-09-22 10:49:48 【问题描述】:我有一个任务,我必须提取图像后面的文本,并从图像本身进行 OCR 编辑。此文本是透明的。问题是有一个图像后面有文本,它不是 OCR 编辑的,它只是普通文本,它不透明。如何区分需要(透明)和不需要(不透明)的文本?
这是一个有代表性的pdf文件:https://easyupload.io/rbo333 图像 OCR 文本应在第 2、3、12 页提取,但在第 4 页也提取文本。在第 4 页,图像后面没有 OCR 文本,但图像下方有常规文本。我需要以某种方式将其过滤掉,因为我只需要 OCR 文本。
【问题讨论】:
您可能对this answer 感兴趣,它展示了忽略图像覆盖的文本的文本剥离器类的概念证明。请注意,这个答案已经很老了,所以 PDFBox 中的一些细节可能同时发生了变化。如果您无法让VisibleTextStripper
为您工作,请回来分享一个具有代表性的 PDF 示例供我们测试。
@mkl 谢谢,我看了一下,看起来像,如果我错了,请纠正我,它根据坐标确定角色是否在图像中。现在这很好,但我已经提取了图像中的字符,因为我需要从 OCR 编辑的图像中提取可搜索的文本。所以我需要以某种方式区分“就在”图像“后面”的常规文本和“在”图像和 OCR-d 上的文本。我用代表 pdf 的链接编辑了我的问题。
您隐含地区分了这些情况。在绘制图像之前绘制“图像后面”的文本。因此,该类在处理图像时发现了该文本并将其删除。 “图像上”的文本在图像之后绘制。因此,该类将在处理图像后找到它并且不会将其删除。
请澄清。起初我以为您只想要图像未覆盖的文本。这就是引用答案中的旧类提取的内容。但你现在似乎不想要那样。也许反过来,您只想要图像覆盖的文本?还是仅在某些图像上绘制的文本?
@mkl 好吧,有些图像上有 OCR 编辑的可搜索文本。现在我只需要从文档中提取该文本,它工作正常。但是第四页上有一张图片,后面有常规文本,不是 OCR 编辑的。我需要以某种方式将该常规文本与 OCR 编辑文本区分开来。我的印象是常规文本在图像“后面”,而 OCR 编辑文本在图像“前面”,但我不确定了。
【参考方案1】:
所以图像前面或后面都有透明文本。我认为这意味着它们没有颜色,但@mkl 说它们可能有颜色,但它们是空字形。 pdf 规范还指出,即使它们是透明的,它们也可以有颜色。为了真正透明,字符既不能用描边颜色也不能用非描边颜色来渲染。
PDFBox 或 Fontbox 中有一个 RenderingMode 枚举用于此目的,它的 NEITHER 值表示某物是否透明。我可以借助 answer 提取它。
解决方案代码如下所示。
@Override
protected void processTextPosition(TextPosition character)
characterRenderingModes.put(character, getGraphicsState().getTextState().getRenderingMode());
super.processTextPosition(character);
这是 PDFTextStripper 类的重写方法,它遍历页面上的每个字符并获取它们的 RenderingModes。之后,当需要时,我会根据需要检查的角色从地图中取出 RenderingModes。
【讨论】:
请注意,单独检查 RenderingMode 对某些文档有效,但对其他文档无效。 PDF 是一种非常通用的格式,通常允许多种方式来实现相同的效果。 @mkl 是的,你是对的,它并没有涵盖所有的可能性。我有多个 pdf 文件可供尝试,这种方法效果最好,但如果出现新情况,我一定会更新答案。以上是关于PDFBox:区分透明和非透明文本的主要内容,如果未能解决你的问题,请参考以下文章
android沉浸式状态栏变色状态栏透明状态栏修改状态栏颜色及透明