上傳附件判斷word、excel、txt等文檔中是否含有敏感詞如身份證號,手機號等,其它檢測如PDF,圖片(OCR)等可以自行擴展。 互聯網項目中,展示的數據中不能包含個人信息等敏感信息。判斷word中是否包含手機號,word正文中是否包含身份證號等敏感信息,通過正則表達式判斷匹配手機號,身份證號, ...
上傳附件判斷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的內容,文本、表格、圖片
總結:盡一切合理努力保護用戶個人信息, 並對個人信息進行保護。為防止用戶個人信息在意外的、未經授權的情況下泄漏。
壓縮包內容校驗基本方法同上,先解壓縮,再逐文件處理。本文直接判斷有敏感詞,不讓上傳,也可以通過正則把信息替換成****後再轉存,這裡不再展開。
如有專門的更好用的插件請留言告知討論,避免重覆造輪子。
作者:鄭州 - 在路上 出處:http://www.cnblogs.com/oorz/ 微信公眾號:“專卓”;因為專業,所以卓越!可掃描左側二維碼關註。 本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。