如何使用 iTextSharp 4.1.6 提取文本?

Posted

技术标签:

【中文标题】如何使用 iTextSharp 4.1.6 提取文本?【英文标题】:How to extract text with iTextSharp 4.1.6? 【发布时间】:2012-04-25 22:50:08 【问题描述】:

iTextSharp 4.1.6 是最后一个获得 LGPL 许可的版本,可免费用于商业用途,无需支付许可费。

对于某些人和我来说,如何使用此版本提取文本可能会很有趣。

有人有想法吗?

【问题讨论】:

示例见以下链接:***.com/questions/2550796/… @Hans,该解决方案是否适用于 4.1.6?我不知道 ITextExtractionStrategy、SimpleTextExtractionStrategy 和 PdfTextExtractor。 我尝试使用 codeproject.com/Articles/14170/… 的代码。我发现它只适用于某些 PDF;当使用单字符参数调用它时,它会在 CheckToken 中抛出 IndexOutOfRangeExceptions(就像该示例一样)。 您找到解决方案了吗? @SpoiledTechie.com 不,没有尝试修复它。我刚刚使用了另一种解决方案。 【参考方案1】:

我不得不手动破解这个,因为我和你在同一条船上。希望这会有所帮助。它可能并不完美,但我能够通过这种方式从文档中获取我需要的文本。 fileName 是 PDF 文件的字符串变量/参数。

var reader = new PdfReader(fileName);

StringBuilder sb = new StringBuilder();

try

    for (int page = 1; page <= reader.NumberOfPages; page++)
    
        var cpage = reader.GetPageN(page);
        var content = cpage.Get(PdfName.CONTENTS);

        var ir = (PRIndirectReference)content;

        var value = reader.GetPdfObject(ir.Number);

        if (value.IsStream())
        
            PRStream stream = (PRStream)value;

            var streamBytes = PdfReader.GetStreamBytes(stream);

            var tokenizer = new PRTokeniser(new RandomAccessFileOrArray(streamBytes));

            try
            
                while (tokenizer.NextToken())
                
                    if (tokenizer.TokenType == PRTokeniser.TK_STRING)
                    
                        string str = tokenizer.StringValue;
                        sb.Append(str);
                    
                
            
            finally
            
                tokenizer.Close();
            
        
    

finally

    reader.Close();


return sb.ToString();

【讨论】:

这是人们经常看到的穷人文本提取解决方案之一。实际上,iText 2.1.7/4.2.0 中的文本提取功能比这要先进得多(尽管有相当多的缺陷)。在许可证更改之前,它们很可能也出现在最新的 iTextSharp 中。试试看! @mkl -- 在该版本的 iTextSharp 中没有 PdfTextExtractor,至少在 iTextSharp-LGPL NuGet 包中没有。这是我能找到的唯一方法。如果您知道实际上在 DLL 中的更好方法,我将不胜感激! 我还发现“内容”不是 PRIndirectReference 而是 PRIndirectReferences 的 PdfArray 的情况,因此也必须相应地处理这种情况。 你是对的,我假设在许可证更改之前 Java 版本的文本提取功能已移植到 iTextSharp 是错误的。因此,我想不出自己将解析器类从 Java iText 4.2.0 移植到 C# 的方法。我不知道这有多容易或多难。或者,当然,一旦 AGPL 或商业许可成为您的选择,您可以尝试切换到当前版本的 iTextSharp。

以上是关于如何使用 iTextSharp 4.1.6 提取文本?的主要内容,如果未能解决你的问题,请参考以下文章

使用itextsharp从pdf中提取文本返回空字符串

ITextSharp:提取没有小空格的文本

从矩形中提取文本时的 ItextSharp anagram 输出

使用 itextsharp 在现有 pdf 中插入文本

iTextsharp PDF 文档属性

使用 itextsharp 将图像 html 旁边的文本放置到 pdf