哪种文本提取策略正确?

时间:2012-12-20 17:50:59

标签: c# pdf itextsharp

在我的c#代码中,我从pdf中提取文本,我有两种方法可以实现。但是,1种方法适用于1种类型的pdf文档,而另一种方法适用于其他类型的pdf文档。

当方法1失败时,我得到文本但没有任何空格,当方法2失败时,我只得到\ r \ n。

方法1(来自http://www.codeproject.com/Articles/14170/Extract-Text-from-PDF-in-C-100-NET的课程)

PDFParser pdf_parser = new PDFParser();
currentText = pdf_parser.ExtractTextFromPDFBytes(pdfReader.GetPageContent(page)) + " ";

方法2

StringWriter output = new StringWriter();
for (int i = 1; i <= reader.NumberOfPages; i++)
    output.WriteLine(PdfTextExtractor.GetTextFromPage(reader, i, new SimpleTextExtractionStrategy()));
currentText = output.ToString();

有没有办法将这两种功能结合起来,以便始终有效?

1 个答案:

答案 0 :(得分:4)

关于方法1 :该代码项目文章中的PdfParser仅适用于特殊情况。

它假定所有文本内容都包含在直接页面内容流中。实际上,这些流可能包括对本身包含文本的资源的引用。对于n-up文档通常就是这种情况,但它可能发生在任何文档中。

此外,它假设一些类似Latin1的字符编码。欧洲语言中的文本通常都是这种情况(通常只是!)但是在许多亚洲语言的情况下,这几乎不会产生任何明智的结果。

此外,它将所有字距调整间隙解释为空格字符。

关于方法2 :正如对您之前的问题How to extract text from a PDF and decode characters?的评论中所述,您可能希望看一下类似问题的this answer

基本上,这样的空格字符丢失的原因是您在渲染的PDF中看到的空间不一定对应于PDF的页面内容描述中的空格字符。相反,您经常在PDF中找到一个操作,在渲染一个单词后,将当前位置稍微向右移动,然后再渲染下一个单词。

不幸的是,同样的机制也用于增强相邻字形的外观:在某些字母组合中,为了获得良好的外观和阅读体验,字形应该彼此相邻或彼此更远地打印,而不是默认情况下。这是使用与上面相同的操作在PDF中完成的。

因此,在这种情况下,PDF解析器必须使用启发式方法来确定这种转换是否意味着暗示空间角色,或者它是否仅仅意味着使字母组看起来很好。启发式算法可能会失败。

引用的答案表明如何调整这些启发式方法,因此问题的原始海报找到了成功解析PDF的良好解决方案。

如果您需要一些最终解决方案来解决您的问题,那么您最好提供一个示例PDF,其中您发现了该问题。