乐趣区

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

在某些业务场景下,可能须要将 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() 办法也是能够的,只是转换后的文件大小相差了一倍,转换后的文件成果如下:

退出移动版