为什么itext5生成的文本无法通过Acrobat Reader看到?
我有一个小的PDF文档,它是从一个较大的PDF文档中裁剪出来的。我惊讶地发现itext5(使用自定义位置策略)仍然在重新生成裁剪后遗漏的所有文本。此文本在Acrobat reader中均不可见 如何让itext 5检测并忽略这些隐藏的文本? 编辑1-超链接了错误的文档 编辑2-附加代码段为什么itext5生成的文本无法通过Acrobat Reader看到?,itext,Itext,我有一个小的PDF文档,它是从一个较大的PDF文档中裁剪出来的。我惊讶地发现itext5(使用自定义位置策略)仍然在重新生成裁剪后遗漏的所有文本。此文本在Acrobat reader中均不可见 如何让itext 5检测并忽略这些隐藏的文本? 编辑1-超链接了错误的文档 编辑2-附加代码段 public class MyLocationTextExtractionStrategy : LocationTextExtractionStrategy { public void RenderTe
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可见的文本。我不想将文本限制在任何特定区域。只是所有可见的文本
- 除超出裁剪框边框外,文本可能因多种原因而不可见,例如:
- 它可以用与背景相同的颜色绘制,例如白色对白色
- 某些设置或操作可能会将文本颜色和背景颜色转换为 相同的颜色,即使它们原本可能不同
- 可以使用文本呈现模式,该模式不绘制任何东西
- 用于文本的字体字形可能不可见
- 文本可能被一些图像覆盖
- 此外,文本可能仅部分涵盖。例如,考虑字母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