关于java:使用Jacob实现将Word文件转换为Pdf文件

43次阅读

共计 4114 个字符,预计需要花费 11 分钟才能阅读完成。

在某些业务场景下,可能须要将 Word 文件转换为 Pdf 文件的需要,Word 文件编辑不便,而 Pdf 文件查看更不便,并且格局根本不会变动,同时能够防止被误编辑。

如果应用的是 Java 语言,那么能够借助于 Jacob 开源库实现将 Word 文件转换为 Pdf 文件,Jacob 是什么呢?先看看官网定义

Jacob 是一个 Java 库,可让 Java 应用程序与 Microsoft Windows DLL 或 COM 库进行通信,它应用 Jacob Java 类通过 JNI 与之通信的自定义 DLL 来实现这一点。

也就是说 Jacob 的实现形式是通过 jacob.dll 调用零碎本地装置的 Office 来实现转换,因而应用 Jacob 也有肯定的限度:

  • 因为是 dll 库,所以必须是在 Windows 零碎环境;
  • 零碎须要先装置 Office Word 利用,比方 MicroSoft Office 或者 WPS Office;

上面通过具体的实际操作和代码来演示。

1、引入 Jacob 依赖

jacob 在 github 上的官网地址为:https://github.com/freemansoft/jacob-project,目前最新版本为 1.20,如下:

如果是首次应用 jacob,倡议先间接从 github 上下载 zip 包,因为在实现 Word 转 Pdf 的时候,不仅须要用到 jacob.jar,还须要 jacob.dll 库,而 zip 包中都有。

为了不便前期的应用,能够把下载的 jar 装置到本地的 maven 库中,具体应用的命令如下:

mvn install:install-file    
    -Dfile=C:\Users\admin\Downloads\jacob-1.20\jacob.jar  # 配置 jar 包文件所在的地位
    -DgroupId=com.jacob  # 配置生成 jar 包对应的 groupId
    -DartifactId=jacob   # 配置生成 jar 包对应的 artifactId
    -Dpackaging=jar    # 配置文件的打包形式, 此处为 jar
    -Dversion=1.20    # 配置版本号, 只有合乎 Maven 的版本命名标准即可 

简写成一行的话,如下:

mvn install:install-file -Dfile=C:\Users\admin\Downloads\jacob-1.20\jacob.jar -DgroupId=com.jacob -DartifactId=jacob -Dpackaging=jar -Dversion=1.20

命令执行胜利后,就能够在本地仓库看到相似的文件

至此,当前就能够间接在 pom.xml 文件退出以下依赖进行援用

<dependency>
    <groupId>com.jacob</groupId>
    <artifactId>jacob</artifactId>
    <version>1.20</version>
</dependency>

2、拷贝 jacob.dll 文件

jacob.dll 文件分为 x86 和 x64 的,依据本身零碎来进行抉择,这里拷贝 jacob-1.20-x64.dll 文件到 jdk/bin 或者 jdk/jre/bin 目录下都能够,这里抉择将其拷贝至 jdk/jre/bin 目录中,如下:

官网应用文档能够参考:https://github.com/freemansoft/jacob-project/blob/main/docs/UsingJacob.md

3、代码实现

package com.magic.jacob;

import java.io.File;
import java.nio.file.Files;
import java.util.Objects;

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;

/**
 * Word 转 PDF 工具类
 */
public class WordToPdfUtils {

    /** word 转换为 pdf 的格局宏,值为 17 */
    private static final int WORD_FORMAT_PDF = 17;
    private static final String MS_OFFICE_APPLICATION = "Word.Application";
    private static final String WPS_OFFICE_APPLICATION = "KWPS.Application";

    /**
     * 微软 Office Word 转 PDF
     * 如果无奈转换,可能须要下载 SaveAsPDFandXPS.exe 插件并装置
     * @param wordFile Word 文件
     * @param pdfFile Pdf 文件
     */
    public static void msOfficeToPdf(String wordFile, String pdfFile) {wordToPdf(wordFile, pdfFile, MS_OFFICE_APPLICATION);
    }

    /**
     * WPS Office Word 转 PDF
     * @param wordFile Word 文件
     * @param pdfFile Pdf 文件
     */
    public static void wpsOfficeToPdf(String wordFile, String pdfFile) {wordToPdf(wordFile, pdfFile, WPS_OFFICE_APPLICATION);
    }

    /**
     * Word 转 PDF
     * @param wordFile Word 文件
     * @param pdfFile Pdf 文件
     * @param application Office 利用
     */
    private static void wordToPdf(String wordFile, String pdfFile, String application) {Objects.requireNonNull(wordFile);
        Objects.requireNonNull(pdfFile);
        Objects.requireNonNull(application);

        ActiveXComponent app = null;
        Dispatch document = null;
        try {File outFile = new File(pdfFile);
            // 如果指标门路不存在, 则新建该门路,否则会报错
            if (!outFile.getParentFile().exists()) {Files.createDirectories(outFile.getParentFile().toPath());
            }

            // 如果指标文件存在,则先删除
            if (outFile.exists()) {outFile.delete();
            }

            // 这里须要依据以后环境装置的是 MicroSoft Office 还是 WPS 来抉择
            // 如果装置的是 WPS,则须要应用 KWPS.Application
            // 如果装置的是微软的 Office,须要应用 Word.Application
            app = new ActiveXComponent(application);
            app.setProperty("Visible", new Variant(false));
            app.setProperty("AutomationSecurity", new Variant(3));

            Dispatch documents = app.getProperty("Documents").toDispatch();
            document = Dispatch.call(documents, "Open", wordFile, false, true).toDispatch();

            Dispatch.call(document, "ExportAsFixedFormat", pdfFile, WORD_FORMAT_PDF);
        } catch (Exception e) {e.printStackTrace();
        } finally {if (document != null) {Dispatch.call(document, "Close", false);
            }

            if (app != null) {app.invoke("Quit", 0);
            }

            ComThread.Release();}
    }
}

如果找不到 dll 文件,则会报错,具体错误信息如下:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no jacob-1.20-x64 in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)
    at java.lang.Runtime.loadLibrary0(Runtime.java:870)
    at java.lang.System.loadLibrary(System.java:1122)
    at com.jacob.com.LibraryLoader.loadJacobLibrary(LibraryLoader.java:184)
    at com.jacob.com.JacobObject.<clinit>(JacobObject.java:110)
    at com.magic.springlearning.jacob.WordToPdfUtils.officeToPdf(WordToPdfUtils.java:31)
    at com.magic.springlearning.jacob.WordToPdfUtils.main(WordToPdfUtils.java:17)

4、测试验证

public static void main(String[] args) {wpsOfficeToPdf("D:\\Test\\test_word.docx", "D:\\Test\\test_word.pdf");
}

因为本地装置的是 WPS Office,所以抉择 wpsOfficeToPdf() 办法,通过测试,如果抉择 msOfficeToPdf() 办法也是能够的,只是转换后的文件大小相差了一倍,转换后的文件成果如下:

正文完
 0