Java代码word转pdf



最近公司做的项目中有功能要对文件加水印,word文档加水印比较麻烦,于是就想将word类型文档转成pdf类型文档再进行处理,网上搜集了不少方法,也都试过,个人觉得比较好用的有两个,做个记录。

1、采用jacob插件实现


① 下载好的压缩包解压,将里面的dll文件放置在jre/bin目录下面 如 D:\work\jdk1.8\jre\bin

java代码word转pdf-后面的内容换行了 java代码实现word转pdf_System


②导入jacob.jar到项目

java代码word转pdf-后面的内容换行了 java代码实现word转pdf_word、pdf、office、wps_02


添加Maven依赖

<dependency>
            <groupId>com.jacob</groupId>
            <artifactId>jacob</artifactId>
            <version>1.19</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/main/resources/lib/jacob.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.6</version>
        </dependency>

③ 具体代码实现

/**
     * wordToPDF
     * @param sFilePath 传入文件
     * @param toFilePath 输出文件
     */
    public static void wordToPDF(String sFilePath,String toFilePath) {
        System.out.println("启动 Word...");
        long start = System.currentTimeMillis();
        ActiveXComponent app = null;
        Dispatch doc = null;
        try {
            app = new ActiveXComponent("Word.Application");
            app.setProperty("Visible", new Variant(false));
            Dispatch docs = app.getProperty("Documents").toDispatch();
            doc = Dispatch.call(docs, "Open", sFilePath).toDispatch();
            System.out.println("打开文档:" + sFilePath);
            System.out.println("转换文档到 PDF:" + toFilePath);
            File tofile = new File(toFilePath);
            if (tofile.exists()) {
                tofile.delete();
            }
            Dispatch.call(doc, "SaveAs", toFilePath, // FileName
                    17);//17是pdf格式
            long end = System.currentTimeMillis();
            System.out.println("转换完成..用时:" + (end - start) + "ms.");

        } catch (Exception e) {
            System.out.println("========Error:文档转换失败:" + e.getMessage());
        } finally {
            Dispatch.call(doc, "Close", false);
            System.out.println("关闭文档");
            if (app != null)
                app.invoke("Quit", new Variant[]{});
        }
        // 如果没有这句话,winword.exe进程将不会关闭
        ComThread.Release();
    }

2、记录libreoffice实现office转pdf(适用于windows、linux)

LibreOffice提取地址:https://pan.baidu.com/s/1fmIiMXgVACHp5GIXzIIZvA
提取码:k02b
提取完成直接安装即可,需要注意的是这款软件是通过cmd命令调用LibreOffice指令的,安装完成后需要配置环境变量(D:\Program Files\LibreOffice\program)。配置好后调用cmd命令,进入dos界面输入 soffice 调用启动LibreOffice程序则表示安装配置成功。

protected static final Logger logger = LoggerFactory.getLogger(SpireDocForJava.class);

    /**
     * 利用libreOffice将office文档转换成pdf
     *
     * @param inputFile 目标文件地址
     * @param pdfFile   输出文件夹
     * @return
     */
    public static boolean convertOffice2PDF(String inputFile, String pdfFile) {
        long start = System.currentTimeMillis();
        String command;
        boolean flag;
        String osName = System.getProperty("os.name");
        if (osName.contains("Windows")) {
            command = "cmd /c start soffice --headless --invisible --convert-to pdf:writer_pdf_Export " + inputFile + " --outdir " + pdfFile;
        } else {
            command = "libreoffice --headless --invisible --convert-to pdf:writer_pdf_Export " + inputFile + " --outdir " + pdfFile;
        }
        flag = executeLibreOfficeCommand(command);
        long end = System.currentTimeMillis();
        logger.debug("用时:{} ms", end - start);
        return flag;
    }

    /**
     * 执行command指令
     *
     * @param command
     * @return
     */
    public static boolean executeLibreOfficeCommand(String command) {
        logger.info("开始进行转化.......");
        Process process;// Process可以控制该子进程的执行或获取该子进程的信息
        try {
            logger.debug("convertOffice2PDF cmd : {}", command);
            process = Runtime.getRuntime().exec(command);// exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例。
            // 下面两个可以获取输入输出流
//            InputStream errorStream = process.getErrorStream();
//            InputStream inputStream = process.getInputStream();
        } catch (IOException e) {
            logger.error(" convertOffice2PDF {} error", command, e);
            return false;
        }
        int exitStatus = 0;
        try {
            exitStatus = process.waitFor();// 等待子进程完成再往下执行,返回值是子线程执行完毕的返回值,返回0表示正常结束
            // 第二种接受返回值的方法
            int i = process.exitValue(); // 接收执行完毕的返回值
            logger.debug("i----" + i);
        } catch (InterruptedException e) {
            logger.error("InterruptedException  convertOffice2PDF {}", command, e);
            return false;
        }
        if (exitStatus != 0) {
            logger.error("convertOffice2PDF cmd exitStatus {}", exitStatus);
        } else {
            logger.debug("convertOffice2PDF cmd exitStatus {}", exitStatus);
        }
        process.destroy(); // 销毁子进程
        logger.info("转化结束.......");
        return true;
    }

    public static void main(String[] args) {
        try {
            // 建议都用/左斜杠这种,左斜杠是windows和linux通用的
            convertOffice2PDF("E:/信用卡互联网发卡业务补充合作协议2019.01.docx","E:/测试.pdf");
        } catch (Exception e) {
            System.out.println("word转换成pdf时出错");
            e.printStackTrace();
        }
    }

解压这三个包 (下面操作都要执行)

wget http://mirrors.ustc.edu.cn/tdf/libreoffice/stable/6.2.8/rpm/x86_64/LibreOffice_6.2.8_Linux_x86-64_rpm.tar.gz
wget http://mirrors.ustc.edu.cn/tdf/libreoffice/stable/6.2.8/rpm/x86_64/LibreOffice_6.2.8_Linux_x86-64_rpm_sdk.tar.gz
wget http://mirrors.ustc.edu.cn/tdf/libreoffice/stable/6.2.8/rpm/x86_64/LibreOffice_6.2.8_Linux_x86-64_rpm_langpack_zh-CN.tar.gz

tar -xvf LibreOffice_6.2.8_Linux_x86-64_rpm.tar.gz

tar -xvf LibreOffice_6.2.8_Linux_x86-64_rpm_sdk.tar.gz

tar -xvf LibreOffice_6.2.8_Linux_x86-64_rpm_langpack_zh-CN.tar.gz

java代码word转pdf-后面的内容换行了 java代码实现word转pdf_Windows_03


解压后进入LibreOffice_6.2.8_Linux_x86-64_rpm/RPM目录下并执行yum localinstall *.rpm安装rpm文件

java代码word转pdf-后面的内容换行了 java代码实现word转pdf_子进程_04


执行以上步骤,默认会将libreoffice的可执行安装在/opt/lib/libreoffice/…soffice.bin,也可以使用yum来指定安装路径:

yum -c /etc/yum.conf --installroot=/usr/local --releasever=/ localinstall *.rpm
该命令简单解释如下:
-c /etc/yum.conf 表示指定yum配置文件地址
–installroot=/usr/local 表示指定自定义的安装目录

linux下面命令行测试word转pdf(其参数与windows下的参数大体相同)
命令:libreoffice6.2 --convert-to pdf:writer_pdf_Export /home/file/测试.docx --outdir /home/file/

关于word转pdf中文乱码问题处理
1:查看fonts目录:cat /etc/fonts/fonts.conf | grep fon
得知字体存放位置:/usr/share/fonts

2: 把Windows下的字体C:\Windows\Fonts下的宋体,即simsun.ttc上传到linux服务器
在fonts下新建Fonts文件 把字体上传到该路径下即可