iTextSharp.LGPLv2.Core 将 PDF 中的文本转换为字符串

iTextSharp.LGPLv2.Core get text from PDF into a string

最近我们的项目升级到新的 iTextSharp。LGPLv2.Core v1.6.5。我有一个方法可以从 PDF 文件中提取文本。

当时我用这个:

        if (File.Exists(pdf1Path))
        {
            var pdfReader = new PdfReader(pdf1Path);
            string pdfText;
            string currentText;

            //Text extracting to List
            for (int i = 1; i <= pdfReader.NumberOfPages; i++)
            {
                currentText = PdfTextExtractor.GetTextFromPage(pdfReader, i);
                currentText =
                    Encoding.UTF8.GetString(ASCIIEncoding.Convert(Encoding.Default, Encoding.UTF8,
                        Encoding.Default.GetBytes(currentText)));
                text.Append(currentText);
            }

            pdfText = text.ToString();
         }

现在突然认不出"PdfTextExtractor"。关于如何让它工作还有其他选择吗?请注意,我不允许安装任何其他库或包。

我尝试使用

using iTextSharp.text.pdf.parser;

但它不再被识别。当我尝试下载它时,它与 iTextSharp 重叠。LGPLv2.Core 这给了我一个错误。

感谢您的帮助

IIRC(如果我正确阅读了 git 历史记录),命名空间 iTextSharp.text.pdf.parser 是在 iTextSharp 5.0.2 中引入的,即它从来不是 LGPL 许可的 iTextSharp 版本的一部分。

(iText/Java 版本的情况略有不同,这里的第一个概念验证已经存在于最新的 LGPL 版本中。)

因此,

recently our project upgraded to a new iTextSharp.LGPLv2.Core v1.6.5

如果你真的升级了,那么你以前的版本似乎伴随着向后移植(来自版本5.x)或交叉移植(来自[=34] =] 在版本 5) 之前的解析器名称空间中。不过,更有可能的是,您实际上 downgraded 从 iTextSharp 5.x 到基于 iTextSharp 4.2 或更早版本的分支,并且在 downgrading 你通常会失去功能。

我假设您使用 iTextSharp。LGPLv2.Core 使用 LGPL 而不是在 iTextSharp 5 中选择 AGPL 和商业许可,或者您为 Core 支持

如果真的是关于许可证的问题,你只能尝试在最后一个 LGPL 版本 (2.1.7) 或标签 (4.2.0) 中移植 iText/Java 解析器包,或者你可以重新完全独立实现文本提取。

如果它是关于核心支持并且您准备购买许可证或受 AGPL 约束,您还可以尝试向后移植最新的 iText 5.x 解析器名称空间。这应该比从 Java 交叉移植更容易,并且此文本提取代码比版本 5 之前的 iText/Java 代码高级得多。

经过一段时间的挖掘,我发现这个问题是有解决办法的。由于不允许我使用 PdfTextExtractor,因此我使用了与上述方法几乎相同的代码

        var reader = new PdfReader();
        var pdfFile = createSamplePdfFile();
        var reader = new PdfReader(pdfFile);

        var streamBytes = reader.GetPageContent(1);
        var tokenizer = new PrTokeniser(new RandomAccessFileOrArray(streamBytes));

        var stringsList = new List<string>();
        while (tokenizer.NextToken())
        {
            if (tokenizer.TokenType == PrTokeniser.TK_STRING)
            {
                stringsList.Add(tokenizer.StringValue);
            }
        }

        reader.Close();

希望这能帮助遇到与我类似问题的人:)

谢谢大家:)