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

为什么itext5生成的文本无法通过Acrobat Reader看到?,itext,Itext,我有一个小的PDF文档,它是从一个较大的PDF文档中裁剪出来的。我惊讶地发现itext5(使用自定义位置策略)仍然在重新生成裁剪后遗漏的所有文本。此文本在Acrobat reader中均不可见 如何让itext 5检测并忽略这些隐藏的文本? 编辑1-超链接了错误的文档 编辑2-附加代码段 public class MyLocationTextExtractionStrategy : LocationTextExtractionStrategy { public void RenderTe

我有一个小的PDF文档,它是从一个较大的PDF文档中裁剪出来的。我惊讶地发现itext5(使用自定义位置策略)仍然在重新生成裁剪后遗漏的所有文本。此文本在Acrobat reader中均不可见

如何让itext 5检测并忽略这些隐藏的文本?

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

编辑2-附加代码段

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

来自

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

以及您的代码片段的

公共类MyLocationTextExtractionStrategy:LocationTextExtractionStrategy
{
公共void RenderText(TextRenderInfo renderInfo)
{
string text=renderInfo.GetText();
}
}
我假设您确实感到惊讶的是,在
MyLocationTextExtractionsStrategy
RenderText
方法中,您为裁剪框之外的文本检索
TextRenderInfo
对象

但这是自然而然的!您的
RenderText
方法实现了
IRenderListener
接口的该方法,并且该接口的方法将为页面内容中的每个匹配绘图指令调用,无论其结果最终是否可见

如何让itext 5检测并忽略这些隐藏的文本

通过对照当前文档页面的裁剪框坐标检查文本坐标,可以很容易地检测和忽略裁剪框外的文本

iText实际上包含一个过滤器体系结构,它允许排除文本块以达到不满足某些标准的策略

例如,如果您目前使用这样的策略:

MyLocationTextExtractionStrategy策略=新建MyLocationTextExtractionStrategy();
GetTextFromPage(pdfReader,1,策略);
可以像下面这样应用裁剪框区域过滤器:

MyLocationTextExtractionStrategy策略=新建MyLocationTextExtractionStrategy();
FilteredTextEnderListener strategyWithFilter=新的FilteredTextEnderListener(策略,
新的RegionExtranderFilter(pdfReader.GetCropBox(1));
GetTextFromPage(pdfReader,1,strategyWithFilter);

旁白:

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

  • 除超出裁剪框边框外,文本可能因多种原因而不可见,例如:

    • 它可以用与背景相同的颜色绘制,例如白色对白色
    • 某些设置或操作可能会将文本颜色和背景颜色转换为 相同的颜色,即使它们原本可能不同
    • 可以使用文本呈现模式,该模式不绘制任何东西
    • 用于文本的字体字形可能不可见
    • 文本可能被一些图像覆盖
    文本提取将提取所有那些“不可见”的文本片段

    (在某种程度上,您可以扩展文本提取框架来认识到这一点,您可以在stack overflow上找到许多关于此类扩展的问题和答案,但总会有一些您没有涉及的情况。)

  • 此外,文本可能仅部分涵盖。例如,考虑字母R’和覆盖R’右腿的一些白色矩形,使其看起来像‘P’< /P >。 文本提取将返回“R”,即使Adobe Reader显示您识别为“p”的内容

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

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

  • PDF中的文本可能不是使用文本绘制说明绘制的,而是使用矢量图形(如任意形式)绘制的

    文本提取根本不会提取这样的“文本”


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

您所说的“重新生成”是什么意思?即使您在Adobe Acrobat中打开文档,文本仍然存在(不再有Acrobat Reader这类东西)。只要让Acrobat显示隐藏的文本,文本就会重新出现。注意:此功能在Adobe Reader中不可用。既然你说的是Acrobat Reader;很难知道您所说的是Adobe Acrobat还是Adobe Reader。如果要提取某个矩形(如裁剪框)内的文本,需要将iText检查的位置限制在该矩形内。这取决于您使用的iText 5的版本是否可能。我很确定iText7支持它。在任何情况下:您没有显示任何代码,因此我们无法检查用于提取文本的
策略。实际上,
GetPageSize()
方法返回
/MediaBox
,但我没有告诉您查看
/MediaBox
。我告诉过你看看
/CropBox
@BrunoLowagie“现在已经没有Acrobat Reader了”——不幸的是,Adobe在命名策略上前后摇摆。最早的阅读器版本被称为“AdobeAcrobatReader”,后来很多版本都是“AdobeReader”,现在又是“AdobeAcrobatReader”。谢谢。我已经接受了你的回答。最后一个问题。在您的代码片段中,
pdfReader.GetCropBox(1)
,您是如何得出参数1的。是否可以有超过1个裁剪框?@Sau每页c