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

时间:2020-06-18 11:55:42

标签: c# .net pdf itext pdftotext

最近,我们的项目升级到了新的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重叠,这给我一个错误。

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

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

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

因此

最近我们的项目升级到了新的iTextSharp.LGPLv2.Core v1.6.5

如果您确实已升级,则您的先前版本似乎已在其中反向移植(从5.x版本开始)或交叉移植(从iText / Java 5之前版本)解析器命名空间中。它。但是,更有可能的是,您实际上从iTextSharp 5.x 降级到基于iTextSharp 4.2或更早版本的fork,并且在降级中通常会丢失功能。 / p>

我假设您使用iTextSharp.LGPLv2.Core来利用LGPL,而不是在iTextSharp 5中在AGPL和商业许可之间进行选择,或者您这样做是为了获得 Core 支持。

如果真的与许可证有关,则您只能尝试并移植上一个LGPL版本(2.1.7)或标签(4.2.0)中的iText / Java解析器包,或者可以完全重新实现文本提取独立地。

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

答案 1 :(得分:0)

经过一段时间的挖掘,我发现可以解决此问题。由于不允许使用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();

希望这会帮助与我有类似问题的人:)

谢谢:)