如何使用 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 提取文本?的主要内容,如果未能解决你的问题,请参考以下文章