解决 linux(centos7)word转换pdf时,pdf乱码问题

本文解决当word转换为pdf时,pdf文档中的中文字体全部都是乱码(方框)的问题。

先简单的写一下word转换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 = "<License><Data><Products><Product>Aspose.Total for Java</Product><Product>Aspose.Words for Java</Product></Products><EditionType>Enterprise</EditionType><SubscriptionExpiry>20991231</SubscriptionExpiry><LicenseExpiry>20991231</LicenseExpiry>" +
                "<SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber></Data><Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature></License>";
        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部署项目的,使用的阿里云的服务器。

1. 首先将centos7系统的编码格式改为支持中文的编码格式

将编码格式从LANG=en_US.UTF-8改为LANG=zh_CN.UTF-8

打开服务器输入

cat /etc/locale.conf

可以查看自己的编码格式,我这里已经进行了更改,使用vim命令更改文本。(这个就不用多说了吧,不会有人不知道怎么用Vim吧,不会吧,不会吧)
《解决 linux(centos7)word转换pdf时,pdf乱码问题》

2.使编码格式生效

修改了编码格式之后,需要使编码格式生效,输入一下命令就行

source /etc/locale.conf

建议走以下步骤之前,备份阿里云磁盘镜像,不会可能会有suprise

3.安装字体服务的相关的依赖安装包

使用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掉,可别哭爹喊娘咯)

《解决 linux(centos7)word转换pdf时,pdf乱码问题》

上图红框中的三个安装包一定删除
我查了一下,这三个包是与网络链接相关,我在第一次操作过程中,退出服务器之后就再也链接不上服务器,强制覆盖了宿主机网络连接相关的镜像。这个时候就只能回滚磁盘了。
在这里实名感谢一下我们后端的大哥,孙火箭。帮我回滚了磁盘镜像,不然我就可以直接寄了
大哥为什么叫这么奇怪的名字。enmmmm,可能大哥爱吃喜之郎果冻吧

如果没有机器或着yum命令不好使的,可以评论或着私信我,我可以给你发一下。
(为什么不像别人一样贴一个百度云盘链接? 因为我不会整,哈哈哈)

4.使用rpm命令解压安装压缩包

#执行安装命令
rpm -ivh ./*.rpm –nodeps –force #我的是当前目录,所以是./

安装包中有字体,名叫dejavu(翻译是 逮虾户 吗?)
但是不是中文的字体
成功解压之后,会在 /usr/share 目录下生成fontconfig和fonts,没有fonts目录的,自己用mkdir命令创建一个,问题不大。

5.安装中文字体

从windows电脑上copy字体就行,只copy宋体就好了,叫 simsun.ttc
什么,你问我没有windows电脑怎么办?
那只能买一台了啊,兄弟。
开个玩笑,同样可以私信我,我可以发给你。

6.执行以下命令,刷新字体缓存

是在 /usr/share/fonts 目录下执行,别迷路了啊

mkfontdir
mkfontscale
fc-cache -fv

可以执行以下命令查看字体

fc-list #查看所有字体
fc-list :lang=zh #查看中文字体

完结,撒花!!!

docker容器说: ???? 你在赣神魔?我呢,我呢,我可是docker容器啊,是与宿主机隔离的。

不好意思,伙计,忘记你了。如上说,docker容器相当与一个单独的小系统,是与外界隔离的,虽然可以挂载到宿主机的磁盘下,但是企业级开发最好不要用。所以也需要在docker容器中配置相关编码格式和中文字体。
这里感谢我们另外一位后端大哥,姜航天,在俺快要放弃的时候,一语惊醒梦中人。
为什么这位大哥的名字也这么奇怪,enmmm,可能这位大哥也爱吃喜之郎果冻吧
他做了一个导出excel的需求,也出现类似编码错误的问题,然后就跟我讲了是不是内部也要配置编码格式和字体。

7.容器中添加中文编码格式和中文字体

我们使用的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

    原文作者:JOKERDRAGON
    原文地址: https://blog.csdn.net/JOKERDRAGON/article/details/126781883
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞