首页 > 编程语言 >java 使用documents4j将word转pdf

java 使用documents4j将word转pdf

时间:2023-11-14 20:23:34浏览次数:32  
标签:java File word return file pdf 转换 documents4j

documents4j 简介

document4j是一个用来进行文档格式转换的Java工具库,它通过借助本机中支持指定文件格式到目标文件格式转换的应用,来实现整个转换的过程。
document4j 实现了Microsoft Word、Excel的适配功能,可以将docx文件转换为pdf文件,并且在这个过程中不会出现非微软文件转换出现的扭曲情况。

  • documents4j 两个转换策略

本地策略

在本地版的实现策略中,document4j将指定文件的转换任务委派给本机中相应的应用程序。因此,为了保证正常运行,这台机器需要在后台预装好支持转换的软件,诸如MicrosoftWord / Excel 。
document4j提供了一套简单易用的机制允许用户注册自定义的转换器,同时将具体的实现细节和Microsoft Word / Excel 进行对接结合。

远程策略

在远程版的实现策略中,document4j将文档的转换工作通过REST-API的方式提供到远程的服务端进行转换。在这个过程中,请求方将文件与相关的格式转换信息发送到服务器端,转换完毕后,转换完成的文件将通过response的方式传输回来。
对于document4j的用户来说,这些实现方式都是完全透明的。因此,用户完全可以在本地开发与测试的时候,采用本地版的实现策略,而在生产环境中,完全透明地切换成远程实现模式。所以,后台转换功能也更容易进行模拟操作。

documents4j 使用

documents4j 是一个跨平台的文档转换库,并且可以在 Linux 上进行 Word 转 PDF 的操作。
它利用 Microsft Office 的 APIs 来进行文档转换,因此需要在Linux上安装 OpenOffice/LibreOffice 编辑器。

  1. 安装 OpenOffice/LibreOffice 编辑器

Ubuntu: sudo apt-get install libreoffice

CentOS:sudo yum install libreoffice

  1. 导包
<!--documents4j-->
<dependency>
    <groupId>com.documents4j</groupId>
    <artifactId>documents4j-local</artifactId>
    <version>1.0.3</version>
</dependency>
<!-- documents4j-->
<dependency>
    <groupId>com.documents4j</groupId>
    <artifactId>documents4j-transformer-msoffice-word</artifactId>
    <version>1.0.3</version>
</dependency>
  1. 引入word转pdf工具类

使用模板引擎将word生成,我这里使用的是 Poi-tl ,它在原有的 Apache POI 基础上做了一些扩展

package com.zl.utils;

import com.documents4j.api.DocumentType;
import com.documents4j.api.IConverter;
import com.documents4j.job.LocalConverter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class DocxToPdfUtil {
	// windows 生成目录
    private static String winDirUrl = "C:\\Users\\zl\\Documents\\";

    /**
     * 通过documents4j 实现word转pdf
     *
     * @param sourcePath 源文件地址 如 /root/example.doc
     */
    public static File documents4jWordToPdf(String sourcePath) {
        return documents4jWordToPdf(new File(sourcePath));
    }
	
    /**
     * 通过documents4j 实现word转pdf
     *
     * @param file 源文件
     */
    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(winDirUrl + file.getName().replaceAll("\\.(docx?|\\w+)$", "") + ".pdf");
        try {
            // 这种方式在Linux服务器不可用,所以除非你是window服务器
            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 = "libreoffice --convert-to pdf "
            + absolutePath + " --outdir " + parentPath;
        // 执行转换命令
        try {
            boolean result = 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;
        }
    }

    /**
     * 执行命令行
     *
     * @param cmd 命令行
     * @return
     * @throws IOException
     */
    private 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;
    }
}

标签:java,File,word,return,file,pdf,转换,documents4j
From: https://www.cnblogs.com/1399z3blog/p/17832438.html

相关文章

  • CS224n笔记:word2vec(1)
    目录离散语义(discrete):分布语义(distribute):tokens、types分布的语言模型(distributionallanguagemodel):词嵌入模型Word2VecObjectivefunc(目标函数)Lossfunc(损失函数)P(O|C)和Softmax(x)P(O|C)的概率分布将损失函数展开求梯度公式损失函数的时间复杂度ChainRule:链......
  • Java登陆第六天——SQL之约束
    约束约束用于确保数据库的数据满足特定的规则,多个约束可以作用于一个字段上。在mysql中,约束一般有:primarykey(主键)notnull(非空)unique(唯一)primarykey(主键)主键是唯一标识每一行的列(行也叫字段)。主键拥有以下特性:两种指定方式:创建表时指定:字段名字段类型pr......
  • Java -- Stream流用法
    1.前言流是Java8API添加的一个新的抽象,称为流Stream,以一种声明性方式处理数据集合,侧重对于源数据计算能力的封装,并且支持序列与并行两种操作方式。Stream流是从支持数据处理操作的源生成的元素序列,源可以是数组、文件、集合、函数。流不是集合元素,它不是数据结构并不保存数据......
  • JavaWeb--Servlet执行流程&生命周期
    Servlet的执行流程 Servlet生命周期 1、初始化使用了init()方法,只调用一次。2、提供服务使用service()方法(1)、调用时机:servlet被访问时,调用该方法(2)、调用次数:每一次servlet被访问就调用一次 3、服务中止时使用destory()方法,servlet对象被销毁调用时机:内存释放或者服务关闭的......
  • JavaScript知识点
    JavaScript提供的异步模式1、回调函数(callbacks)2、事件监听3、Promise对象call、apply的区别call和apply都是改变this指向的方法,区别在于call可以写多个参数,而apply只能写两个参数,第二个参数是一个数组,用于存放要传的参数。call和apply的好处用call和apply实现更好的继承和扩展,更......
  • 2023年最新!Java17于win10环境下的安装配置
    2023年最新!Java17于win10环境下的安装配置链接分享:oracle官网,Java17.exe,java17.zip导航目录2023年最新!Java17于win10环境下的安装配置导航一、下载Java17二、安装Java三、配置Java环境变量四、检验一、下载Java17这里使用Java17.exe程序为例,首先我们可以根据上面我给出的链......
  • 前端学习-JavaScript学习-JavaScript高级程序设计-第2章笔记
    在HTML中使用JavaScript元素<script>元素元素属性MDN<script>:脚本元素属性使用状态描述charset可选、少用字符集defer可选、少用表示脚本可以延迟至文档完全被解析后实行,部分浏览器不支持language废弃编写代码使用的语言src可选包含要执行代码的......
  • JavaScript实现Date( ) ——日期格式化的三种常用方法
    Date()介绍Date()基本使用Date()日期对象是构造函数,必须使用new来调用我们的日期对象。若Date()没有参数时返回当前时间若Date(timer)有参数时返回参数设置的时间参数写法:'2012-2-208:54:32'(字符串)返回值格式:SunMay28202323:36:28GMT+0800(中国标准时间)......
  • JavaScript slice 方法用法与实例解析
    在JavaScript中,slice()是一个常用的数组方法,用于从现有数组中提取一部分元素,然后返回一个新的数组。它是一个非常有用的工具,可以帮助你在不改变原始数组的情况下操作数组的子集。本文将介绍slice()的基本概念、使用方法、实践案例和互动练习,以帮助你更好地理解和掌握这一功能......
  • Java非对称加密RSA算法
    简介:公开密钥密码学(英语:Public-keycryptography)也称非对称式密码学(英语:Asymmetriccryptography)是密码学的一种算法。加密与解密使用不同的密钥,其中一个称之为公钥,对外公开,通常用于数据加密。另一个称之为私钥,是不能对外公布的,通常用于数据解密,这样使用公钥加密的数据即使被......