首页 > 其他分享 >上传文件附件时判断word、excel、txt等是否含有敏感词如身份证号,手机号等

上传文件附件时判断word、excel、txt等是否含有敏感词如身份证号,手机号等

时间:2024-03-12 11:12:11浏览次数:22  
标签:word string 词如 text excel doc new using Spire

上传附件判断word、excel、txt等文档中是否含有敏感词如身份证号,手机号等,其它检测如PDF,图片(OCR)等可以自行扩展。

互联网项目中,展示的数据中不能包含个人信息等敏感信息。判断word中是否包含手机号,word正文中是否包含身份证号等敏感信息,通过正则表达式判断匹配手机号,身份证号,以下做为参考。会出现碰撞错误,碰撞不准确等情况,不在本文范围。

开发语言C#,框架asp.net webform。由于传文件是做的判断,所以这里是判断数据流HttpPostedFile postedFile中的内容。通过load本地文件,本文不做过多介绍。

一、word校验身份证号,手机号

获取word中内容最初用的是npoi插件,office的插件导入导出以前用的比较多,npoi只获取docx文档文本,npoi获取doc后缀有问题,又找的Spire.Doc。可以都使用后者,笔者只简单测试了doc后缀,其它复杂情况没具体测试。有时间的推荐Spire,因为附件中pdf也是一个大项,刚好有对应的using Spire.Pdf;

using NPOI.XWPF.UserModel;
using Spire.Doc;
using Spire.Doc.Documents;

 public class WordToTextConvert
 {
     /// <summary>
     /// docx提取成纯文本
     /// </summary>
     /// <param name="file"></param>
     /// <returns></returns>
     public static string ExtractTextFromWord(Stream wordFileStream,string fileExt)
     {
         using (wordFileStream)
         {
             XWPFDocument doc = new XWPFDocument(wordFileStream);

             using (StringWriter writer = new StringWriter())
             {
                 string text = "";
                 foreach (var para in doc.Paragraphs)
                 {
                     text += para.Text+" ";
                 }

                 foreach (XWPFTable table in doc.Tables)
                 {
                     foreach (XWPFTableRow row in table.Rows)
                     {
                         foreach (XWPFTableCell cell in row.GetTableCells())
                         {
                             text += cell.GetText() + " ";
                         }
                     }
                     text += "\r\n";
                 }
                 return text;
             }
         }
     }
     /// <summary>
     /// doc后缀
     /// </summary>
     /// <param name="wordFileStream"></param>
     /// <param name="fileExt"></param>
     /// <returns></returns>
     public static string ExtractTextFromWordDoc(Stream wordFileStream, string fileExt)
     {
         Spire.Doc.Document doc = new Spire.Doc.Document(wordFileStream);
         Spire.Doc.Table table = doc.Sections[0].Tables[0] as Table;
         string text = doc.GetText()+" ";//获取word文档中的文本
         //纯表格可以使用以下方法
         //遍历表格内容
         for (int i = 0; i < table.Rows.Count; i++)
         {
             var cellsindex = table.Rows[i].Cells.Count;
             for (int j = 0; j < cellsindex; j++)
             {
                 TableCell cell = table.Rows[i].Cells[j];
                 foreach (Paragraph paragraph in cell.Paragraphs)
                 {
                     text += paragraph.Text+" ";
                 }
             }

             text += "\r\n";
         }
         return text;
     }
 }

二、EXCEL校验校验身份证号,手机号

npoi处理excel时要判断后缀,xls和xlsx使用的类不同

public class ExcelToTextConvert
{
    /// <summary>
    /// 提取成纯文本
    /// </summary>
    /// <param name="file"></param>
    /// <returns></returns>
    public static string ExtractTextFromExcel(Stream excelFileStream,string fileExt)
    {
        using (excelFileStream)
        {
            string text = "";

            IWorkbook workbook=null;
            if (fileExt == "xls")
            {
                workbook = new HSSFWorkbook(excelFileStream);
            }
            if (fileExt == "xlsx")
            {
                workbook = new XSSFWorkbook(excelFileStream);
            }
            ISheet sheet = workbook.GetSheetAt(0);
            if (sheet != null)
            {
                foreach (IRow row in sheet)
                {
                    foreach (ICell cell in row)
                    {
                        switch (cell.CellType)
                        {
                            case CellType.String:
                                text += cell.StringCellValue + " ";
                                break;
                            case CellType.Numeric:
                                text += cell.NumericCellValue + " ";
                                break;
                        }
                    }
                    text += "\r\n";
                }
            }
            return text;
        }
    }
}

三、txt校验校验身份证号,手机号

获取文件流的内容,文本文件可以直接读取。方法如下:

if ("txt".Contains(fileExt))
{
    // 确保文件不为null并且有数据
    if (postedFile != null && postedFile.ContentLength > 0)
    {
        using (StreamReader reader = new StreamReader(postedFile.InputStream))
        {
            // 读取文件内容并返回
            string readContent = reader.ReadToEnd();
            bool hasMobile = ContainsMobileNumber(readContent);
            if (hasMobile)
            {
                return "{\"status\": 0, \"msg\": \"内容中不可含有手机号!\"}";
            }
            bool hasId = ContainsIdNumber(readContent);
            if (hasId)
            {
                return "{\"status\": 0, \"msg\": \"内容中不可含有身份证号!\"}";
            }
        }
    }
}

 四、正则校验字符串中是否包含身份证号,手机号等

public static bool ContainsMobileNumber(string text)
{
    // 中国大陆手机号码正则表达式
    string pattern = @"1[3-9]\d{9}";
    return Regex.IsMatch(text, pattern);
}

public static bool ContainsIdNumber(string text)
{
    // 中国大陆身份证号正则表达式
    string pattern = @"[1-9]\d{5}(18|19|20)?\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}(\d|[Xx])";
    return Regex.IsMatch(text, pattern);
}

五、读取pdf方法,未做项目验证,请自行搜索相关方法

供参考:读取显示PDF需要借助PDF库,国内Spire.PDF可以读取PDF内容,包括文本,图片以及表格,你可以通过NuGet搜索安装

  1 using Spire.Pdf;
  2 using Spire.Pdf.Texts;
  3 using System.IO;
  4 
  5 using System.Text;
  6 
  7 namespace ExtractText
  8 
  9 {
 10 
 11 internal class Program
 12 
 13 {
 14 
 15 static void Main(string[] args)
 16 
 17 {
 18 
 19 //创建一个 PdfDocument 对象
 20 
 21 PdfDocument doc = new PdfDocument();
 22 //加载PDF文件
 23 
 24 doc.LoadFromFile("AI数字人.pdf");
 25 
 26 StringBuilder sb = new StringBuilder();
 27 
 28 foreach (PdfPageBase page in doc.Pages)
 29 
 30 {
 31 
 32 //创建一个PdfTextExtractot 对象
 33 
 34 PdfTextExtractor textExtractor = new PdfTextExtractor(page);
 35 
 36 //创建一个 PdfTextExtractOptions 对象
 37 
 38 PdfTextExtractOptions extractOptions = new PdfTextExtractOptions();
 39 
 40 //将 isExtractAllText 设置为true
 41 
 42 extractOptions.IsExtractAllText = true;
 43 
 44 //从页面中提取文本
 45 
 46 sb.AppendLine(textExtractor.ExtractText(extractOptions));
 47 
 48 }
 49 
 50 //将提取的文本写入 TXT 文件
 51 
 52 File.WriteAllText("提取指定页面文本.txt", sb.ToString());
 53 
 54 }
 55 
 56 }
 57 
 58 }
 59 
 60 读取表格内容:
 61 
 62 using Spire.Pdf;
 63 
 64 using Spire.Pdf.Utilities;
 65 
 66 using System.IO;
 67 
 68 using System.Text;
 69 
 70 namespace ExtractTable{
 71 class Program
 72 {
 73 static void Main(string[] args)
 74 {
 75 //实例化PdfDocument类的对象
 76 PdfDocument pdf = new PdfDocument();
 77 //加载PDF文档
 78 pdf.LoadFromFile("sample.pdf");
 79 //创建StringBuilder类的对象
 80 StringBuilder builder = new StringBuilder();
 81 //实例化PdfTableExtractor类的对象
 82 PdfTableExtractor extractor = new PdfTableExtractor(pdf);
 83 //声明PdfTable类的表格数组
 84 PdfTable[] tableLists;
 85 //遍历PDF页面
 86 for (int pageIndex = 0; pageIndex < pdf.Pages.Count; pageIndex++)
 87 {
 88 //从页面提取表格
 89 tableLists = extractor.ExtractTable(pageIndex);
 90 //判断表格列表是否为空
 91 if (tableLists != null && tableLists.Length > 0)
 92 {
 93 //遍历表格
 94 foreach (PdfTable table in tableLists)
 95 {
 96 //获取表格中的行和列数
 97 int row = table.GetRowCount();
 98 int column = table.GetColumnCount();
 99 //遍历表格行和列
100 for (int i = 0; i < row; i++)
101 {
102 for (int j = 0; j < column; j++)
103 {
104 //获取行和列中的文本
105 string text = table.GetText(i, j);
106 //写入文本到StringBuilder容器
107 builder.Append(text + " ");
108 }
109 builder.Append("\r\n");
110 }
111 }
112 }
113 }
114 //保存提取的表格内容为.txt文档
115 File.WriteAllText("ExtractedTable.txt", builder.ToString());
116 }
117 }
118 
119 }
读取PDF的内容,文本、表格、图片

 

总结:尽一切合理努力保护用户个人信息, 并对个人信息进行保护。为防止用户个人信息在意外的、未经授权的情况下泄漏。

压缩包内容校验基本方法同上,先解压缩,再逐文件处理。本文直接判断有敏感词,不让上传,也可以通过正则把信息替换成****后再转存,这里不再展开。

如有专门的更好用的插件请留言告知讨论,避免重复造轮子。

 

标签:word,string,词如,text,excel,doc,new,using,Spire
From: https://www.cnblogs.com/oorz/p/18067714

相关文章

  • DBever导入越南文Excel
    HelloWorld有一个Excel文件中含有越南文1、将其另存为CSV,注意选择UTF-8格式的CSV。2、原文件的编码改成UTF-83、表映射中的目标字段的类型设置成nvarchar格式。......
  • python3实现xmind用例转excel
    1importxmindparser2importxlwt,xlrd3fromxlutils.copyimportcopy4fromxlwtimportWorksheet5fromxmindparserimportxmind_to_dict6importdatetime7importos8importre9importtraceback1011#当前时间戳12a=datetim......
  • 一文搞定POI,再也不怕excel导入导出了
    写在前面在Java日常开发过程中,实现Excel文件的导入导出功能是一项常见的需求。通过使用相关的Java库,如ApachePOI、EasyPoi或EasyExcel,可以轻松地实现Excel文件的读写操作。而这篇文章将介绍如何在Java中使用ApachePOI、EasyPoi和EasyExcel库来进行Excel文件的导入和导出操作......
  • Python 在Word中创建表格并填入数据、图片
    在Word中,表格是一个强大的工具,它可以帮助你更好地组织、呈现和分析信息。本文将介绍如何使用Python在Word中创建表格并填入数据、图片,以及设置表格样式等。PythonWord库:要使用Python在Word中创建或操作表格,需要先将Spire.DocforPython这个第三方库安装到项目中.pipinstall......
  • Word2Vec+下游任务
    2024.3.10Word2Vec+下游任务word2vec也是一种神经网络语言模型---->主要目的就是为了得到词向量这类神经网络模型主要分为两个小类CBOW和Skip-gramCBOW主要作用:给出一个词的上下文,得到一个词Skip-gram主要作用:给出一个词,得到词的上下文NNLM和Word2Vec的区别NNLM-......
  • WordPress:常见问题及解决方案
    解决头像不显示问题默认头像效果:Gavatar的头像在国内不能正常访问,如图:设置:把以下php代码添加到模板函数funtions.php文件中if(!function_exists('get_cravatar_url')){/***把Gravatar头像服务替换为Cravatar*@paramstring$url*@return......
  • GRE Words
    我永远喜欢数据结构。UVA1502/SP9941给出\(n\)个字符串\(s_1\sims_n\),第\(i\)个字符串有权值\(w_i\)。选出一个子序列\(a_1\sima_k\),满足\(\forall\,i\in[1,k),a_i<a_{i+1}\)且\(s_{a_i}\)是\(s_{a_{i+1}}\)的子串。求\(\sum\limits_{i=1}^kw_{a_i}\)的最......
  • EasyExcel动态单元格合并(跨行或跨列)
    EasyExcel动态单元格合并(跨行或跨列)简单的合并单元格可以参照官网提供的@OnceAbsoluteMerge()和@ContentLoopMerge()两个注解进行@OnceAbsoluteMerge()注解只会合并一次就不再执行了动态相同值合并单元格代码示例(可以直接使用):先看结果:开启合并列行合并单元格,指定1......
  • word 创建宏,根据选取的图片相同的图片
    SubDeleteImages()   DimiAsLong   DimSourceWidthAsSingle   DimSourceHeightAsSingle   DimDeleteCounterAsLong     'Checkifapictureisselected   IfSelection.InlineShapes.Count>0Then     'Save......
  • 解决easyexcel合并单元格数组求和重复问题
    背景EasyExcel(根据条件动态合并单元格的重复数据))_Violet-CSDN博客_easyexcel动态合并单元格现有的订单导出是使用的easyExcel完成的.对于相同单元格的合并是自定义的策略,问题是对于重复单元格的值会合并,表格求和时值会虚高现需要对合并格做修改,做到值只有一个。思路sheet合并......