关于word解析那点事
之前做了一个电子合同的项目,这个项目简单来说就是解析电子合同模板,替换标签,然后转成pdf,上传签约平台签约,因项目使用的linux服务器,所以最终采用的技术栈是
LibreOffice+Apache poi 实现的,在做的时候发现,这套技术栈存在一定的问题,比如标签替换之后在某些情况下会产生一些奇怪的问题,word转pdf 有时格式会发生变化等等问题,奈何工期紧,只能凑合上线了
最近又来了第二期,果断换掉之前的LibreOffice+Apache poi,换成Windows Office ,要问操作word哪家最六,还得是微软。
经过今天的摸索,大概知道怎么玩了
1. 服务器必须采用Windows Server 虽然目前公司限制使用Windows 服务器,不过申请新的,好在项目组之前有一个
2.采用jacob 调用WIndows VBA的com组件,不过这组搭配有一个问题,那就是性能,自己实测,一个不大的word,拷贝+替换标签+转pdf用时大概是在6秒左右(还可以接受),要是高并发的场景下使用铁定跪
下面那就开搞
先贴个链接,微软com接口 https://docs.microsoft.com/zh-cn/office/vba/api/word.documents,jacod 安装教程,此处就不再废话了
如下代码
ActiveXComponent word = new ActiveXComponent( "Word.Application");
word.setProperty( "Visible", new Variant(visible));
Dispatch documents = word.getProperty( "Documents").toDispatch();
Dispatch doc = Dispatch.call(documents, "Open", docPath).toDispatch();
Dispatch selection = Dispatch.get(word, "Selection").toDispatch();
这段代码是打开一个docPath 路径的的word文档,然后其实是获取这个文件的某个的切入点(个人理解)
以上代码,通过与com接口比较(上面有连接),发现几个有意思的点
Dispatch.call() 一般是调用某个方法
Dispatch.get() 一般说的是获取某个对象内的某个属性对象
通过上述发现其实jacob 只是调用com组件的一个代理而已,如下图(网上找的)
上一篇: 关于 Java 字符串拼接的那点事
下一篇: 【学习笔记】python基础知识