首页 > 解决方案 > 使用任何开源/非许可包从 .NET Core 上的 PDF 读取文本

问题描述

我需要阅读PDF并将其转换为.Txt。我尝试iTextSharp作为免费库,它工作正常,但与 .NET Core 不兼容。

iTextSharp 中的代码片段

string prevPage = "";
for (int page = 5; page <= reader.NumberOfPages; page++)
{
  ITextExtractionStrategy its = new SimpleTextExtractionStrategy();
  var s = PdfTextExtractor.GetTextFromPage(reader, page, its);
  if (prevPage != s) sb.Append(s);
  prevPage = s;
}
reader.Close();

另外,我试过iTextSharp.LGPLv2.Core了,但效果不如另一个,结果也不准确。

缺点之一iTextSharp.LGPLv2.Core是它不支持编码并导致PDF 的提取文本中出现噪音

我的字符串生成器如下图所示:

在此处输入图像描述

标签: c#pdf.net-core

解决方案


方法:PDFPig (Apache:2.0 License)

安装 Nuget 包PdfPig

在 .Net Core 3.1 上测试

using (var stream = File.OpenRead(pdfPath1))
using (UglyToad.PdfPig.PdfDocument document = UglyToad.PdfPig.PdfDocument.Open(stream))
{
    var page = document.GetPage(2);
    return string.Join(" ", page.GetWords());
}

方法:iTextSharp.LGPLv2.Core(GNU通用公共许可证)

安装 Nuget iTextSharp.LGPLv2.Core

它是 iTextSharp (V4.1.6) 的最后一个 LGPL 版本到 .NET Core 的非官方端口。

在 .Net Core 3.1 上测试

var reader = new PdfReader(pdfPath1);
var streamBytes = reader.GetPageContent(1);
var tokenizer = new PrTokeniser(new RandomAccessFileOrArray(streamBytes));
var sb = new StringBuilder();
while (tokenizer.NextToken())
{
    if (tokenizer.TokenType == PrTokeniser.TK_STRING)
    {
         var currentText = tokenizer.StringValue;
         currentText = Encoding.UTF8.GetString(ASCIIEncoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(currentText)));
         sb.Append(tokenizer.StringValue);
    }
}

Console.WriteLine("Extracted text "+sb);

方法:GrapeCity.Documents.PDF(许可)

Install Nuget-Package *GrapeCity.Documents.Pdf
Is 跨平台库允许创建、修改和分析 PDF 文档

在 .Net Core 3.1 上测试

    var doc = new GcPdfDocument();
    FileStream fs = new FileStream(pdfPath1, FileMode.Open, FileAccess.ReadWrite);
    doc.Load(fs);
    //To extract Page 1
    var tmap_page2 = doc.Pages[0].GetTextMap();
    tmap_page2.GetFragment(out TextMapFragment newFragment, out string Extractedtext);

    Console.WriteLine("Extracted Text: \n\n" +Extractedtext);

推荐阅读