哪种文本提取策略正确?

在我的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(); 

有没有办法结合这两个function,所以它始终有效?

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

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

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

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

关于方法2 :正如您对前一个问题的评论中提到的如何从PDF中提取文本并解码字符? 你可能想看看这个类似问题的答案 。

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

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

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

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

如果您想要解决问题的最终解决方案 ,那么您最好提供样本PDF,您可以在其中发现该问题。