.NET文件抽取框架 Toxy新手入门

发表回复

Neuzilla出品

官方网站:http://toxy.codeplex.com
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
pdf 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的使用真的是极其简单,这里一点都不夸张,请看下面的例子:

1

2

3

4

ParserContext context = new ParserContext("test.xlsx");

ISpreadsheetParser parser = ParserFactory.CreateSpreadsheet(context);

ToxySpreadsheet ss = parser.Parse();

//处理抽取出来的数据

这里的ToxySpreadsheet实例ss就是抽取出来的Excel数据,你可以直接用。ParserContext负责描述抽取上下文,告知Toxy要抽取的文件的路径,以及相关参数。ParserFactory是工厂模式类,负责所有解析器的实例化工作,它会根据传入文件的扩展名自动寻找合适的解析器。

下面展示一下PDF文档的抽取代码,一样极其简单:

1

2

3

string path = TestDataSample.GetPdfPath("Sample1.PDF");

var parser = new PDFTextParser(new ParserContext(path));

string result = parser.Parse();

这里返回的是string,也就是把PDF文档的内容直接抽取到string中,通常这种代码lucene.NET这样的搜索引擎用的比较多。

再来个ToxyMetadata的抽取例子:

1

2

3

4

string path = Path.GetFullPath(TestDataSample.GetOLE2Path("TestEditTime.doc"));

ParserContext context = new ParserContext(path);

IMetadataParser parser = ParserFactory.CreateMetadata(context);

ToxyMetadata x = parser.Parse();

这里抽取的是doc文件的元数据信息,比如文件由什么应用程序创建(并非一定是Word),作者、标题、公司等信息。

image

只要是文件属性中详细信息列出来的东西,理论上都可以抽取出来。

Toxy解析器的抽取参数

Toxy的解析器不仅提供基本的抽取功能,同时也支持对抽取内容进行选择,这是通过ParserContext的Properties实现的。

下面举一个Excel的抽取参数的例子:

1

2

3

4

5

6

7

8

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,方便调用和处理。代码超级简单,如下所示:

1

2

3

4

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!

Leave a Reply