c# - 在 .NET 中从 PDF 中读取文本

标签 c# .net 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);

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

最佳答案

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

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

SimpleTextExtractionStrategy.RenderText() 中:

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

您可以扩展 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;
}

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

关于c# - 在 .NET 中从 PDF 中读取文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20523524/

相关文章:

c# - 如何在单元测试中等待后使用断点?

c# - 在 ajax 成功中使用模型数据

javascript - 打印前验证 PDF 表单字段

c# - 从 C# 启动 sqlcmd 时如何检索错误?

c# - 删除单个集合中的重复项 C#

c# - 在循环中添加 1 秒的延迟?

pdf - 如何以编程方式将包含文本的 SVG 文件转换为 PDF 文件(特别是在 CentOS 5.3 x86_64 上)?

c# - 使用绑定(bind)将椭圆与线连接起来

.net - 列出方法可能抛出的所有异常

java - iText 中的图像定位 - Java