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 
https://github.com/etangyushan/doctotext

转载于:https://www.cnblogs.com/etangyushan/p/4259814.html

文件解析库doctotext源码分析相关推荐

  1. 第三季2:ORTP库的源码分析、RTP发送实验的源码分析

    以下内容源于朱有鹏课程,如有侵权,请告知删除. 一.ORTP库源码分析 1.ORTP库概览 (1)库提供一堆功能函数(本身没有main),都在src目录下 (2)库的使用给了案例(有main),在sr ...

  2. scroller类的用法完全解析以及带源码分析

    上一篇:scrollTo与scrollBy用法以及TouchSlop与VelocityTracker解析 通过上一篇内容对scrollTo与scrollBy用法以及TouchSlop与Velocity ...

  3. 鸿蒙系统源代码解析,鸿蒙内核源码分析(系统调用篇) | 图解系统调用全貌

    本篇说清楚系统调用 读本篇之前建议先读鸿蒙内核源码分析(总目录)工作模式篇. 本篇通过一张图和七段代码详细说明系统调用的整个过程,代码一捅到底,直到汇编层再也捅不下去. 先看图,这里的模式可以理解为空 ...

  4. 2个关于Adapter库的源码分析(AdapterDelegate、BaseRecyclerViewHelper)

    0x00 概述 核心思想:都是围绕如何解决viewType.视图.数据与视图的绑定来进行一系列的封装,不同的库有着自己不同的手段而已 Adapter能在数据变化时候,内部实现逻辑不会改变,仅在外部添加 ...

  5. php源码哪些文件是主程序,ThinkPHP源码分析之核心类文件的加载

    研究了下TP的加载机制,以下是我的一些总结: 1.首先由应用入口文件index.php引入TP入口文件ThinkPHP.php 2.ThinkPHP.php里主要是定义一些系统常量,URL模式定义,系 ...

  6. 在ADSP21489上使用FFT和IFFT库完整源码--分析窗为矩形窗

    时隔8年再次重新在21489上重新整理此功能,这次是完整的源码,重新把工程书写了搭建了一遍 再次编辑又有新的心得,学到了当初不曾了解全面的知识点 1.ifft后对信号的重建问题 2.调试出错问题 /* ...

  7. Android ViewManger解析 从ViewRoot 源码分析invalidate

    转载请标明出处:http://blog.csdn.net/sk719887916/article/details/48443429,作者:skay     通过学习了AndroidUI之绘图机基础 知 ...

  8. mysql驱动源码解析_mysql驱动源码分析

    注: 本系列文章使用JDK1.5 数据库驱动版本 mysql-connector-java-5.1.8b JAVA连接数据库是其众多功能中的一部分,主要有两种方式连接DataBase: 一种是采用JD ...

  9. java log 配置,java日志系统--log4j配置解析过程,源码分析

    log4j 可以看成是非常类似jdk logger 结构 ,有个logger 与logManger 都是在logManger的静态块中初始化类,加载配置文件 Logger.getLogger(Test ...

最新文章

  1. 计算机网络课程复习大纲
  2. #研发解决方案#基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案
  3. Django运行SQL语句
  4. 76. 最小覆盖子串
  5. vs 设置起始页不见了_发朋友圈屏蔽爸妈,结果不小心设置成了仅家人可见...场面一发不可收拾哈哈哈哈!...
  6. Spring with Hibernate persistence and transactions
  7. linux安装CAS认证服务器
  8. uni-app引入阿里Icon 图标方式(CustomIcon 扩展自定义图标库)
  9. 阿里云服务器配置DNS域名解析
  10. android辅助功能失效,如果其他应用的辅助功能服务处于开启状态,则Android无障碍服务无法正常工作...
  11. 考取IT职业资格证书相关信息
  12. 计算机通电后自动断电,电脑开机自动断电,详细教您电脑开机自动断电怎么解决...
  13. display和visility
  14. 医疗软件开发解决方案
  15. c# 使用Office com组件时遇到的问题
  16. 5.2 C语言练习(电报加密:输入一行电报文字,将字母变成其下一字母(如’a’变成’b’……’z’变成’a’其它字符不变)。)
  17. 怎么升级Android Studio版本,Android Studio更新的四种版本介绍
  18. 天池竞赛员工离职预测训练赛
  19. win10/11 paddlepaddle2.3/2.2 之 匹配CUDA和Cudnn版本安装
  20. Scrum板与Kanban如何抉择?敏捷工具:plcbpb板与按照kjuaoxnu

热门文章

  1. 第四天上午 休闲假日
  2. Linux07-OpenSSH
  3. java service注入失败,使用spring向service里面注入dao不成功。
  4. node.js是开源的吗_为开源做贡献并不难:我为Node.js项目做贡献的旅程
  5. 初创公司面试要问什么_聘请初创公司的产品设计师时要问的问题
  6. 如何在国内上medium_在Medium上写作的风格指南
  7. Hadoop集群搭建(七:MySQL的安装配置)
  8. jsp实现日历(二)
  9. RFID系统的基本工作原理
  10. 女生参加web前端培训可以吗