PDFBox:PdfTextStripper提取到非裁剪路径/颜色问题外的不可见文本
PdfTextStripper提取到不可见文本的其他可能原因 这问题提得很到位!咱们来聊聊除了裁剪路径重叠和颜色问题之外,还有哪些常见(甚至有点隐蔽)的原因,会让PdfTextStripper提取到PDF里视觉上不可见的文本令牌:
文本被上层图形元素完全覆盖
就算没有裁剪路径,也可能有一个和背景色完全一致的矩形、色块等图形叠在文本上方。PDF阅读器会按照元素的存储顺序渲染,上层图形会把文本挡住,但PdfTextStripper只会解析文本对象,不会考虑遮挡它的上层图形,所以依然能提取到这些文本。文本位于可选内容图层(OCG)中
PDF支持可选内容图层(Optional Content Groups),有些图层可能被设置为默认隐藏,或者当前视图下不可见,但文本对象依然存在于文档结构里。PdfTextStripper默认不会过滤这些图层的内容,所以会把它们提取出来。文本字体尺寸极小或为0
如果文本的字体大小被设为0,或者小到肉眼完全无法分辨(比如0.1pt),视觉上根本看不到,但文本对象的内容是完整的,提取工具会读取到这些令牌。文本被定位到页面可视区域之外
文本的坐标被设置到了页面边界以外(比如x坐标为负数,或者超过页面宽度),PDF阅读器不会渲染这些区域的内容,但PdfTextStripper会扫描整个文档的文本对象,不管它们是否在可视范围内。文本使用了“无描边无填充”的渲染模式
PDF文本有多种渲染模式,其中模式3(“No Stroke, No Fill”)会让文本既不描边也不填充,视觉上完全不可见,但文本的字符编码依然存在,提取工具可以解析到这些内容。文档结构中的冗余文本
有些PDF生成工具可能会在文档的结构树或元数据中残留一些文本,这些文本并没有被渲染到页面上,但PdfTextStripper遍历文档对象时会读取到它们。比如某些表单生成器可能留下备份的文本值,或者OCR过程中产生的未匹配视觉元素的文本。文本透明度设为完全透明
你提到文本颜色是黑色,但如果文本的透明度(alpha值)被设为0,视觉上完全看不到,但文本对象本身的字符内容依然存在,PdfTextStripper不会考虑透明度属性,只会提取文本内容。
内容的提问来源于stack exchange,提问作者D.F. Stones

