实现Linux下Word转PDF、Java调用命令方式

使用 LibreOffice 实现 Word 转 PDF 和 Java 调用命令

1、 安装 LibreOffice

  • 外网安装
ruby 复制代码
# 一键安装
yum install -y libreoffice
# 验证版本
libreoffice --version
# Warning: -version is deprecated.  Use --version instead.
# LibreOffice 7.5.6.2 f654817fb68d6d4600d7d2f6b647e47729f55f15
  • 内网安装
    官网下载,找最新版本

使用版本拼接本地下载

ruby 复制代码
https://download.documentfoundation.org/libreoffice/stable/7.5.6/rpm/x86_64/LibreOffice_7.5.6_Linux_x86-64_rpm.tar.gz
https://download.documentfoundation.org/libreoffice/stable/7.5.6/rpm/x86_64/LibreOffice_7.5.6_Linux_x86-64_rpm_langpack_zh-CN.tar.gz
https://download.documentfoundation.org/libreoffice/stable/7.5.6/rpm/x86_64/LibreOffice_7.5.6_Linux_x86-64_rpm_helppack_zh-CN.tar.gz

下载完成放到内网服务器上

ruby 复制代码
# 安装软件包
tar -zxvf LibreOffice_7.5.6_Linux_x86-64_rpm.tar.gz
cd LibreOffice_7.5.6.2_Linux_x86-64_rpm/RPMS/
rpm -ivh *.rpm

# 安装中文语言包
tar -zxvf LibreOffice_7.5.6_Linux_x86-64_rpm_langpack_zh-CN.tar.gz
cd LibreOffice_7.5.6.2_Linux_x86-64_rpm_langpack_zh-CN/RPMS/
rpm -ivh *.rpm

# 安装离线帮助文档
tar -zxvf LibreOffice_7.5.6_Linux_x86-64_rpm_helppack_zh-CN.tar.gz
cd LibreOffice_7.5.6.2_Linux_x86-64_rpm_helppack_zh-CN/RPMS/
rpm -ivh *.rpm

2、启动服务

ruby 复制代码
# 开启接口服务,用于word转pdf
nohup libreoffice7.5 --headless --accept="socket,host=127.0.0.1,port=8100;urp;" --nofirststartwizard &
libreoffice7.05--headless --invisible --convert-to pdf ./input.docx --outdir ./

3、安装字体库

ruby 复制代码
# 字体
cd /usr/share/fonts
# 拷贝至该目录下 C:\Windows\Fonts :simhei.ttf、Microsoft YaHei UI
yum install -y fontconfig mkfontscale
mkfontdir
fc-cache -fv
# 命令执行成功后终端最后一行会显示 fc-cache: succeeded
#验证
fc-list :lang=zh

4、Java调用Linux命令

支持 windowsLinux 转换 PDFwindows需要安装微软Microsoft Office,Linux环境安装LibreOffice开源Office

  • 依赖
xml 复制代码
<dependency>
    <groupId>com.documents4j</groupId>
    <artifactId>documents4j-local</artifactId>
    <version>1.1.10</version>
</dependency>
<dependency>
    <groupId>com.documents4j</groupId>
    <artifactId>documents4j-transformer-msoffice-word</artifactId>
    <version>1.1.10</version>
</dependency>
  • DocxUtil
java 复制代码
package com.gwssi.common.utils;

import com.documents4j.api.DocumentType;
import com.documents4j.api.IConverter;
import com.documents4j.job.LocalConverter;
import com.gwssi.common.core.constant.PathConstants;
import com.gwssi.util.PathUtils;
import lombok.extern.slf4j.Slf4j;

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;

@Slf4j
public class DocxUtil {


    /**
     * 通过documents4j 实现word转pdf
     *
     * @param sourcePath 源文件地址 如 /root/example.doc
     */
    public static File documents4jWordToPdf(String sourcePath) {
        return documents4jWordToPdf(new File(sourcePath));
    }

    public static File documents4jWordToPdf(File file) {
        String os = System.getProperty("os.name").toLowerCase();

        log.info("当前系统:{}", os);
        if (os.contains("win")) {
            // Windows操作系统
            return winDocuments4jWordToPdf(file);
        } else if (os.contains("nix") || os.contains("nux") || os.contains("mac")) {
            // Unix/Linux/Mac操作系统
            return linuxDocuments4jWordToPdf(file);
        } else {
            // 未知操作系统
            throw new RuntimeException("不支持当前操作系统转换文档");
        }
    }

    /**
     * 通过documents4j 实现word转pdf -- Windows 环境 需要有 Microsoft Office 服务
     *
     * @param file 源文件
     */
    public static File winDocuments4jWordToPdf(File file) {
        File outputFile = new File(PathUtils.getTempPath());
        try {
            InputStream docxInputStream = new FileInputStream(file);
            OutputStream outputStream = new FileOutputStream(outputFile);
            IConverter converter = LocalConverter.builder().build();
            converter.convert(docxInputStream)
                    .as(DocumentType.DOCX)
                    .to(outputStream)
                    .as(DocumentType.PDF).execute();
            docxInputStream.close();
            outputStream.close();
            return outputFile;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 通过documents4j 实现word转pdf -- linux 环境 需要有 libreoffice 服务
     *
     * @param file 源文件
     */
    public static File linuxDocuments4jWordToPdf(File file) {
        // 获取文件的绝对路径和目录路径
        String absolutePath = file.getAbsolutePath();
        String parentPath = file.getParent();

        // 构建LibreOffice的命令行工具命令
        String commands = "libreoffice7.5 --headless --convert-to pdf "
                + absolutePath + " --outdir " + parentPath;
        // 执行转换命令
        try {
            boolean result = ExecUtil.executeLinuxCmd(commands);
            if (result) {
                // 转换成功,返回转换后的PDF文件
                String pdfFilePath = parentPath + File.separator + file.getName().replaceAll("\\.(docx?|\\w+)$", "") + ".pdf";
                log.info(pdfFilePath);
                log.info(pdfFilePath);
                return new File(pdfFilePath);
            } else {
                return null;
            }

        } catch (Exception e) {
            // 转换失败
            log.error("Word文档转换为PDF失败,原因:执行命令时出现异常。", e);
            return null;
        }
    }


}
  • ExecUtil
java 复制代码
@Slf4j
public class ExecUtil {

    public static boolean executeLinuxCmd(String cmd) throws IOException {
        // 执行命令行工具命令
        Process process = Runtime.getRuntime().exec(cmd);
        try {
            process.waitFor();
        } catch (InterruptedException e) {
            log.error("执行 Linux 命令异常:",e);
            return false;
        }
        return true;
    }


}
相关推荐
A小辣椒1 天前
TShark:Wireshark CLI 功能
linux
A小辣椒2 天前
TShark:基础知识
linux
AlfredZhao2 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334663 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪3 天前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush43 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5203 天前
Linux 11 动态监控指令top
linux
不会C语言的男孩3 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言