本文解决当word转换为pdf时,pdf文档中的中文字体全部都是乱码(方框)的问题。
/**
*
* @author jokerdragon
* @Description word转换为pdf
* @date 2022/9/9 2:48 PM
* @param wordPath docx文档的路径
* @param pdfPath pdf文档的路径
* @return java.io.File
*
**/
public static File word2Pdf(String wordPath,String pdfPath) throws Exception {
// 许可证,没有这个转换出来的文档最上方会有红色的水印
// 觉得这样写不够优雅的同学可以写成xml文件放在resources目录下,在代码中获取
String licenseStr = "Aspose.Total for Java Aspose.Words for Java Enterprise 20991231 20991231 " +
"8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7 sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU= ";
ByteArrayInputStream is = null;
is = new ByteArrayInputStream(licenseStr.getBytes());
License license = new License();
license.setLicense(is);
// 创建临时文件,可以获取路径就行
File tempFile = File.createTempFile("net_url", pdfPath);
try(FileOutputStream fileOutputStream = new FileOutputStream(tempFile)){
}
Document document = new Document(wordPath);
document.save(fileOutputStream, SaveFormat.PDF);
} catch (Exception e) {
e.printStackTrace();
}
return tempFile;
}
以上就是word转换为pdf的核心代码,要做一些处理可以在前后加上,比如调用这个方法之前,我是获取到字符串转换为word文档的,然后再转换为pdf。转换为pdf之后,上传到阿里云保存,返回阿里云链接给前端同学下载的。这里就不细讲了,敲黑板了,接下来要说重点了!!!!
这个问题困扰了好几天,在我自己的windows电脑上成功转换出来,mac和linux转换不出来。
在mac字体库中添加中文字体后,也可以成功展示出来。话不多说,开整。
首先备注,我们使用的centos7 和 docker部署项目的,使用的阿里云的服务器。
将编码格式从LANG=en_US.UTF-8改为LANG=zh_CN.UTF-8
打开服务器输入
cat /etc/locale.conf
可以查看自己的编码格式,我这里已经进行了更改,使用vim命令更改文本。(这个就不用多说了吧,不会有人不知道怎么用Vim吧,不会吧,不会吧)
修改了编码格式之后,需要使编码格式生效,输入一下命令就行
source /etc/locale.conf
建议走以下步骤之前,备份阿里云磁盘镜像,不会可能会有suprise
使用yum命令安装fontconfig和mkfontscale
yum install -y mkfontscale
yum install -y fontconfig
如果你们不允许连接外网或者yum命令不好使,那么恭喜你,寄了,砍掉转换pdf的需求吧,哈哈哈!!!
开个玩笑,还是有其他解决方案的,我就是yum命令不好使,键入命令时一直报错,所以只能采用备选方案,离线安装包的方法。
在可以连接网络和yum命令好使的服务器上下载安装包,命令如下
#安装获取依赖包的命令
yum -y install yum-utils
#新建一个文件来存放依赖包
mkdir -p /usr/share/font_rpm
#执行获取相关依赖命令
yumdownloader --resolve --destdir=/usr/share/font_rpm mkfontscale fontconfig
下载完成后,注意啦注意啦,有坑了。(我的坑,如果你觉得自己是欧皇,不会踩,那就往下走吧,服务器down掉,可别哭爹喊娘咯)
上图红框中的三个安装包一定删除
我查了一下,这三个包是与网络链接相关,我在第一次操作过程中,退出服务器之后就再也链接不上服务器,强制覆盖了宿主机网络连接相关的镜像。这个时候就只能回滚磁盘了。
在这里实名感谢一下我们后端的大哥,孙火箭。帮我回滚了磁盘镜像,不然我就可以直接寄了
大哥为什么叫这么奇怪的名字。enmmmm,可能大哥爱吃喜之郎果冻吧
如果没有机器或着yum命令不好使的,可以评论或着私信我,我可以给你发一下。
(为什么不像别人一样贴一个百度云盘链接? 因为我不会整,哈哈哈)
#执行安装命令
rpm -ivh ./*.rpm --nodeps --force #我的是当前目录,所以是./
安装包中有字体,名叫dejavu(翻译是 逮虾户 吗?)
但是不是中文的字体
成功解压之后,会在 /usr/share 目录下生成fontconfig和fonts,没有fonts目录的,自己用mkdir命令创建一个,问题不大。
从windows电脑上copy字体就行,只copy宋体就好了,叫 simsun.ttc
什么,你问我没有windows电脑怎么办?
那只能买一台了啊,兄弟。
开个玩笑,同样可以私信我,我可以发给你。
是在 /usr/share/fonts 目录下执行,别迷路了啊
mkfontdir
mkfontscale
fc-cache -fv
可以执行以下命令查看字体
fc-list #查看所有字体
fc-list :lang=zh #查看中文字体
完结,撒花!!!
docker容器说: ???? 你在赣神魔?我呢,我呢,我可是docker容器啊,是与宿主机隔离的。
不好意思,伙计,忘记你了。如上说,docker容器相当与一个单独的小系统,是与外界隔离的,虽然可以挂载到宿主机的磁盘下,但是企业级开发最好不要用。所以也需要在docker容器中配置相关编码格式和中文字体。
这里感谢我们另外一位后端大哥,姜航天,在俺快要放弃的时候,一语惊醒梦中人。
为什么这位大哥的名字也这么奇怪,enmmm,可能这位大哥也爱吃喜之郎果冻吧
他做了一个导出excel的需求,也出现类似编码错误的问题,然后就跟我讲了是不是内部也要配置编码格式和字体。
我们使用的dockerfile文件来整docker容器相关的配置
所以在dockerfile文件中添加相关配置(应该也可以在容器内操作,具体操作可以自行网络搜索)
ENV LANG zh_CN.UTF-8 #环境设置为中文编码环境
RUN apk add fontconfig && apk add --update ttf-dejavu && fc-cache -fv --force
提交代码,在构建的框架中(比如jenkins)构建这个容器的服务。
构建好容器之后执行以下命令,将中文字体copy到容器中,这应该也可以写入到dockerfile文件中,我还不太懂docker深层次的东西,只能用low方法,见谅。
docker cp /usr/share/fonts/simsum.ttc 容器名:/usr/share/fonts
使用以下命令进入容器
docker exec -it 容器名 /bin/bash
同样进入/usr/share/fonts 目录执行以下命令刷新字体缓存
mkfontdir
mkfontscale
fc-cache -fv
使用echo $LANG 命令查看容器内的编码环境
使用查看宿主机的字体的相同命令查看容器的字体以及中文字体
完结撒花!!!!这下真的撒花了,伦敦桥都塌了,这下真得撒花了。
作者注:
这里我也是看了很多博客,加上自己多天的实践而总结出来的,因为本人还是个菜鸟,如果有什么不对的地方,请各位大佬指证。也欢迎大家一起进行交流,蟹蟹。
参考博客:
centos7 :配置linux系统环境:
https://www.cnblogs.com/wuguofeng/p/15923241.html
https://www.anquanclub.cn/5821.html
word转换pdf:https://www.jianshu.com/p/86716c7122ef