我有一个小的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
答案 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。