文件解析库doctotext源码分析
2024-09-07 14:29:47
doctotext中没有make install选项,make后生成可执行文件
在buile目录下面有.so动态库和头文件,需要的可以从这里面拷贝
build/doctotext就是可执行程序。
doctotext内置了两种检测文件类型方法:
1、以后缀为依据检测文件类型
2、以内容为依据检测文件类型
下面是doctotext支持的文件类型:
DOC, XLS, XLSB, PPT, RTF, ODF (ODT, ODS, ODP),
OOXML (DOCX, XLSX, PPTX), iWork (PAGES, NUMBERS, KEYNOTE),
ODFXML (FODP, FODS, FODT), PDF, EML and HTML documents to plain text.
Extracts metadata and annotations.
对于解析像office2007这类的文件,doctotext只是识别出来格式是OOXML类型,并没有细分是word还是execl。
如果用户没有指定文件类型,在解析文件的时候先先进行后缀检测判断文件类型,根据检测结果调用相应格式的文件解析器。
当解析过程中发现格式错误的时候,终止解析。使用内容检测判断文件类型,然后再根据检测结果调用相应格式的文件解析器。
如果是未识别的文件格式则终止进程。
main()函数位于src/doctotext.cpp中
从main()函数开始分析。
doctotext_init_tracing()函数,用于调试跟踪。产生信息文件doctotext.trace
定义变量extract_metadata,初始为不显示文件属性信息
bool extract_metadata = false;
名字空间:
namespace doctotext
{
enum TableStyle { TABLE_STYLE_TABLE_LOOK, TABLE_STYLE_ONE_ROW, TABLE_STYLE_ONE_COL, };
enum UrlStyle { URL_STYLE_TEXT_ONLY, URL_STYLE_EXTENDED, URL_STYLE_UNDERSCORED, };
class ListStyle {}; struct FormattingStyle
{
TableStyle table_style;
UrlStyle url_style;
ListStyle list_style;
}; enum XmlParseMode {PARSE_XML, FIX_XML, STRIP_XML};
}
类:
class PlainTextExtractor
{
//文件类型的枚举
enum ParserType{......}
//实现结构体
struct Implementation;
//实现结构体私有变量
Implementation *impl;
}
implementation中实现的函数列表
//判断不同的文件类型是否正确
isRTF [PlainTextExtractor::Implementation]
isODFOOXML [PlainTextExtractor::Implementation]
isXLS [PlainTextExtractor::Implementation]
isDOC [PlainTextExtractor::Implementation]
isPPT [PlainTextExtractor::Implementation]
isHTML [PlainTextExtractor::Implementation]
isIWork [PlainTextExtractor::Implementation]
isXLSB [PlainTextExtractor::Implementation]
isPDF [PlainTextExtractor::Implementation]
isEML [PlainTextExtractor::Implementation]
isODFXML [PlainTextExtractor::Implementation]
//不同文件类型的解析器
parseRTF [PlainTextExtractor::Implementation]
parseODFOOXML [PlainTextExtractor::Implementation]
parseXLS [PlainTextExtractor::Implementation]
parseDOC [PlainTextExtractor::Implementation]
parsePPT [PlainTextExtractor::Implementation]
parseHTML [PlainTextExtractor::Implementation]
parseIWork [PlainTextExtractor::Implementation]
parseXLSB [PlainTextExtractor::Implementation]
parsePDF [PlainTextExtractor::Implementation]
parseTXT [PlainTextExtractor::Implementation]
parseEML [PlainTextExtractor::Implementation]
parseODFXML [PlainTextExtractor::Implementation]
parseRTFMetadata [PlainTextExtractor::Implementation]
parseODFOOXMLMetadata [PlainTextExtractor::Implementation]
parseXLSMetadata [PlainTextExtractor::Implementation]
parseDOCMetadata [PlainTextExtractor::Implementation]
parsePPTMetadata [PlainTextExtractor::Implementation]
parseHTMLMetadata [PlainTextExtractor::Implementation]
parseIWorkMetadata [PlainTextExtractor::Implementation]
parseXLSBMetadata [PlainTextExtractor::Implementation]
parsePDFMetadata [PlainTextExtractor::Implementation]
parseEMLMetadata [PlainTextExtractor::Implementation]
parseODFXMLMetadata [PlainTextExtractor::Implementation]
PlainTextExtractor类中实现的函数列表
PlainTextExtractor [PlainTextExtractor]
~PlainTextExtractor [PlainTextExtractor]
setVerboseLogging [PlainTextExtractor]
setLogStream [PlainTextExtractor]
setFormattingStyle [PlainTextExtractor]
setXmlParseMode [PlainTextExtractor]
setManageXmlParser [PlainTextExtractor]
parserTypeByFileExtension [PlainTextExtractor]
parserTypeByFileExtension [PlainTextExtractor]
parserTypeByFileContent [PlainTextExtractor]
parserTypeByFileContent [PlainTextExtractor]
parserTypeByFileContent [PlainTextExtractor]
processFile [PlainTextExtractor]
processFile [PlainTextExtractor]
processFile [PlainTextExtractor]
processFile [PlainTextExtractor]
根据输入参数选项指定文件类型
指定parser_type的值
创建变量
PlainTextExtractor extractor(parser_type);
详细日志默认关闭
verbose = false
设置详细日志开启: extractor.setVerboseLogging(true);
设置XM解析模式:extractor.setXmlParseMode(mode);
设置格式类型:extractor.setFormattingStyle(options);
解析文件显示详细文件属性:
extractor.extractMetadata(argv[argc - 1], meta);
解析文件显示文件内容:
extractor.processFile(argv[argc - 1], text);
根据文件类型调用不同的文件解析器
processFile(parser_type, fallback, buffer, size, plain_text)
根据文件扩展名称判断文件类型
parserTypeByFileExtension(file_name);
根据内容判断文件类型:
parserTypeByFileContent(buffer, size, parser_type);
程序流程图:
官方从2014年开始就不更新了,具体什么原因不知,github 上自己维护的 doctotext
最新文章
- [原创]Macbook Pro Retina 15吋安装Windows 7和Windows 8.1方法
- ffmpeg 音频转换(amr2mp3)
- JQuery的父、子、兄弟节点查找方法
- 安装SQL Server2008,要重启机器,解决办法
- VS 开发工具中的Remote Debug 功能远程调试程序经验分享
- spring controller中@Value取不到applicationContext.xml中加载配置文件的问题
- Package 'chkconfig' has no installation candidate
- AngularJs在单击提交后显示验证信息.
- extjs实现多国语音切换
- ovs 实用案例
- relative 和 absolute 定位关系
- Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验
- 用jQuery实现切换动态图片
- Linux telnet安装
- JavaScript之事件的绑定与移除
- 剑指Offer 58. 对称的二叉树 (二叉树)
- Stack Overflow:研究发现访问PHP和 Android的流量更可能来自低收入国家
- flask-admin有用的例子
- Aerospike系列:1:安装
- 1005 Spell It Right (20 分)