Python调用墨迹天气API实践指南
如何在 Java 中比较 DOCX 文档
在本文中,我们将了解如何通过带有 Java 代码示例的 Web API 进行调用,并且以编程的方式进行 DOCX 比较。
如果您花了很多时间在 MS Word 应用程序中创建和编辑文档,那么您很可能听说过(甚至使用过)DOCX 比较功能。这个简单的手动比较工具会生成一个三窗格视图,显示文件的两个版本之间的差异。这是一个有用的工具,可以总结法律合同(或其他类似的往往以模板开始的文档)在经过多轮协作编辑时所经历的历程。
尽管手动 DOCX 文档比较很有用,但它们仍然是手动的,这立即使它们在大规模上变得低效。不过,值得庆幸的是,DOCX 所基于的开源文件结构 – OpenXML – 旨在通过使程序员可以轻松访问 Office 文档文件结构来促进此类手动流程的自动化。使用正确的开发人员工具,您可以在自己的应用程序中大规模进行编程 DOCX 比较。
在本文中,您将学习如何通过调用带有Java代码示例的专用 Web API 以编程方式执行 DOCX 比较。这将帮助您自动执行 DOCX 比较,而无需了解 OpenXML 格式或编写大量新代码。不过,在开始演示之前,我们将首先简要回顾一下 OpenXML 格式,我们还将了解一个可用于在 Java 中读取和写入 Office 文件的开源库。
了解 OpenXML
OpenXML 格式已经存在很长时间了(自 2007 年以来),它是目前所有主要 Office 文档所基于的标准。
得益于 OpenXML 格式,所有 Office 文件(包括 Word(DOCX)、Excel(XLSX)、PowerPoint(PPTX)等)都被构建为开源 zip 档案,其中包含 XML 格式的压缩元数据、文件规范等。
通过将 Office 文件重命名为 .zip 文件,我们可以轻松地查看此文件结构。为此,我们可以将 CD 放入我们的 DOCX 文件目录之一(Windows),然后使用以下命令重命名我们的文件(将下面的示例文件名替换为我们自己的文件名):
ren "hello world".docx "hello world".zip
然后,我们可以打开 DOCX 文件的 .zip 版本并在文件档案中查找内容。
当我们在 MS Word 应用程序中打开 DOCX 文件时,我们的文件会被解压缩,然后我们可以使用各种内置应用程序工具来操作文件的内容。
这种开源文件结构使得构建读写 DOCX 文件的应用程序变得相对简单。举一个众所周知的例子,这就是 Google Drive 等程序可以在自己的文本编辑器应用程序中上传和操作 DOCX 文件的原因。如果对 OpenXML 结构有了很好的理解,我们可以构建自己的文本编辑器应用程序来操作 DOCX 文件(如果我们愿意的话)——但这将是一项艰巨的工作。考虑到已经存在用于此目的的应用程序和编程库的数量,这也不值得我们花时间。
使用 Java 编写 DOCX 比较
虽然 OpenXML SDK 是开源的(托管在 GitHub 上供任何人使用),但它是为与C#等 .NET语言一起使用而编写的。如果我们希望使用 Java 中的开源库自动执行 DOCX 比较,我们需要使用Apache POI 库之类的东西来构建我们的应用程序。
我们的流程大致包括:
- 将 Apache POI 依赖项添加到我们的 pom.xml
- 导入 XWPF 库(专为 OpenXML 文件设计)
- 编写一些代码来从我们的文档中加载和提取相关内容
第 3 部分开始变得复杂 – 我们需要编写一堆代码来检索和比较每个文档中的段落元素,如果我们想确保两个文档的格式一致(这对我们生成的比较文档很重要),我们需要将段落分解为几段。当然,在将 DOCX 比较结果写入新文件之前,我们需要实现我们自己的强大错误处理。
DOCX 的 Web API 优势比较
从头开始编写 DOCX 比较需要时间,而且文件处理操作的负担也会直接落在我们自己的服务器上。对于涉及较小 DOCX 文档的比较,这可能不是什么大问题,但对于较大文档和较大规模(更高容量)的操作,就会开始产生影响。
通过调用 Web API 来处理 DOCX 比较,我们将限制需要编写的代码量,并将比较工作流程中的繁重工作转移到外部服务器。这样,我们可以将更多的实际编码工作集中在构建应用程序中的强大功能上,以各种方式处理 DOCX 比较的结果。
示范
使用下面的代码示例,我们可以调用一个 API 来简化自动化 DOCX 比较的过程。我们不需要编写一堆新代码,只需复制相关示例、加载输入文件,然后将生成的比较字符串写入新的 DOCX 文件即可。
为了帮助演示我们的程序化比较的输出结果,我在下面附上了一个简单的 DOCX 比较结果的屏幕截图。此文档展示了经典 Lorem Ipsum 段落的两个版本的比较 – 一个包含所有原始拉丁文文本,另一个包含几行英文文本:
为了构建我们的 API 调用,我们可以先安装客户端 SDK。让我们添加对 pom.xml 存储库的引用:
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
让我们在 pom.xml 中添加对依赖项的引用:
<dependencies>
<dependency>
<groupId>com.github.Cloudmersive</groupId>
<artifactId>Cloudmersive.APIClient.Java</artifactId>
<version>v4.25</version>
</dependency>
</dependencies>
之后,我们可以将以下Import
内容添加到我们的控制器中:
// Import classes:
//import com.cloudmersive.client.invoker.ApiClient;
//import com.cloudmersive.client.invoker.ApiException;
//import com.cloudmersive.client.invoker.Configuration;
//import com.cloudmersive.client.invoker.auth.*;
//import com.cloudmersive.client.CompareDocumentApi;
现在我们可以将注意力转向配置。我们需要在以下配置代码段中提供一个免费的 Cloudmersive API 密钥(允许每月进行 800 次 API 调用,无需承诺):
ApiClient defaultClient = Configuration.getDefaultApiClient();
// Configure API key authorization: Apikey
ApiKeyAuth Apikey = (ApiKeyAuth) defaultClient.getAuthentication("Apikey");
Apikey.setApiKey("YOUR API KEY");
// Uncomment the following line to set a prefix for the API key, e.g. "Token" (defaults to null)
//Apikey.setApiKeyPrefix("Token");
接下来,我们可以使用下面的最终代码示例来创建 API 的实例并调用 DOCX 比较函数:
CompareDocumentApi apiInstance = new CompareDocumentApi();
File inputFile1 = new File("/path/to/inputfile"); // File | First input file to perform the operation on.
File inputFile2 = new File("/path/to/inputfile"); // File | Second input file to perform the operation on (more than 2 can be supplied).
try {
byte[] result = apiInstance.compareDocumentDocx(inputFile1, inputFile2);
System.out.println(result);
} catch (ApiException e) {
System.err.println("Exception when calling CompareDocumentApi#compareDocumentDocx");
e.printStackTrace();
}
现在我们只需几行代码就可以轻松实现 DOCX 比较的自动化。如果我们输入的 DOCX 文件包含任何错误,端点将在进行比较之前尝试自动修复文件。
结论
在本文中,我们了解了 MS Word DOCX 比较工具,并讨论了如何自动执行 DOCX 比较(得益于 OpenXML 格式)。然后,我们通过 Java 代码示例学习了如何调用低代码 DOCX 比较 API。
原文链接:https://dzone.com/articles/how-to-compare-docx-documents-in-java