在 .NET 中读取 PDF 中的文本

2023-11-23

我正在尝试使用 iTextSharp 库将 PDF 中的文本读取为字符串。

iTextSharp.text.pdf.PdfReader pdfReader = new iTextSharp.text.pdf.PdfReader(@"C:\mypdf.pdf");
ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
string currentText = PdfTextExtractor.GetTextFromPage(pdfReader, 1, strategy);
text = Encoding.UTF8.GetString(ASCIIEncoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(currentText))); 
pdfReader.Close();
Console.WriteLine(text);

这通常工作正常,但每隔几行就会省略空格,留下类似以下的输出:“thisismyoutputwithoutwhitespace”。正确解析的文本看起来与未正确解析的文本相同;相同的文本始终会被错误地解析,这让我认为这是 PDF 中的内容。


在 PDF 的内容流中,没有“单词”的概念。因此,在 iText(Sharp) 的文本提取实现中,有一些启发式方法来确定如何将字符分组为单词。当两个字符之间的距离大于当前字体中空格宽度的一半时,将插入空格。

最有可能的是,提取的没有空格的文本的单词之间的距离小于“spacewidth / 2”。

In SimpleTextExtractionStrategy.RenderText():

if (spacing > renderInfo.GetSingleSpaceWidth()/2f){
    AppendTextChunk(' ');
}

你可以延长SimpleTextExtractionStrategy并调整RenderText().

In LocationTextExtractionStrategy比较方便。你只需要覆盖IsChunkAtWordBoundary():

protected bool IsChunkAtWordBoundary(TextChunk chunk, TextChunk previousChunk) {
    float dist = chunk.DistanceFromEndOf(previousChunk);
    if(dist < -chunk.CharSpaceWidth || dist > chunk.CharSpaceWidth / 2.0f)
        return true;

     return false;
}

您必须进行一些试验才能获得良好的 PDF 效果。 “spacewidth / 2”在你的情况下显然太大了。但如果将其调整得太小,则会出现误报:单词中将插入空格。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 .NET 中读取 PDF 中的文本 的相关文章

随机推荐