在.NET中从PDF中读取文本

Joh*_*ith 5 .net c# pdf itext

我正在尝试使用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);
Run Code Online (Sandbox Code Playgroud)

这通常可以正常工作,但是每隔几行就会省略空格,这样我的输出就像:"thisismyoutputwithoutwhitespace".正确解析的文本似乎与没有正确解析的文本相同; 相同的文本将被不正确地解析,这使我认为它是PDF中的东西.

rhe*_*ens 7

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

最有可能的是,在没有空格的情况下提取的文本之间的距离小于"spacewidth/2".

SimpleTextExtractionStrategy.RenderText():

if (spacing > renderInfo.GetSingleSpaceWidth()/2f){
    AppendTextChunk(' ');
}
Run Code Online (Sandbox Code Playgroud)

你可以扩展SimpleTextExtractionStrategy和调整RenderText().

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;
}
Run Code Online (Sandbox Code Playgroud)

您将需要进行一些实验以获得PDF的良好结果.在你的情况下,"spacewidth/2"显然太大了.但是如果你将它调整得太小,你就会得到误报:空格将被插入到单词中.