Neuzilla出品
QQ群:297128022
官方微信公眾號:
Toxy 是干嘛用的?它是.NET平台上的文件抽取框架,主要解決各種格式的內容抽取問題,比如pdf, doc, docx, xls, xlsx等,盡管聽上去支持了很多格式,但它的使用卻是極其方便的,因為Toxy把復雜的抽取流程透明化,Toxy的用戶根本不用知道內容是怎么抽出來的,這就是Toxy的重要意義。
另外Toxy的一大目標是取代IFilter成為跨平台.NET數據抽取解決方案,即支持Linux上的Mono。目前所有的測試用例都可以跑在Mono上,但是有少數沒有過,正在逐步改進。
從另一個層面講,Toxy能將文件數據變成統一的結構化數據。目前Toxy支持的結構有
string - 文本結構
ToxyDom - Dom結構
ToxySpreadsheet - 類似Excel的表單結構
ToxyDocument - 類似Word的描述性文本結構
ToxyEmail - 郵件結構,包括收件人、發件人、郵件內容、附件等
ToxyBusinessCard - 名片結構
ToxyMetadata - 元數據結構,主要包含文件的屬性信息,比如作者、標題、照片大小、分辨率等。
Toxy目前主要支持的文件格式及能抽取的內容
此表更新至Toxy 1.4版本。
文件格式 | 支持抽取的結構化對象(抽取結果的類型) |
txt | string |
xml | ToxyDom |
csv | string, ToxySpreadsheet |
rtf | string |
string, ToxyDocument | |
htm, html | string, ToxyDom |
vcf | string, ToxyBusinessCard |
zip | string |
mp3, ape, wav, flac, aif | ToxyMetadata |
jpeg, jpg, gif, tiff, png | ToxyMetadata |
eml | string, ToxyEmail |
cnm | ToxyEmail |
xls, xlsx | string, ToxySpreadsheet, ToxyMetadata |
ppt, pptx | ToxyMetadata |
doc, docx | string, ToxyDocument, ToxyMetadata |
.vsd, .pub, .shw, .sldprt, pubx, vsdx | ToxyMetadata |
如何使用Toxy
Toxy的使用真的是極其簡單,這里一點都不誇張,請看下面的例子:
ParserContext context = new ParserContext("test.xlsx"); ISpreadsheetParser parser = ParserFactory.CreateSpreadsheet(context); ToxySpreadsheet ss = parser.Parse(); //處理抽取出來的數據
這里的ToxySpreadsheet實例ss就是抽取出來的Excel數據,你可以直接用。 ParserContext負責描述抽取上下文,告知Toxy要抽取的文件的路徑,以及相關參數。ParserFactory是工廠模式類,負責所有解析 器的實例化工作,它會根據傳入文件的擴展名自動尋找合適的解析器。
下面展示一下PDF文檔的抽取代碼,一樣極其簡單:
string path = TestDataSample.GetPdfPath("Sample1.PDF"); var parser = new PDFTextParser(new ParserContext(path)); string result = parser.Parse();
這里返回的是string,也就是把PDF文檔的內容直接抽取到string中,通常這種代碼lucene.NET這樣的搜索引擎用的比較多。
再來個ToxyMetadata的抽取例子:
string path = Path.GetFullPath(TestDataSample.GetOLE2Path("TestEditTime.doc")); ParserContext context = new ParserContext(path); IMetadataParser parser = ParserFactory.CreateMetadata(context); ToxyMetadata x = parser.Parse();
這里抽取的是doc文件的元數據信息,比如文件由什么應用程序創建(並非一定是Word),作者、標題、公司等信息。
只要是文件屬性中詳細信息列出來的東西,理論上都可以抽取出來。
Toxy解析器的抽取參數
Toxy的解析器不僅提供基本的抽取功能,同時也支持對抽取內容進行選擇,這是通過ParserContext的Properties實現的。
下面舉一個Excel的抽取參數的例子:
ParserContext context = new ParserContext(TestDataSample.GetExcelPath(filename)); ISpreadsheetParser parser = ParserFactory.CreateSpreadsheet(context); ToxySpreadsheet ss = parser.Parse(); //抽取表的頁頭 parser.Context.Properties.Add("ExtractSheetHeader", "1"); //抽取表的頁腳 parser.Context.Properties.Add("ExtractSheetFooter", "1"); ToxySpreadsheet ss2 = parser.Parse();
這里的ExtractSheetHeader和ExtractSheetFooter是抽取器指定的參數,拼寫不要出錯,否則無效,后 面的1表示開啟,當然如果你喜歡,你也可以用on或者true,解析器能自動識別出這3種表示true的方式,如果想表示false,你可以用0, off或者false表示。
另外SpreadsheetParser還支持是否填充空白單元格(FillBlankCells)、顯示公式結果(ShowCalculatedResult)、包含批注(IncludesComments)等操作,有興趣的可以玩玩。
當然每個抽取器能夠使用的參數是不一樣的,本文就不詳細一一列舉了,在以后的文章中,我們會詳細列舉每個抽取器的參數及對應抽取內容。
Toxy高級擴展功能
Toxy除了提供基礎的抽取功能,也提供一些高級的對象轉換服務,比如ToxySpreadsheet轉DataSet,可以直接把Excel的數據轉換成DataSet,方便調用和處理。代碼超級簡單,如下所示:
ParserContext c=new ParserContext(@"c:\employee.xls"); var parser=ParserFactory.CreateSpreadsheet(c); var spreadsheet= parser.Parse(); DataSet ds = spreadsheet.ToDataSet();
就這么4行代碼,是不是超級爽呀!另外,ToxySpreadsheet的子結構ToxyTable支持ToDataTable操作,用法也是類似的,直接調用即可。
Toxy功能展望
Toxy 1.x的目標是支持足夠多的文件格式,並轉換成統一的結構進行抽取。
而Toxy 2.x-3.x的目標是支持相似文件的互操作(相互轉換),例如Excel轉csv, Excel轉html, Word轉PDF等,當然這個路有點長,慢慢來。
以后.NET陣營不會被Java陣營嘲笑說連個像樣的抽取框架都沒有了,Java陣營有tika,我們.NET有Toxy,oh, yeah!