Introduction
GNU libextractor是一个种用来从 file 中提取 meta data 的 library。他的设计为以辅助链接库的方式来执行提取文件实际内容,Meta data 格式的数据有下列 (mime type, image dimensions, color depth, recording frequency),GNU libextractor 主要是被我们用来提取 meta data 之用。目前,GNU libextractor 支持以下格式:HTML, PDF, PS, OLE2 (DOC, XLS, PPT), OpenOffice (sxw), StarOffice (sdw), DVI, MAN, FLAC, MP3 (ID3v1 and ID3v2), NSF(E) (NES music), SID (C64 music), OGG, WAV, EXIV2, JPEG, GIF, PNG, TIFF, DEB, RPM, TAR(.GZ), ZIP, ELF, S3M (Scream Tracker 3), XM (eXtended Module), IT (Impulse Tracker), FLV, REAL, RIFF (AVI), MPEG, QT and ASF. 此外,还有各种额外的 MIME 类型检测。
GNU libextractor 是免费软件,可以下载下来修改以及发布。
GNU libextractor 使用 plugin 来处理各种文件格式。从技术上讲一个 plugin 可以支持多种文件格式,但大多数 plugin 只支持一个特定的格式。默认情况下,GNU libextractor 将使用所有在安装目录下发现的可用plugin。应用程序可以要求使用特定 plugin 或只有排除某些 plugin。
Example for using dynamic library
// hello.c
#include <extractor.h>
int main()
{
struct EXTRACTOR_PluginList *el;
el = EXTRACTOR_plugin_load_defaults (EXTRACTOR_OPTION_DEFAULT_POLICY);
// ...
EXTRACTOR_plugin_remove_all (el);
return 0;
} |
执行以下指令 compile
$ gcc \ -I/Library/Frameworks/Extractor.framework/Versions/Current/include \
-o hello hello.c \
-L/Library/Frameworks/Extractor.framework/Versions/Current/lib \
-lextractor
Plugin management
C Struct: EXTRACTOR_PluginList
建立一组 plugin
Function: void EXTRACTOR_plugin_remove_all (struct EXTRACTOR_PluginList *plugins)
删除所有给定 plugin 列表
Function: struct EXTRACTOR_PluginList * EXTRACTOR_plugin_remove (struct EXTRACTOR_PluginList *plugins, const char*name)
删除给定 plugin 列表例如 mime 中的 mpeg
Function: struct EXTRACTOR_PluginList * EXTRACTOR_plugin_add (struct EXTRACTOR_PluginList *plugins, const char* name,const char* options, enum EXTRACTOR_Options flags)
增加给定 plugin 列表
Function: struct EXTRACTOR_PluginList * EXTRACTOR_plugin_add_config (struct EXTRACTOR_PluginList *plugins, const char* config, enum EXTRACTOR_Options flags)
根据 config string load 或是 unload 或是修改已存在的列表
Function: struct EXTRACTOR_PluginList * EXTRACTOR_plugin_add_defaults (enum EXTRACTOR_Options flags)
加载所有在 plugin 数据夹下的预设 plugin 列表
Example for a minimal extract method
以下范例告诉我们如何利用 plugin 解读出 MIME type
|
int
EXTRACTOR_mymime_extract
(const char *data,
size_t data_size,
EXTRACTOR_MetaDataProcessor proc,
void *proc_cls,
const char * options)
{
if (data_size < 4)
return 0;
if (0 != memcmp (data, "\177ELF", 4))
return 0;
if (0 != proc (proc_cls,
"mymime",
EXTRACTOR_METATYPE_MIMETYPE,
EXTRACTOR_METAFORMAT_UTF8,
"text/plain",
"application/x-executable",
1 + strlen("application/x-executable")))
return 1;
/* more calls to 'proc' here as needed */
return 0;
}
|
Internal utility functions
有些实用的内部开发 API
“convert_numeric.h” 定义了各种数字的转换功能(特别是转换为浮点数)。
“unzip.h” 定义了一个访问压缩文件的 API。
“pack.h” 可以把有 integer 的 struts 分解顺便也可以把 big/little endian 转成 host byte order。
“convert.h” 提供了一个函数进行所需之字符集转换。
Function: char * EXTRACTOR_common_convert_to_utf8 (const char *input, size_t len, const char * charset) 可以用来方便地从任何字符集转换为 UTF - 8 文本。
Conclusion
总之,对于讯息解析平凡的我们来说,GNU libextractor 不只帮助了我们找到档案的正确格式,还可以撰写各种 plugin 工具,分析各种文字格式,找到相对应的 MIME type。这对 email 这块领域而言,可说是不可或缺的一项工具。