java使用documents4j在linux环境通过LibreOffice实现word转pdf,并解决中文乱码

news/2025/3/12 22:26:36/文章来源:https://www.cnblogs.com/qq545505061/p/18345179

本文主要分享使用documents4j将word转换成pdf,并解决中文乱码的问题。

一开始使用的是poi进行word转换pdf,但是当word中有图片,转换就会报错。

于是对比了各种转换方式,又选择了documents4j,通过网上的教程,很快就成功的将word转换成了pdf,还很好的保留了格式。但当部署到linux服务器运行时,又出现了报错,于是又寻找解决方案,最终在千篇一律的搬运文中终于找到了解决方法。当程序正常运行转换成功时,高兴的打开文档一看,又让人懵逼了,全是乱码。好吧,又继续解决乱码问题吧。最终花了将近两天的时间才完美的实现了linux环境下word转换成pdf的功能。

接下来分享具体的操作。

 linux系统安装LibreOffice

CentOS:使用以下命令安装

sudo yum install libreoffice

Ubuntu:使用以下命令安装

sudo apt-get install libreoffice

linxu系统添加字体

如果linux系统下缺失中文字体库,那么使用LibreOffice将word转换成pdf后,就会出现乱码,这时我们就得将word中使用到的字体添加到linux系统中。

要查看系统中已经安装的字体,我们可以使用fc-list命令进行查看。如果系统中没有该命令的话,我们需要先安装相关的软件包。

在centos上,使用如下命令进行安装:

yum install -y fontconfig mkfontscale

在ubuntu上,使用如下命令进行安装:

sudo apt-get -y install fontconfig xfonts-utils

查看linux已安装字体

fc-list

查看linux已安装中文字体

fc-list :lang=zh

接下来我们先在字体文件夹下创建一个文件夹,将需要的字体文件放入进去

mkdir -p /usr/share/fonts/win_fonts

然后建立字体索引信息,更新字体缓存 进入目录 cd /usr/share/fonts/win_fonts,执行索引字体生成

mkfontscale && mkfontdir && fc-cache -fv

查看黑体常规字体是否安装成功

fc-list :lang=zh

这样我们就将需要的字体安装好了

Java代码

maven依赖:

<dependency><groupId>com.documents4j</groupId><artifactId>documents4j-local</artifactId><version>1.1.12</version>
</dependency>
<dependency><groupId>com.documents4j</groupId><artifactId>documents4j-transformer-msoffice-word</artifactId><version>1.1.12</version>
</dependency>    

windows环境下,我们可以直接通过LocalConverter调用本地office进行转换,但是linux环境下我们就得借助LibreOffice,使用命令来完成转换功能。

java代码实现:

首先根据环境选择相应的实现方法

// 待转换的word文件
File wordFile = new File("/home/document/word/11.word");
// 转换后的pdf文件
File pdfFile = new File("/home/document/pdf/11.pdf)";
// 获取当前系统名称
String osName = System.getProperty("os.name").toLowerCase();
// 根据系统选择执行方法
if (osName.contains("win")) {PdfUtil.winWordToPdf(pdfFile, wordFile); } else if (osName.contains("nux") || osName.contains("nix")) {PdfUtil.linuxWordToPdf(pdfFile, wordFile); }

pdf工具类

public class PdfUtil {private static final Logger log = LoggerFactory.getLogger(PdfUtil.class);/*** windows系统word转pdf* @param pdfFile 转换后的pdf文件* @param wordFile word源文件*/public static void winWordToPdf(File pdfFile, File wordFile) {try {IConverter converter = LocalConverter.builder().build();converter.convert(new FileInputStream(wordFile)).as(DocumentType.DOCX).to(new FileOutputStream(pdfFile)).as(DocumentType.PDF).execute();} catch (FileNotFoundException e) {log.erorr("word转换pdf失败", e);}}/*** linux系统word转pdf
   * 使用LibreOffice转换。系统需安装LibreOffice
   * 转换命令 libreoffice --invisible --convert-to pdf --outdir output_dir source_path
   * 转换后的pdf文件名使用的是源文件的名称,所以如果要指定输出文件名称,就需把源文件名称改成想要输出的名称*
@param pdfFile 转换后的pdf文件* @param wordFile word源文件*/public static void linuxWordToPdf(File pdfFile, File wordFile) {// 获取word文件的绝对路径String sourcePath = wordFile.getAbsolutePath();
     // 获取pdf文件存放文件夹的绝对路径String outDir
= pdfFile.getAbsolutePath().substring(0, pdfFile.getAbsolutePath().lastIndexOf(File.separator));// 构建LibreOffice的命令行工具命令String command = "libreoffice --invisible --convert-to pdf --outdir " + outDir + " " + sourcePath;log.info(command);// 执行转换命令try {executeLinuxCmd(command);} catch (Exception e) {log.error("linuxWordToPdf linux环境word转换为pdf时出现异常:", e);}}/*** 执行命令行** @param cmd 命令行* @return*/private static boolean executeLinuxCmd(String cmd) {try {Process process = Runtime.getRuntime().exec(cmd);process.waitFor();} catch (InterruptedException e) {log.error("executeLinuxCmd 执行Linux命令异常:", e);Thread.currentThread().interrupt();return false;} catch (IOException e) {log.error("获取系统命令执行环境异常", e);}return true;} }

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/778756.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins的安装教程

jenkins安装部署,怎样安装Jenkins?一、Jenkins是什么 Jenkins是一款开源CI&CD软件,用于自动化构建、测试和部署软件等各种任务,以实现持续集成。Jenkins支持各种运行方式,可通过系统包、Docker或者通过一个独立的Java程序。 二、安装方式 2.1 禅道智能应用平台一键安装…

数据血缘系列(4)—— 数据血缘的特点与相关概念

大家好,我是独孤风。在当今数据驱动的商业环境中,数据治理成为企业成功的关键因素之一,而数据血缘正是数据治理成功的一个关键。 本文我们详细探讨下数据血缘的特点都有什么?对比一下数据血缘、数据关系、数据分类、数据出处、知识图谱相关概念的关系。 本文为《数据血缘分…

多普勒流量计 | 高精度非接触式测量,管道流量监测无障碍

​ 我们广州的客户一直在寻找一款高精度且便于部署的流量计,用于实时监控生产管线中的流体流量。经过反复比较,最终我们选择了这款超声波多普勒流量计。 该流量计采用多普勒效应的测量原理,通过发射和接收声波信号,精确测量管道内流体的流速分布。与传统测量方式相比,它最大的优…

【YashanDB数据库】数据库运行正常,日志出现大量错误metadata changed

问题现象 客户在麒麟kylin v10 sp1环境上部署YashanDB,运行正常, 但是在巡检中发现run.log中有大量错误日志文件metadata changed,需要排查原因问题单:前置机大量错误日志文件metadata changed,需要排查原因 问题的风险及影响 客户环境为准生产环境,担心影响业务执行。 问…

外卖霸王餐CPS怎么做,系统怎么选

​ **外卖霸王餐 CPS 做法**:1. 确定目标受众 - 分析哪些人群对外卖霸王餐感兴趣,例如上班族、学生等。 - 了解他们的消费习惯和外卖需求。2. 搭建推广渠道 - 建立微信公众号、小程序或社群。 - 利用社交媒体平台,如抖音、小红书等进行推广。3. 与商家合作 - 寻找…

Spring事务传播性质导致事务失效

this导致事务失效的原因 当我们在一个事务中调用另一个对象的方法时,如果这个方法中使用了this关键字,事务可能会失效。这是因为this关键字代表当前对象的引用,而事务是基于数据库连接的,每个数据库连接有自己的事务上下文。如果在一个事务中调用另一个对象的方法,而这个方…

minio安装(rpm方式)

环境:OS:Centos 71.下载minio下载地址如下wget https://dl.min.io/server/minio/release/linux-amd64/2.安装[root@host135 milvus]# rpm -ivh minio-20240803043323.0.0-1.x86_64.rpm Preparing... ################################# [100%] Updati…

[Redis]主从同步

有备无患--主从同步 很多企业都没有使用 Redis 的集群,但是至少都做了主从。有了主从,当主节点(Master)挂掉的时候,运维让从节点(Slave)过来接管,服务就可以继续,否则主节点需要经过数据恢复和重启的过程,这就可能会拖延很长的时间,从而影响线上业务的持续服务。在了解 …

【YashanDB数据库】VMware虚拟机使用默认安装,在掉电之后数据库无法启动

问题现象 客户使用VMware虚拟机使用默认安装,部署YashanDB个人版,在掉电之后无法启动 操作系统: Virtualization: VMware Operating System: CentOS Linux 7 (Core) CPE OS Name: cpe:/o:centos:centos:7 Kernel: Linux 3.10.0-1160.el7.x86_64 Architecture: x86-64 [yasha…

在 Kubernetes 中部署 Alertmanager

AlertManager 是一个开源警报系统,与 Prometheus 监控系统配合使用。本博客是 Prometheus Kubernetes 教程系列的一部分。在我们之前的文章中,我们研究了以下内容:在 Kubernetes 上部署 Prometheus 部署 Kube State Metrics在本指南中,我将介绍 Alertmanager 设置及其与 Pr…

华为云IoTDA控制台全新升级,来体验35万+开发者使用的平台

摘要:现在体验华为云IoT全新控制台,赢无线耳机等精美好礼 本文分享自华为云社区《华为云IoTDA控制台全新升级,邀您有奖体验!| 云声建议 - 华为云IoTDA专属活动(8月)》,作者:华为IoT云服务。 作为万物上云的物联网底座,华为云IoT物联网平台(设备接入IoTDA)目前接入的…

第三章 栈、队列和数组

栈 栈的基本概念 栈的定义 栈是只允许在一端进行插入或删除操作的线性表栈顶:线性表允许进行插入删除的那一端 栈底:固定的,不允许进行插入和删除的另一端 空栈:不含任何元素的空表栈的操作特性可以概括为:后进先出(LIFO) 栈的基本操作 InitStack(&S)//初始化栈,构…