欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于word解析那点事

程序员文章站 2022-06-23 14:57:48
...

之前做了一个电子合同的项目,这个项目简单来说就是解析电子合同模板,替换标签,然后转成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组件的一个代理而已,如下图(网上找的)

关于word解析那点事

相关标签: java 后端