.NET Core下使用开源免费包读取PDF并转为TXT的方案咨询
我明白你现在卡在.NET Core环境下PDF转TXT的问题上了——原来的iTextSharp用得好好的,但不兼容.NET Core,换了社区移植的iTextSharp.LGPLv2.Core又掉链子,文本提取不准还满是噪音,确实头疼。下面给你两个靠谱的解决方案,都是适配.NET Core的成熟库:
解决方案:换用适配.NET Core的可靠PDF文本提取库
选项1:iText 7(官方正统,功能完善)
iText 7是iTextSharp的官方升级版本,完全兼容.NET Core/.NET 5+,不仅解决了旧版本的兼容性问题,在文本提取的准确性、编码支持上都有明显提升。
第一步:安装依赖包
通过NuGet安装以下两个包:
Install-Package iText.Kernel Install-Package iText.Layout
第二步:实现代码(保留你的去重逻辑+噪音优化)
这里参考你原来的代码逻辑,保留了跳过重复页面的功能,同时用更精准的文本提取策略,还加了噪音清理的辅助方法:
using iText.Kernel.Pdf; using iText.Layout; using iText.Layout.Text; using System.Text; using System.Text.RegularExpressions; var resultBuilder = new StringBuilder(); string previousPageText = ""; // 打开PDF文档(using自动释放资源,不用手动Close) using (var pdfDocument = new PdfDocument(new PdfReader("你的PDF文件路径.pdf"))) { var document = new Document(pdfDocument); // 从第5页开始读取,和你原来的逻辑一致 for (int pageNumber = 5; pageNumber <= pdfDocument.GetNumberOfPages(); pageNumber++) { // 使用LocationTextExtractionStrategy,比简单策略更精准,能保留文本的位置结构 var extractionStrategy = new LocationTextExtractionStrategy(); string currentPageText = PdfTextExtractor.GetTextFromPage(pdfDocument.GetPage(pageNumber), extractionStrategy); // 跳过重复页面 if (previousPageText != currentPageText) { // 清理文本噪音(可根据实际情况调整规则) currentPageText = CleanUpExtractedText(currentPageText); resultBuilder.Append(currentPageText); } previousPageText = currentPageText; } } // 保存为UTF-8编码的TXT文件 File.WriteAllText("输出的TXT文件路径.txt", resultBuilder.ToString(), Encoding.UTF8); // 辅助方法:清理提取文本中的噪音 string CleanUpExtractedText(string rawText) { // 去掉连续的多行空白 rawText = Regex.Replace(rawText, @"(\r\n|\n){2,}", Environment.NewLine); // 去掉文本首尾的空白字符 rawText = rawText.Trim(); // 如果还有其他特定噪音(比如乱码符号),可以在这里添加正则规则处理 return rawText; }
选项2:PdfPig(开源轻量,上手简单)
PdfPig是专门针对.NET平台的开源PDF处理库,API简洁直观,文本提取的稳定性也不错,适合快速实现需求。
第一步:安装依赖包
Install-Package PdfPig
第二步:实现代码
using UglyToad.PdfPig; using UglyToad.PdfPig.Content; using System.Text; using System.Text.RegularExpressions; var resultBuilder = new StringBuilder(); string previousPageText = ""; using (var pdfDocument = PdfDocument.Open("你的PDF文件路径.pdf")) { // 从第5页开始读取,PdfPig的页码也是从1开始计数 for (int pageNumber = 5; pageNumber <= pdfDocument.NumberOfPages; pageNumber++) { Page currentPage = pdfDocument.GetPage(pageNumber); string currentPageText = currentPage.Text; if (previousPageText != currentPageText) { currentPageText = CleanUpExtractedText(currentPageText); resultBuilder.Append(currentPageText); } previousPageText = currentPageText; } } File.WriteAllText("输出的TXT文件路径.txt", resultBuilder.ToString(), Encoding.UTF8); // 复用上面的CleanUpExtractedText方法清理噪音 string CleanUpExtractedText(string rawText) { rawText = Regex.Replace(rawText, @"(\r\n|\n){2,}", Environment.NewLine); rawText = rawText.Trim(); return rawText; }
关于iTextSharp.LGPLv2.Core的小说明
这个库是社区基于旧版iTextSharp移植的,本身存在不少功能缺失和兼容性问题,尤其是文本提取的核心逻辑没有适配.NET Core的环境,出现噪音和提取不准是大概率事件,建议直接替换成上面的成熟库。
内容的提问来源于stack exchange,提问作者Rob None




