上传附件判断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、excel、txt等是否含有敏感词如身份证号,手机号等的更多相关文章

  1. 关于confluence上传文件附件预览查看时出现乱码的问题解决办法

    在confluence上传excel文件,预览时发现乱码问题主要是因为再上传文件的时候一般是Windows下的文件上传,而预览的时候,是linux下的环境,由于linux下没有微软字体,所以预览的时候 ...

  2. confluence上传文件附件预览乱码问题(linux服务器安装字体操作)

    在confluence上传excel文件,预览时发现乱码问题主要是因为再上传文件的时候一般是Windows下的文件上传,而预览的时候,是linux下的环境,由于linux下没有微软字体,所以预览的时候 ...

  3. JAVAWeb SSH框架 上传文件,如2007的EXCEL

    下面的代码是上传EXCEL的代码,其实,就是在上传文件到服务器,代码都差不多,只是接收的文件的类型改一下即可. 1.jsp 用的是struts2 标签 代码: <s:file name=&quo ...

  4. hadoopmaster主机上传文件出错: put: File /a.txt._COPYING_ could only be replicated to 0 nodes instead of minReplication (=1). There are 3 datanode(s) running and 3 node(s) are excluded in this operation.

    刚开始装好hadoop的时候,namenode机上传文件没有错误,今天打开时突然不能上传文件,报错 put: File /a.txt._COPYING_ could only be replicate ...

  5. SpringMVC上传文件以流方式判断类型附常用类型

    // 此类中判断类型所截取的byte 长度暂不确定,请使用者测试过使用 package com.tg.common.other; import com.tg.common.tginterface.TG ...

  6. 后台使用Spring MVC 4.15 版本 通过 ajaxFileUpload plugin插件上传文件相应时引起的一个小问题,Chrome、Firefox中出现SyntaxError:unexpected token <

    html: 使用ajaxFileUpload插件做文件上传时,后台返回json格式的数据,js代码如下: 接下来,把结果错误信息打印出来: 先在网上找了下解决办法方案,stackoverflow上有说 ...

  7. zf-安徽桐城关于(资源中心-数据录入)上传文件后没有进行处理Excel文件的原因

    上传的文件 是会自动复制到另外一个路径的 如果没有进行处理 那么表示那个路径并没有那个文件 这样就会卡死 导致之后的文件都不会进行处理(后台有个变量是从数据库里获得文件路径的),所以需要去数据库 执行 ...

  8. 160414、java上传文件以流方式判断类型

    public enum FileType {       /**        * JEPG.        */       JPEG("FFD8FF"),          / ...

  9. Postman查看上传文件过程时出现400 - Required MultipartFile parameter 'files' is not present错误

    我在利用postman查看上传图片文件时,出现了如下图的错误,看到之后很懵逼. 图1 上网搜了一下,归结下来就是参数不一致导致的.不过还有一些是由于没加注解,如下图示: 图2 关于参数不一致问题,主要 ...

  10. input[type=file]上传文件(格式判断、文件大小、上传成功后操作)

    var isUploadImg = false; //在input file内容改变的时候触发事件******************上传图片 $('#filed').change(function( ...

随机推荐

  1. 【LeetCode剑指offer 01】数组中重复的数字、两个栈实现队列

    数组中重复的数字 数组中重复的数字 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数 ...

  2. 【Azure Notification Hub】如何手动删除 Notification Hub 中已注册的设备

    问题描述 在Notification Hub中注册了设备后,从Azure门户上没有找到相应的入口来删除已注册设备 (Active Devices) 如果使用C# SDK是否有办法删除呢? 问题解答 可 ...

  3. 【Azure Developer】如何用Microsoft Graph API管理AAD Application里面的Permissions

    问题描述 如何用Microsoft Graph API给应用添加Microsoft Graph Application Permission 解决方法 一:首先获取Microsoft Graph Ap ...

  4. 【Azure API 管理】API Management 访问限制策略[quota-by-key] 中参数 [renewal-period] 的实验和理解

    quota-by-key 策略允许根据密钥强制实施可续订或有生存期的调用量和/或带宽配额. 密钥的值可以是任意字符串,通常使用策略表达式来提供密钥. 可以添加可选增量条件,指定应在配额范围内的请求. ...

  5. 解决celery与django结合后,分别启动celery和django的进程同时调用定时任务的问题

    django中引入celery后发现在代码中写如下这样的定时任务,启动celery和django的工程后,他们都会调用这个定时任务导致,任务有的时候会冲突出现奇怪的问题.如何解决请继续看. sched ...

  6. centos7通过配置hosts.allow和hosts.deny限制登陆

    etc/hosts.allow和/etc/hosts.deny两个文件是控制远程访问设置的,通过他可以允许或者拒绝某个ip或者ip段的客户访问linux的某项服务. 我们通常只对管理员开放SSH登录, ...

  7. 实现一个 SEO 友好的响应式多语言官网 (Vite-SSG + Vuetify3) 我的踩坑之旅

    在 2023 年的年底,我终于有时间下定决心把我的 UtilMeta 项目官网 进行翻新,主要的原因是之前的官网是用 Vue2 实现的一个 SPA 应用,对搜索引擎 SEO 很不友好,这对于介绍项目的 ...

  8. python 生成虚拟环境requirement.txt

    # 在项目根目录中,打开终端执行以下命令 # 生成 requirements.txt 文件 pip3 freeze > requirements.txt # 安装依赖文件 pip3 instal ...

  9. 探究WPF中文字模糊的问题:TextOptions的用法

    有网友问WPF中一些文字模糊是什么问题.之前我也没有认真思考过这个问题,只是大概知道和WPF的像素对齐(pixel snapping).抗锯齿(anti-aliasing)有关,通过设置附加属性Tex ...

  10. 在Linux平台使用wps卡顿现象解决方法

    是因为软件占据的内存过多,需要关掉目前不使用的软件,以释放系统内存.