0

在我的 c# 代码中,我从 pdf 中提取文本,我有两种方法可以做到这一点。但是,一种方法适用于一种类型的 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)) + " ";

方法二

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

有没有办法结合这两个功能,所以它总是有效的?

4

1 回答 1

4

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

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

此外,它假定一些类似 Latin1 的字符编码。这通常是欧洲语言文本的情况(只是经常!)但在许多亚洲语言的情况下,这几乎不会产生合理的结果。

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

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

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

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

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

引用的答案表明如何调整这些启发式方法,并且该问题的原始发布者相应地找到了成功解析他的 PDF 的良好解决方案。

如果您想要最终解决您的问题,您最好提供您观察到该问题的示例 PDF。

于 2012-12-21T00:17:17.110 回答