jodconverter + libreoffice 转换microffice文件到pdf达到预览效果

没想到一个小小的功能却花费了这么长时间,实在汗颜,但是还好最后还是完成了。也许技术就是如此,看着或者听着别人如何如何简单快捷的完成了同样的功能,但是在自己没有真正动手做之前,还是不要妄下结论,这些东西跟自己的经验和阅历(或者说是基础)是紧密挂钩的。

这次的经历也算是给自己一个成长的机会吧,特此记录一下之间遇到的一些问题,只有记录以及今后的回阅,一些技术知识才能真正属于自己。之前一直都很懒,做过的一些项目,遇到的一些难题,之中解决的过程统统没有记录的习惯,都随着项目的结束,这些问题可能依然还是问题,所以以后还是要时刻警醒自己:尽量把遇到的一些问题的解决过程记录一下,除非是一些自己一看就会"哦”,原来是这样的问题不需记录以外,其他的都要动动手指,写一篇自己读的懂的文章记录一下。有时候好的习惯或许能成就一个人,至少能加上一个人的成长。

本次做这个预览的功能是因为项目中有上传文件的地方,而之前一直需要客户下载下来进行审核,但是这种方式严重影响作业效率,所以组长打算把这里的下载改为预览功能,这样用户可以不必下载文件进行审阅,可以直接在线阅览,这样就可以大大提高工作效率。

初拿到这个需求的时候想,既然是在线预览,那么可以将word、excel转换成html,因为在网上看到有相应的解决方案,但是各种方案的处理比较复杂,尤其是对excel的转化,有的还需要对excel进行table封装,需要自己调节样式,而且图片要自己保存处理。。。。总之效果不是很好。

后来组长给了一种解决方案:jodconverter + openoffice转成pdf(因为浏览器支持pdf的预览功能);因为openoffice自家的问题,后来openoffice分成两个版本,一个是libreoffice,一个是openoffice,libreoffice的功能较之openoffice功能更丰富,而且完全兼容openoffice,所以这次的实践使用了jodconverter + libreoffice来进行转换。

下面就说一下实践过程中遇到的问题吧(或者说是一些说明)

1.libreoffice实现转换的原理是:通过调用libreoffice服务(安装在服务器,暴露tcp端口)在线做转换,一开始的时候在想,既然如此我是不是可以把libreoffice服务器和我的转换程序分别放在两台电脑?带着这个想法,通过网搜和自己翻看jodconverter的源码看到,确实是有这样的连接方式的,就是通过下面的这个连接是:SocketOpenOfficeConnection(String host, int port)通过这个构造函数很容易就可以想见这里做成分服务器的方式肯定是可行的,但是。。。。。在我将Libreoffice安装到外网服务器上之后,我在本地进行连接,提示我:file://xxxx/xxxx.docx文件不存在,通过这里的file://协议就可知libreoffice服务只能解析本地文件,但是代码中有没有将文件上传到服务器的地方,所以这种分服务器的方案就这么夭折了。

2.因为项目是通过spring-boot来开发的,所以在服务器我们一般使用java -jar的方式来部署服务,但是我们的业务中又有写文件的操作,这样在程序运行的过程中向jar包中写入是不可能的,所以我们只能把文件写在程序的外部,那么问题就成了,spring-boot程序如何访问这里的外部文件,因为在线预览的就是这里的文件。我一直没有这方面的经验,但是组长让我在spring-boot的配置文件中在spring-boot的静态资源路径中添加一个路径:、

spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${user.dir},这里的关键就在于file:${user.dir}这个路径的配置方式。不得不说spring-boot的强大啊。这样又完美解决了外部路径访问的问题。

3.在服务器通过java -jar的方式运行了程序之后,页面访问之后,后台报filenotfound的错误,但是通过idea启动程序却没有这个问题,同一个文件(文件是服务器上的,这样文件肯定是存在的)却可以访问。。。。最后实在没办法只能通过远程debug了。最后发现在HttpURLConnection.getInputStream()的时候都还没有问题。这样我就实在是没有办法了。啊。。。。。在我临近崩溃的时候,突然想到通过java -jar运行的项目有乱码的问题,这里又报了filenotfound的错误,所以是不是这里的编码出了问题?所以死马当活马医,在java -jar 的参数上添加了-Dfile.encoding=UTF-8参数,尼玛,获取到文件了。。。。。(那debug的时候为啥文件名是没有乱码的呢?猜想可能是idea自己做了转换,那这样是不是idea做的太过分了,哈哈。。)

4.最后一个问题就是转换文件乱码的问题了,因为转换出来的pdf预览是乱码的,网搜:linux服务器没有中文字体,从现象也可以窥之一二,因为在windows服务器测试的时候是没有乱码问题的,那这样问题就好解决了,将window的中文fonts文件夹下的中文字体拷贝到linux的/usr/share/fonts下,建一个文件夹将windows的字体放到这里,重启服务(包括libreoffice服务)后,乱码问题解决。

你可能感兴趣的:(jodconverter + libreoffice 转换microffice文件到pdf达到预览效果)