最近我们的项目升级到了新的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 版本中。
因此
最近我们的项目升级到新的iTextSharp.LGPLv2.Core v1.6.5
如果您真的升级了,那么您以前的版本似乎附带了一个向后移植(从版本 5.x(或交叉移植(从版本 5 之前的 iText/Java(解析器命名空间。不过,更有可能的是,您实际上从iTextSharp 5.x降级到基于iTextSharp 4.2或更早版本的分叉,并且在降级时通常会丢失功能。
我假设您使用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();
希望这将帮助比我有类似问题的人:)
谢谢大家:)