在线预览文档

java实现在线预览功能,无非是将各类文档转换成前端可以解析的统一格式的文件,前端可解析文件一般是目前有pdf或者html。

选用格式分析

pdf处理原理

1.通过第三方工具openoffice,将word、excel、ppt、txt等文件转换为pdf文件;
2.通过swfTools将pdf文件转换成swf格式的文件;
3.通过FlexPaper文档组件在页面上进行展示。

html处理原理

或者通过poi实现word、excel、ppt转html,这样就可以放在页面上了
ppt转成图片时,如果字体不是宋体会发时乱码
poi还有一些兼容问题,不太支持wps的文档

通过个种在线工具对比,发现转成html,文档格式变动比较大,但是代码量相对较少,实现比较简单
而转成pdf对性能消耗比较大,文档格式基本无损,代码量较多,实现逻辑相对复杂

还有一种 第三方成熟的服务 如OfficeWeb365
优点很多,但是缺点致命,首先必须联网,然后文档安全无法保证,不稳定。

选用技术分析

jacob插件

jacob允许在java中调用com接口自动组件,它使用JNI(本地调用程序)来进行本地调用COM库。它可运行在x86和支持32位和64位Java虚拟机 X64的环境。

需下载jacob-1.19-x86.dll 、jacob-1.19-x64.dll 并将文件放到jdk bin目录下,用户调用时启动插件功能
最后需要通过ComThread.Release()语句释放winword.exe进程
但是当被部署项目的服务器是centOS等linux server时,就不能用使用相关插件

OpenOffice

OpenOffice跨平台可以在Windows和Linux下运行,并且开源免费(原则上GPL开源协议不推荐,相当于别人开源了你也需要开源不适用于商业软件)

开源协议

开发思路
参考block
1.一个文件只转换一次
2.多线程,OpenOffice为单进程不支持多线程,故需要多开进程(一个程序至少有一个进程,一个进程至少有一个线程)
3.存在用户同时请求未转换完文档,导致重复转换导致异常的情况,故需要加锁处理

OpenOffice转excel为pdf时出现折行

参考block
问题:Java 操作 OpenOffice 将excel 转换为 pdf ,因多列出现折行;
原因:OpenOffice 默认输出为A4 大小,源excel 存在队列,总宽度超出 A4 宽度,所以出现折行;
解决方法:自定义一个类,继承OpenOfficeDocumentConverter 类 重写方法,与 refreshDocument 方法,设置 OpenOffice 输出 pdf 的宽度参数