文件解析库doctotext源码分析

news/2024/7/3 2:14:20
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


http://lihuaxi.xjx100.cn/news/273149.html

相关文章

学习OpenCV,新手常会问我的十个问题 | 视觉入门

点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达初次学习OpenCV新手经常问我的十个问题,有你问我过下面的问题之一吗?Q1按照视频做的,我怎么显示了不了图像或者视频解答:最…

AI芯片行业发展的来龙去脉

作者 | 清华大学微电子学研究所尹首一来源 | 《微纳电子与智能制造》期刊引言人 工 智 能( aritificial intelligence ,AI )是 一 门融合了数学 、计算机科学 、统计学 、脑神经学和社会科学 的前沿综合性技术。它的目标是希望计算机可以像 人一样思考 ,…

Python爬虫入门教程:超级简单的Python爬虫教程

这是一篇详细介绍 [Python]爬虫入门的教程,从实战出发,适合初学者。读者只需在阅读过程紧跟文章思路,理清相应的实现代码,30 分钟即可学会编写简单的 Python 爬虫。 这篇 Python 爬虫教程主要讲解以下 5 部分内容: 了…

134个预训练模型、精度高达85.1%,百度视觉算法最强基石PaddleClas全新升级

机器之心发布机器之心编辑部百度 PaddlePaddle 团队开发的 PaddleClas 是一个适用于业界和学界的图像分类任务工具集,可以帮助用户训练更好的计算机视觉模型并应用于真实场景中。近期 PaddleClas 迎来了全面升级,其中提供了更高精度的知识蒸馏模型、更丰…

列选主元guass消去法

200701020110 07计算机 王再#include <iostream.h>#include <iomanip.h>#include <stdlib.h>void main(){ int flag1;input(); //输入方程 while(flag){ print_menu(); //打印主菜单}void print_menu(){ system("cls");cout<…

实现indexOf

1.先判断Array数组是否含有indexOf方法&#xff0c;如果有直接返回结果&#xff1b;如果没有则利用循环比较得到结果。 function indexOf(arr, item) {if(Array.prototype.indexOf) {return arr.indexOf(item);}var len arr.length, i, idx -1;for(i0; i<len;i) {if(item …

数据库链接池终于搞对了,这次直接从100ms优化到3ms!

点击上方“方志朋”&#xff0c;选择“设为星标”回复”666“获取新整理的面试文章本文来源&#xff1a;https://www.jianshu.com/p/a8f653fc0c54本文内容95%译自这篇文章https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing我在研究HikariCP&#xff08;一个…

python自学到精通

python其实非常适合初学者入门。相比较其他不少主流编程语言&#xff0c;有更好的可读性&#xff0c;因此上手相对容易。自带的各种模块加上丰富的第三方模块&#xff0c;免去了很多“重复造轮子”的工作&#xff0c;可以更快地写出东西。配置开发环境也不是很复杂&#xff0c;…