如何在ASP.NET C#中检测上传PDF文件是否存在指定文本
在ASP.NET C#中正确读取PDF文本并判断是否包含指定内容
直接用StreamReader读取PDF文件会出现乱码,原因是PDF不是纯文本格式——它是包含字体、布局、二进制结构的复合文档,强行按UTF-8文本流解析必然导致乱码。
要正确读取PDF中的文本并判断是否包含指定内容,需要使用专门的PDF处理库,以下是两种常用方案:
方案1:使用iTextSharp(适用于.NET Framework)
- 先通过NuGet安装iTextSharp包:
Install-Package iTextSharp - 读取PDF文本并判断的代码示例:
using iTextSharp.text.pdf; using iTextSharp.text.pdf.parser; // 获取上传文件的字节数组 byte[] pdfBytes = this.docUploadField.FileBytes; string targetText = "需要查找的目标文本"; bool hasTargetText = false; using (MemoryStream ms = new MemoryStream(pdfBytes)) { using (PdfReader reader = new PdfReader(ms)) { // 遍历PDF的每一页 for (int pageNum = 1; pageNum <= reader.NumberOfPages; pageNum++) { // 提取当前页的文本内容 string pageContent = PdfTextExtractor.GetTextFromPage(reader, pageNum); // 判断是否包含目标文本(可添加StringComparison参数忽略大小写) if (pageContent.Contains(targetText, StringComparison.OrdinalIgnoreCase)) { hasTargetText = true; break; // 找到后直接退出循环,提升效率 } } } } // 根据结果执行后续逻辑 if (hasTargetText) { // PDF中存在目标文本 } else { // PDF中不存在目标文本 }
方案2:使用iText7(适用于.NET Core/.NET 5+)
- 通过NuGet安装iText7包:
Install-Package itext7 - 对应代码示例:
using iText.Kernel.Pdf; using iText.Kernel.Pdf.Canvas.Parser; using iText.Kernel.Pdf.Canvas.Parser.Listener; byte[] pdfBytes = this.docUploadField.FileBytes; string targetText = "需要查找的目标文本"; bool hasTargetText = false; using (MemoryStream ms = new MemoryStream(pdfBytes)) { using (PdfDocument pdfDoc = new PdfDocument(new PdfReader(ms))) { for (int pageNum = 1; pageNum <= pdfDoc.GetNumberOfPages(); pageNum++) { // 创建文本提取策略 ITextExtractionStrategy extractionStrategy = new SimpleTextExtractionStrategy(); // 提取当前页文本 string pageContent = PdfTextExtractor.GetTextFromPage(pdfDoc.GetPage(pageNum), extractionStrategy); if (pageContent.Contains(targetText, StringComparison.OrdinalIgnoreCase)) { hasTargetText = true; break; } } } } // 后续逻辑处理
注意事项
- 如果PDF是扫描生成的图片型PDF,上述方法无法提取文本,需要结合OCR工具(如Tesseract)先识别图片中的文本,再进行判断。
- 部分PDF的文本可能存在换行、空格或特殊格式,判断时可根据实际情况对提取的文本做预处理(如去除多余空格、换行符)。
内容的提问来源于stack exchange,提问作者learner18
相关产品推荐
相关产品推荐

