再次有来自PdfTextStripper的隐形文本

时间:2018-02-16 14:04:06

标签: java pdf pdfbox

文件示例:file

问题 - 使用PdfTextStripper提取文本时,有令牌" 9/1 2017"和" 387986"之后"资产"在页面开始应删除,其他一些隐藏令牌。

我已经应用了this解决方案(因此我不会将其复制粘贴到此处,因为实际上问题完全相同)并且仍然隐藏文本出现在页面上。它可以被剪辑路径以外的其他东西隐藏吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

  

它可以被剪辑路径以外的其他东西隐藏吗?

是。如果是新文档,则文本以白色白色书写,例如387986之后的ASSETS就像这样绘制:

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

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

您引用的solution是针对文档实现的,例如该问题中提供的示例文档,其中通过定义剪辑路径(在文本的边界之外)使隐形文本不可见,并且通过填充路径(隐藏下面的文本)。因此,您的白色文本将不会被隐藏。

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

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

PDColor fillColor = gs.getNonStrokingColor();

并将其与您想要隐身的WHITE风格进行比较。 (通常它应该足以与RGB,CMYK和灰度WHITE进行比较;在很少的情况下,你还必须正确地解释更复杂的颜色空间。此外,你也可以考虑几乎看不见的WHITE颜色,(。99,.99 ,. 99)RGB很难与WHITE区分开来。)

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

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