如何使用Apache PDFBox识别并移除PDF中的删除线文本?
我明白你用PDFBox提取PDF文本时,想过滤掉带删除线的内容却遇到了方案失效的麻烦——那些Stack Overflow的帖子在多数场景下不管用确实让人头疼。给你推荐几个靠谱的替代库,每个都具备处理删除线文本的能力,适配不同的场景:
iText 7
这是PDF处理领域的老牌工具,对文本属性的识别非常精准。它的文本提取API可以直接访问文本的RenderMode,其中删除线对应的是RenderMode.STRIKE。你可以自定义TextExtractionStrategy,在renderText方法里判断文本的渲染模式,跳过带有删除线标记的内容。举个简单的代码片段:public class StrikeThroughFilterStrategy extends LocationTextExtractionStrategy { @Override public void renderText(TextRenderInfo renderInfo) { // 检查是否带有删除线渲染模式 if (!renderInfo.getTextRenderMode().equals(RenderMode.STRIKE)) { super.renderText(renderInfo); } } }之后用这个策略提取文本,就能自动过滤掉带删除线的内容。
Apache Tika
Tika底层依赖PDFBox,但提供了更上层的解析封装。你可以扩展它的PDFParser,自定义文本提取逻辑:通过访问PDF的底层结构,检测文本的渲染属性或者关联的删除线图形,进而过滤掉目标内容。如果你的PDF里删除线是独立绘制的线条(不是文本自带属性),Tika也能结合图形检测逻辑来识别这些线条覆盖的文本区域。PDFClown
这个库对PDF的底层结构访问更为细致,能直接获取文本的视觉属性和关联的图形元素。它可以识别两种类型的删除线:一种是文本自身的渲染属性,另一种是单独绘制的线条。你可以遍历PDF的页面元素,检查文本是否关联了删除线笔画,或者文本区域是否被线条覆盖,从而过滤掉对应内容。
额外提醒:有些PDF的删除线不是通过文本渲染模式标记的,而是单独绘制的直线,这时候任何库都需要额外的逻辑——检测文本边界框是否与直线的边界框有重叠,以此判断是否为删除线文本。这种场景下,PDFClown的图形元素处理能力会更有优势。
内容的提问来源于stack exchange,提问作者Shantanu Bansal




