在我們日常項目開發中,經常需要解析操作文檔,比如Office文檔、Email文件、PDF、Xml、圖片、Mp3等音頻文件,操作Office、PDF文件我們需要用到IFilter,操作文本、圖片文件需要用到File,每一個文檔格式都需要用到不同接口,或者引入不同的第三方插件。
今天給大家推薦一個開源庫,這些文檔格式通通支持,一網打盡,讓我們不需要再關心這些文檔底層操作。
項目簡介
這是一個基於.Net開發的數據/文本操作開源項目,支持docx、xlsx、xls、pdf、csv、txt、epub、html等30多種格式,使用簡單友好,是一個可以幫助我們識別文件格式,並將數據/文本提取為統一結構的智能框架。
支持文檔格式有:
txt,xml,csv,xls,xlsx,ppt,vsd,pub,shw,sldprt,pptx,pubx,vsdx,doc,docx,rtf,pdf,html,htm,eml,msg,vcf,zip,mp3,ape,wma,flac,aif,jpeg,jpg,gif,tiff,png。
如上圖所示,該項目對各種文件格式進行底層封裝,我們只需專注業務的開發,不需要了解底層細節。
技術架構
1、跨平台:基於.Net Standard 2.0開發,支持Windows、Liunx、Mac。
項目結構
通過項目引入的包,我們可以清晰的看到,該項目實際上是針對不同文件格式,通過引用第三方包進行統一封裝,比如使用NPOI進行解析Office文檔、使用iText來解析PDF,使用TagLib解析MP3、Wav等音頻文件。
使用方法
Word文檔操作
//解析docx文檔
ParserContext context = new ParserContext(TestDataSample.GetWordPath("SampleDoc.docx"));
IDocumentParser parser = ParserFactory.CreateDocument(context);
ToxyDocument doc = parser.Parse();
//獲取段落的數量
Assert.AreEqual(7,doc.Paragraphs.Count);
//判斷第一段落的文本
Assert.AreEqual("I am a test document",doc.Paragraphs[0].Text);
Excel文件操作
//解析xlsx文檔
ParserContext context = new ParserContext(TestDataSample.GetExcelPath('text.xlsx'));
ISpreadsheetParser parser = ParserFactory.CreateSpreadsheet(context);
ToxySpreadsheet ss = parser.Parse();
//獲取Excel表格數量與名稱
Assert.AreEqual(3, ss.Tables.Count);
Assert.AreEqual("Sheet1", ss.Tables[0].Name);
Assert.AreEqual("Sheet2", ss.Tables[1].Name);
Assert.AreEqual("Sheet3", ss.Tables[2].Name);
//獲取總行數
Assert.AreEqual(5, ss.Tables[0].Rows.Count);
Assert.AreEqual(0, ss.Tables[1].Rows.Count);
Assert.AreEqual(0, ss.Tables[2].Rows.Count);
//獲取指定行數
ToxyTable table = ss.Tables[0];
Assert.AreEqual(1, table.Rows[0].RowIndex);
Assert.AreEqual(2, table.Rows[1].RowIndex);
Assert.AreEqual(3, table.Rows[2].RowIndex);
Assert.AreEqual(4, table.Rows[3].RowIndex);
Assert.AreEqual(5, table.Rows[4].RowIndex);
//獲取總表格數
Assert.AreEqual(1, table.Rows[0].Cells.Count);
Assert.AreEqual(0, table.Rows[1].Cells.Count);
Assert.AreEqual(2, table.Rows[2].Cells.Count);
Assert.AreEqual(2, table.Rows[3].Cells.Count);
Assert.AreEqual(2, table.Rows[4].Cells.Count);
//獲取指定表格的值
Assert.AreEqual("Employee Info", table.Rows[0].Cells[0].ToString());
Assert.AreEqual(1, table.Rows[0].Cells[0].CellIndex);
PDF文檔操作
//解析PDF文檔
string path = TestDataSample.GetPdfPath("Sample1.PDF");
var parser = new PDFDocumentParser(new ParserContext(path));
var result = parser.Parse();
//獲取段落數
Assert.AreEqual(1474, result.Paragraphs.Count);
//判斷第一段落的文本
Assert.AreEqual("LA MARCHE MONDIALE DES FEMMES", result.Paragraphs[0].Text);
圖片文件操作
//解析jpg圖片
string path = Path.GetFullPath(TestDataSample.GetImagePath("sample_sony1.jpg"));
ParserContext context = new ParserContext(path);
IMetadataParser parser = (IMetadataParser)ParserFactory.CreateMetadata(context);
ToxyMetadata x = parser.Parse();
//屬性數量
Assert.AreEqual(12, x.Count);
//圖片寬模式時間等信息
Assert.AreEqual(2592, x.Get("PhotoHeight").Value);
Assert.AreEqual(95, x.Get("PhotoQuality").Value);
Assert.AreEqual(3872, x.Get("PhotoWidth").Value);
Assert.AreEqual("DSLR-A200", x.Get("Model").Value);
Assert.AreEqual((uint)400, x.Get("ISOSpeedRatings").Value );
Assert.AreEqual(5.6, x.Get("FNumber").Value);
Assert.AreEqual((double)35, x.Get("FocalLength").Value );
Assert.AreEqual((uint)52, x.Get("FocalLengthIn35mmFilm").Value );
Assert.AreEqual(new DateTime(2009, 11, 21, 12, 39, 39), x.Get("DateTime").Value);
以上是部分文件格式的解析例子,更多功能,大家可以下載源碼學習,針對每一種格式,都有非常詳細的單元測試例子,看完例子完全不需要文檔。
項目地址
https://github.com/nissl-lab/toxy
- End -