Aspose.word转换PDF踩坑总结
1 需求背景
运营台账功能需要将用户上传的doc、docx、wps格式的文档进行在线预览。(2月17日用户提交需求)
运营台账功能的“一键生成”功能需要生成PDF,并自动上传以及下载至用户端。(3月2日用户提交需求)
2 方案研究
2.1 在线预览
文件可能存在两个来源,一、前端生成后用户手动上传;二、用户手动创建文件后上传。
程序生成的文件采用了jquery.wordexport.js实现,将html文本添加MSOffice文件头后直接存储为doc。
而用户自己创建的文件则是由Micro Office或者WPS生成,这两种文件存在本质性的区别。
因此为了兼容所有情况,需要对不同类型的文件进行统一处理。经过查询各种资料,找到了kkFileView开源项目。
kkFileView项目为文件文档在线预览项目解决方案,对标业内付费产品有【永中office】【office365】【idocv】等。
使用spring boot搭建,易上手和部署,基本支持主流办公文档的在线预览,如doc,docx,Excel,pdf,txt,zip,rar,图片等等。
然而,开发的过程终究会遇到各种坎坷。使用jquery.wordexport.js生成doc文件,kkFileView无法正确渲染。因此考虑更换前端生成doc文档插件。
经过测试,生成的doc文件如果在pc端打开后另存为docx格式后再上传,kkFileView是可以正常渲染的。因此找到了Html-docx.js插件, 它可以将HTML转换为docx,于是将其集成到开发环境中,就在我们以为一切都已经OK的时候,用户提交了新的需求:需要将页面导出为PDF。
2.2 生成PDF
与台账功能十分相似的还有另外一个功能:月报。月报中也存在一键导出、上传。而月报的页面布局、样式相对比较复杂,因此我们需要的还是直接将HTML文本转换为PDF文档。经过一番搜索后,找到了以下几种方案。
序号 |
描述 |
备注 |
测试结果 |
1 |
前端绘制canvas,保存为图片,后端将图片生成PDF |
canvas |
1、 生成的图片不清晰 2、 只能生成当前屏幕的截图,页面缺失 |
2 |
前端直接转为PDF |
jspdf.js |
原理同上,结果同上 |
3 |
wkhtmltopdf |
服务端命令调用 |
1、 需要在服务器安装wkhtmltopdf程序 2、 集成方式:Java调用shell命令将页面地址传入wkhtmltopdf工具来生成PDF 3、 pass原因:需要重构页面;华为云容器部署难以实现 |
4 |
Apache iText |
Jar包集成 |
1、 对HTML的css样式渲染效果很差,导致生成的PDF样式错乱 2、 对HTML标签要求严格,标签未关闭则会渲染失败 |
5 |
flying-saucer-pdf
|
Jar包集成 |
1、 基于Apache iText二次开发 2、 支持css样式渲染 3、 也存在HTML标签要求严格的问题,因台账功能中包含富文本编辑器,无法保证渲染效果 |
6 |
Aspose.word |
Jar包集成 企业级收费产品 |
1、 收费 2、 暂未实现如何设置字体,导致在Linux部署时生成的文档字体存在小小的问题 |
7 |
Spire.doc |
Jar包集成 企业级收费产品 |
1、 收费 2、 只能对通过Office创建的文档进行转换,对于使用html-docx.js生成的文档无法转换 |
8 |
Docx4j |
Jar包集成 |
1、 只能对通过Office创建的文档进行转换,对于使用html-docx.js生成的文档无法转换 2、 效率极低,50Kb的docx文档转换过程需要1分钟以上 |
9 |
MdToPdf |
Jar包集成 |
1、 只支持markDown文件转换为PDF 2、 无法渲染图片 3、 无法完美渲染表格 |
经过多方对比,比较符合需求的只有方案6(Aspose.word)
万幸的是,找到了热心网友上传的破解Jar包,无需设置Licence,生成的文档中也没有版权水印等信息。
3 集成Aspose.word
目前只存在一个问题,字体设置未生效。
在外网环境中,生成的PDF效果正常。
在内网环境中,文档中部分文字显示效果不理想,效果如下。
尝试解决:
- 将外网机器中的“C:windows/fonts”中的所有字体拷贝至内网机器中并安装,问题依旧未能解决。
- 查询word官方文档,在程序中添加了字体扫描路径,问题依旧未能解决。
暂时放弃,直接在Linux环境进行部署测试。
在Linux环境部署后,新的问题出现了。
猜测这个问题应该是服务器未安装中文字体导致的,因此将windows端的中文字体上传至服务器,并安装,问题解决。
4 华为云部署
云上环境和252测试系统区别很大,252是jar包部署,华为云是docker环境部署。
在云服务器上提前装好了中文字体,然而在部署后,经过测试,中文字体依旧没能正常渲染。
猜测原因可能是docker镜像中不存在中文字体,而华为云部署时上传jar包后,打镜像的过程是华为云实现的,无法进行介入,无法安装字体。
与华为云负责人进行协调,答复是不支持,并且不提供帮助。
在多方同事的协助下,进行了两个方向的研究,一、程序配置字体扫描及字体设置;二、依赖自带中文字体的基础镜像手动构建docker镜像。