最近,我们的项目升级到了新的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重叠,这给我一个错误。
感谢您的帮助
答案 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();
希望这会帮助与我有类似问题的人:)
谢谢:)