Okay长话短说。实际上有点标题党,因为最终的解决方啊并非直接用纯PHP实现了旧版word文件的处理。
由于时间已经不早了,为了争取续命睡眠的时间,我会在项目做的差不多之后在回顾之时补完这篇日志。

需求背景

由于甲方的一些客观条件约束。有一大批原始素材内容是旧版word格式(.doc) 。希望能直接从固定格式的文档内提取和整理内容导入数据库。
服务端环境为linux

备选方案

  1. PHP自身的扩展 php_com_dotnet.dll
  2. PHP的第三方插件PHPWord
  3. PHP调用服务器的第三方程序antiword
  4. 和上一个解决方案类似,后端用Python 跑一个服务监听待处理word文档队列,异步处理。

在可行性研究阶段目前已经否决了前3种方案,正在用第四种方法迂回实现需求。

方案1 php_com_dotnet.dll 放弃原因

环境不支持 PHP 的COM扩展

方案2 phpword 放弃原因

PHPWord的功能更多的是实现word文档的创建和写入。对于读取和解析方面的功能比较弱。

方案3 antiword

除了需要自己编译一下之外,其实还是挺好用的执行的效率非常高还能转换成其他格式。但是有两个问题
第一个是主机商因安全的原因严格禁止PHP 开启 exec()等执行命令的函数;
另一个原因是antiword不解析word文档的页眉也页脚内容,而偏偏有些关键信息在页眉处,这个是不得不放弃的原因

方案4 python 也坎坷

有两个库 pywin32 和 python-docx 前者只支持win环境不考虑,但后者只支持docx。
于是目前的方案是找到第三方的win下可以运行的小工具批量转 doc-> docx
然后对转换出的 docx 文件做队列处理

已知额外的问题

已知有批处理工具(OFFICE安装目录下) Wordconv.exe 可以用命令行批量转换,但考虑到用户端的操作环境、word版本差异、终端用户的操作门槛、培训成本等考虑,提前放弃。

用第三方工具(multidoc convert)转换的docx,与使用word另存转格式,格式兼容存在差异(例如文本虽然保存完整,但表格样式丢失),这个计划通过指定转换操作方法来约束,只对2种情况做排版内容适配。

具体做法在下篇备忘,晚安。

标签: php, word, doc

添加新评论