用PHP直接读取二进制doc文件的文本内容
November/14th 2010

    要实现搜索doc文档,第一步就要先从二进制doc文件中提取出文本内容。现在一般的做法是用微软的com组件,或者用第三方的软件来提取,都不太方便。 所以我想用php直接提取其中的文本。

    而微软早年搞的doc二进制标准实在是太复杂了,即使微软在2008年公布了doc文件的二进制编码格式,但是要想从中按照正规的方法提取出文本内容仍然是一件非常困难的事情。我的感觉就像是小时候玩RPG游戏寻宝一样,必须一步步按照微软的寻宝图路线走,任何一步错误都拿不到宝藏。。。

    研究正规途径提取文本并取得一定成功的是Ethan同学,他通过相关文献资料,找到一条可以用PHP分析doc二进制文件并从中提取出文本内容的方法。但是只能提取出一少部分doc文档的内容(可能是实验做的太少)。我后来在他的基础上又研究了几天,发现要想走正规路线拿到文本非常困难,因为doc文档编码中文和英文不一样,还分为1Table和0Table等。

    昨天突发奇想,能不能用暴力破解的方式拿到文本呢? 经过一天艰苦奋战,终于取得了可喜的成绩。 这里是DEMO。

    暴力法的大概思路是: 每512个字节分为一个sector,每个sector为一个基本单位。然后发现,如果某个sector是用来存储文本的,那么此sector里面就只有文本内容,没有其他数据。 那怎样判断是否为文本sector呢? 我引入了一个常用汉字和英文字母以及标点符号组成的数组。判断此sector里面常用文本占sector总长度(512字节)的比例(根据大量测试,比例在0.3以上,基本上可以确定是文本sector),就可以确定整个文件的文本内容。 另外,doc文件里,汉字是用2个字节来存储的,而且用的little endian方式(就是字节顺序是反的)存储的,但是英文是用1个字节。 后来又想了一些办法来判断是中文还是英文。 最终经过大量的测试,绝大部分文件可以正常提取绝大部分文本(偶尔可能最有一个sector文字太少无法识别)。 对于索引doc文件这个简单的需求来说,已经足够了。

     源代码在这里下载



19362 read 12 comment(s)
#1
cheen.cn   2010年11月16号 14:14       回复
用的是offcie word 2003的文档格式,看看这个:
CN客户.doc 提取结果 (用时: 0.32876300811768s):
N��;d�`��o7�g�K(M&$R(.1�r'J��ЊT���8��V�"��AȻ�H�u}���|�$�b{��P����8�g/]�QAsم(����#��L�[������PK-!����[Content_Types].xmlPK-!�֧��6 +_rels/.relsPK-!ky���theme/theme/themeManager.xmlPK-!�m�Q�theme/theme/theme1.xmlPK-!
ѐ��'� theme/theme/_rels/themeManager.xml.relsPK]�


o�������\�(# � �A�A@������������0�( �
�
#2
cheen.cn   2010年11月16号 14:14       回复
结束。
#3
longbill   2010年11月16号 15:15       回复
@cheen.cn 能将这个文件发给我吗?
#4
中华E商创业商务网   2010年11月22号 15:41       回复
| 借博主宝地!祝博主人气越来越旺|
#5
kookxiang   2010年11月27号 22:59       回复
好久没来 = =
#6
左旋肉碱   2010年12月21号 17:05       回复
祝博主人气越来越旺|
#7
深圳SEO   2010年12月21号 17:05       回复
人气越来越旺|
#8
免费开店   2010年12月24号 16:32       回复
送个ip,支持一下
#9
peter   2011年10月30号 11:22       回复
希望和刘兄弟,多多交流
#10
peter   2011年10月30号 11:22       回复
希望和刘兄弟,多多交流
#11
nation   2013年04月06号 21:56       回复
docx 文件取不了正确的文本。期待新版本...
#12
lilu   2014年10月20号 16:17       回复
我下载了 提取后报错 ,请问是为啥
otice: Undefined index: 쿐 in xxx on line xx
添加新的评论
称呼:*
邮件:*
网站:
内容:

Copyright © Longbill 2008-2024 , Designed by EndTo , Powered by EndCMS