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镜像。

 

posted @ 2022-03-18 09:27  对我有点小自信  阅读(4963)  评论(2编辑  收藏  举报