libofd源码部分错误的修改

libofd:https://github.com/uukuguy/libofd
提取OFD文件内容不包括嵌入图片内容,仅仅是文档内容,如果ofd文件一段文字接图片的话,图片放在另一个规定的文件夹Res中,图片内容提取需要使用opencv,这里不做介绍

源代码下载完后安装完所有的依赖之后发现编译完后测试给定的ofd文件用例时不能识别
因为源码有部分错误

由于构造函数没有初始化成员变量导致的 OFDPackage::Open直接返回没法继续运行提取内容就,这里还包括OFDPage.cxx中也没有初始化

OFDPage::OFDPage(OFDDocument *ofdDocument, uint64_t id, const std::string &filename)
    : m_ofdDocument(ofdDocument), m_id(id), m_filename(filename) {
    m_attributes.clear();
    //modify X
    m_opened = false;
}

在这里插入图片描述
修改完上述后继续又错因为这里没做判空处理,导致在调用成员方法时崩溃
在这里插入图片描述
修改完后发现可以识别但是会有几个Content.xml文件没提取出来,或者跑着跑着崩了,共三个ofd文件测试
发现这里越界了conten[filesize] = ‘\0’;修改为入如下后,测试给的三个ofd文件测试都没问题,自己的测试用例test.ofd文件也没问题
在这里插入图片描述

========================================================
补充(2020.09.30):最近新测试了些文件发现源码的错误,以下为补充说明
bool OFDPage::parseXML(const std::string &content)
最重要的解析部分获取属性也需要做判空处理(属性不存在),不同ofd文件的Conetent.xml文件中所包含的属性不尽相同。如下:
std::string c = textObjectElement->Attribute(“CTM”);这里抛出std:logic_error异常_M_construct. …
改为:
if ( textObjectElement->Attribute(“CTM”) != NULL){std::string c = textObjectElement->Attribute(“CTM”);}

const XMLElement *fillColorElement = textObjectElement->FirstChildElement(“ofd:FillColor”);
同上

const XMLElement *strokeColorElement = textObjectElement->FirstChildElement(“ofd:StrokeColor”);
同上

textObject->Text = textCodeElement->GetText();这里导致段错误
改为if (textCodeElement->GetText() == 0){textObject->Text = “”}else{textObject->Text = textCodeElement->GetText();}
这四处会导致段错误,抛出logic_error异常等情况,根据返回值进行判空处理主要是源代码直接将返回值赋值给变量导致了给string赋值空指针之类的错误或者是空指针调用了方法(源码是认为格式都是标准的,所以按照标准的去取各个元素,而实际上文件中有些元素是缺少的所以需要判空仅此而已,最好是每次获取属性都判空,这里仅仅对于测试出错的地方进行了判空而已),详细不做说明,可自行测试

========================================================
解决了三个问题,一不能识别直接报错了,二识别会漏掉部分内容,三识别中途显示double free或者这个错记不清了,但是多次测试报错是不一样的,double free和另一个忘了

其次呢,libofd源码思路:1 使用libzip接口获取ofd文件内所有文件的文件名(test.ofd文件相同与.zip压缩文件)
//单纯的解压后有目录Doc0和OFD.xml文件

2 获取ofd文件或者说压缩包内的文件路径–》3 读OFD.xml文件内容获取Document.xml文件的路径==》

==》 4 读取Document.xm内容获取Content.xml的文件路径—》解析所有的Content.xml文件获取文档内容

主要在于xml解析部分(固定格式)

此命令为libofd源码的README(./bin/ofdtest …/data/sample0.ofd)
输出的内容为修改后的,没有了详细日志的输出(更符合我们的需求,仅含有文档的内容,用来过滤关键字)当然这里只是在测试了源码提供的几个ofd文件用例以及自己有的一些ofd文件用例,没有进行大量的ofd文件测试


root:~/work/file/libofd-master/build# ./bin/ofdtest …/data/sample0.ofd
上海市人民政府文件沪府发暡2013暢67号上海市人民政府关于公布第四批上海市非物质文化遗产代表性项目名录和上海市非物质文化遗产代表性项目扩展名录的通知各区、县人民政府,市政府各委、办、局:经研究,市政府同意市文广影视局确定的第四批上海市非物质文化遗产代表性项目名录(共计22项)和上海市非物质文化遗产代表性项目扩展名录(共计13项),现予公布(附后)。各区县、各部门要继续贯彻《中华人民共和国非物质文化遗产法》的规定,按照“保护为主、抢救第一、合理利用、传承发展暠的方针,进一步做好非物质文化遗产的保护、保存和传承、传播工作,为弘扬中华民族优秀传统文化,推动社会主义文化大发展、大繁荣,—1—促进上海文化事业不断发展做出新的贡献。2013年9月10日—2—第四批上海市非物质文化遗产代表性项目名录(共计22项)一、传统音乐(2项)序号编号项目名称申报地区或单位158栺-14浦东山歌浦东新区159栺-15上海工人大锣鼓杨浦区二、传统舞蹈(2项)序号编号项目名称申报地区或单位160栻-9腰鼓金山区161栻-10鲤鱼跳龙门闵行区三、传统戏剧(无)四、曲艺(无)五、民间文学(3项)序号编号项目名称申报地区或单位162桋-9萧泾寺传说宝山区163桋-10小刀会传说青浦区164桋-11上海绕口令徐汇区—3—六、传统体育、游艺与杂技(1项)序号编号项目名称申报地区或单位165桍-11船拳青浦区七、传统美术(2项)序号编号项目名称申报地区或单位166桏-28上海砚刻上海工艺美术研究所167桏-29海派瓷艺普陀区八、传统技艺(7项)序号编号项目名称申报地区或单位168桒-55古琴斫制技艺上海市收藏协会、上海音乐学院、上海七弦古琴文化发展基金会169桒-56漆器制作技艺闵行区170桒-57木牛流马制作技艺长宁区171桒-58王宝和蟹宴烹饪技艺黄浦区172桒-59永青假发制作技艺黄浦区173桒-60兰花栽培技艺浦东新区174桒-61赵家花园菊花种植技艺普陀区—4—九、传统医药(2项)序号编号项目名称申报地区或单位175桖-10范氏眼科疗法上海中医药大学附属龙华医院176桖-11益大中药饮片炮制技艺浦东新区十、民俗(3项)序号编号项目名称申报地区或单位177桗-13圣堂庙会浦东新区178桗-14钱氏家训及其家教传承上海钱镠研究会179桗-15海派膏方文化上海中医药大学附属曙光医院—5—上海市非物质文化遗产代表性项目扩展名录(共计13项)一、传统音乐(3项)序号编号项目名称申报地区或单位2栺-2上海田山歌金山区9栺-9海派锣鼓上海市演出行业协会129栺-11古琴艺术上海音乐学院二、传统舞蹈(无)三、传统戏剧(1项)序号编号项目名称申报地区或单位18栿-6皮影戏徐汇区四、曲艺(1项)序号编号项目名称申报地区或单位25桍-5宣卷浦东新区五、民间文学(无)六、传统体育、游艺与杂技(无)—6—七、传统美术(5项)序号编号项目名称申报地区或单位38桏-4海派剪纸艺术松江区41桏-7连环画徐汇区47桏-13石雕普陀区96桏-16海派玉雕(水晶雕刻)普陀区145桏-26瓷刻普陀区八、传统技艺(无)九、传统医药(3项)序号编号项目名称申报地区或单位75桖-1伤科疗法(石氏伤科疗法)上海中医药大学附属曙光医院155桖-7外科疗法(夏氏外科疗法)上海中医药大学附属曙光医院157桖-9竿山何氏中医文化上海中医药大学十、民俗(无)注:本扩展名录的序号、编号均为第一批、第二批、第三批上海市非物质文化遗产名录的序号和编号。—7—抄送:市委各部门,市人大常委会办公厅,市政协办公厅,市高法院,市检察院。暋上海市人民政府办公厅2013年9月10日印发—8—


以上是在国产中标方得3期系统上测试,最后我也有个疑问:既然是吧ofd当做zip看待获取包内文件解析Content.xml文件获取文档内容,为什么不直接过滤Content.xml还要去解析OFD.xml获取Document.xml路径再去解析Document.xml获取Content.xml在解析获取这么麻烦的,难道是这样解析获取到的顺序正确(libzip接口获取到的Content.xml遍历可能不是按照顺序的)?仅此而已么

结尾附上网图ofd文件的组织结构:
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值