为什么itext5会生成通过Acrobat Reader无法看到的文本?

时间:2018-05-14 12:28:56

标签: itext

我有一个小的PDF文档,它是来自较大的PDF文档的裁剪版本。我很惊讶地发现itext5(使用自定义位置策略)仍在重新生成裁剪后遗漏的所有文本。通过Acrobat阅读器无法看到此文本。

我怎样才能使itext 5检测并忽略这些隐藏的文本? Link to PDF with hidden text

编辑1 - 错误的文档被超链接

编辑2 - 附加了代码段

public class MyLocationTextExtractionStrategy : 
LocationTextExtractionStrategy
{
  public void RenderText(TextRenderInfo renderInfo)
  {
   string text = renderInfo.GetText();
  }
}

感谢, SAURABH

1 个答案:

答案 0 :(得分:0)

来自

的组合
  

我很惊讶地发现itext5(使用自定义位置策略)仍在重新生成裁剪后遗漏的所有文本。

和您的代码段

public class MyLocationTextExtractionStrategy : LocationTextExtractionStrategy
{
  public void RenderText(TextRenderInfo renderInfo)
  {
   string text = renderInfo.GetText();
  }
}

我认为您实际上感到惊讶的是,在您RenderText的{​​{1}}方法中,您为裁剪框之外的文本检索了MyLocationTextExtractionStrategy个对象。

但这恰恰是自然而然的!您的TextRenderInfo方法实现了RenderText接口的方法,并且为页面内容中的每个匹配绘图指令调用此接口的方法,无论它们的结果最终是否可见。 / p>

  

我怎样才能使itext 5检测并忽略这些隐藏文本?

通过检查当前文档页面裁剪框坐标的文本坐标,可以非常轻松地检测和忽略裁剪框外的文本。

iText实际上包含一个过滤器架构,允许排除文本块以达到不符合某些标准的策略。

如果你是目前使用您的策略:

IRenderListener

您可以像这样应用裁剪框区域过滤器:

MyLocationTextExtractionStrategy strategy = new MyLocationTextExtractionStrategy();
PdfTextExtractor.GetTextFromPage(pdfReader, 1, strategy);

暂且不说:

  

我想要文档中的所有可见文本。当我说可见时,我指的是通过Adobe Acrobat Reader DC可见的文本。我不想将文本限制在任何特定区域。只是所有可见的文字。

  • 除了超出裁剪框边界之外,文字可以出于多种原因而不可见,例如。

    • 它可以用与背景相同的颜色绘制,例如白色的白色,
    • 某些设置或操作可能会将文本颜色和背景颜色转换为 相同的颜色,即使它们最初可能不同,
    • 可以使用不会开始绘制任何内容的文本呈现模式,
    • 用于文本的字体的字形可能是不可见的
    • 文字可能会被某些图片覆盖,
    • ...

    文本提取将提取所有那些"隐形"文字片段。

    (在某一点上,您可以扩展文本提取框架以识别这一点,您可以在堆栈溢出时找到关于此类扩展的许多问题和答案,但总会出现一些您未涵盖的案例。 )

  • 此外,文字可能仅部分涵盖。例如。考虑一下这封信的情况' R'还有一些白色的长方形覆盖着' R'使它看起来像' P'

    文本提取将返回' R'即使Adobe Reader显示您认可为“P'。

  • 的内容
  • 字体可能包含一个字形对应的Unicode字符的不完整或完全错误的信息。

    文本提取将使用这样的字体返回错误的文本输出,或者可能根本没有输出。

  • PDF中的文字可能无法使用文字绘图说明绘制,而是使用任意形式的矢量图形。

    文本提取无法提取此类"文本"完全没有。

  • ...

如果这些问题对您来说是一个阻碍,那么文本提取对您来说是错误的技术,您应该使用OCR。