【问题标题】:Again having invisible text coming from PdfTextStripper再次有来自 PdfTextStripper 的不可见文本
【发布时间】:2025-11-29 11:50:01
【问题描述】:

文件示例:file

问题 - 使用 PdfTextStripper 提取文本时,页面开头的“资产”后有标记“9/1/2017”和“387986”,应删除,还有一些其他隐藏标记。

我已经应用了this 解决方案(所以我没有在这里复制粘贴它,因为实际上问题是完全一样的)并且隐藏的文本仍然出现在页面上。除了剪辑路径之外,它会被其他东西隐藏吗? 谢谢!

【问题讨论】:

  • 你能发布你的阅读PDF文件的代码吗?
  • 我的问题包含我正在使用的解决方案的链接,因此您可以从那里复制粘贴它

标签: java pdf pdfbox


【解决方案1】:

它会被除了剪辑路径之外的其他东西隐藏吗?

是的。如果是您的新文档,则文本以白底白字书写,例如在ASSETS 之后的387986 是这样绘制的:

1 1 1 rg
/TT0 16 Tf
-1011.938 115.993 Td
(@A,BAC)Tj 

初始的1 1 1 rg 将填充颜色设置为RGB WHITE。 (此外,该文本非常小,但如果以例如黑色绘制,仍然可见。)

您提到的solution 是针对该问题中提供的示例文档之类的文档实现的,其中 通过定义剪辑路径(在文本所在的范围之外)和填充使不可见文本变得不可见路径(隐藏下面的文本)。因此,您的白色文本不会被它识别为隐藏。

不幸的是,在 WHITE 文本上识别 WHITE 的不可见性比被剪切或覆盖的文本更难确定,因为人们不仅需要知道当前图形状态的 a 属性(如剪切路径)或删除 a 内的所有文本给定路径,还需要在绘制文本之前知道页面部分的颜色(以检查 on WHITE 详细信息)。

另一方面,如果您假设页面背景本质上是白色,则忽略所有白色文本相当简单:只需在processTextPosition 中检测当前填充颜色:

PDColor fillColor = gs.getNonStrokingColor();

并将其与您想视为不可见的 WHITE 风味进行比较。 (通常与 RGB、CMYK 和灰度白色进行比较就足够了;在极少数情况下,您还必须正确解释更复杂的色彩空间。此外,您可能还认为几乎白色是不可见的,(.99、.99、. 99) RGB 几乎无法与 WHITE 区分开来。)

如果您发现当前颜色为白色,请忽略当前的TextPosition

但请注意,就像您引用的解决方案一样,这还不是识别所有白色文本的最终解决方案:为此,您还必须检查文本呈现模式:如果它只是 填充 em> (默认值),上述情况成立,但如果它是(也)stroking,你将(也)必须考虑描边颜色;如果呈现不可见,则无需考虑颜色;并且如果文本渲染模式包括添加到路径以进行剪切,则您必须等待并确定稍后将在页面的这一部分中绘制的内容,只要剪切路径保持不变,这绝对不是微不足道的!

【讨论】:

  • 非常感谢您如此深入的解释。绝对是这样。想一想,我需要将所有这些“Stroke”运算符添加到我的自定义文本剥离器(addOperator(new SetStrokingColor()) 等)以处理颜色指令。
  • 确实,文本剥离器只注册了简单文本提取所需的运算符侦听器。
最近更新 更多