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

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

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

有人有想法吗?

【问题讨论】:

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

标签: c# itextsharp text-extraction


【解决方案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。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-06
  • 2011-10-16
  • 2014-08-11
  • 2014-12-26
相关资源
最近更新 更多