You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

.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

火山引擎 最新活动