Как сравнить документы DOCX на Java
Если вы потратили много времени на создание и редактирование документов в приложении MS Word, велика вероятность, что вы слышали (и, возможно, даже использовали) функцию сравнения DOCX. Этот простой инструмент сравнения вручную создает трехпанельное представление, отображающее различия между двумя версиями файла. Это полезный инструмент для подведения итогов того, как юридические контракты (или другие подобные документы, которые, как правило, начинаются как шаблоны) проходят несколько раундов совместного редактирования.
Какими бы полезными ни были сравнения документов DOCX вручную, они все равно выполняются вручную, что сразу же делает их неэффективными в масштабе. К счастью, файловая структура с открытым исходным кодом, на которой основан DOCX — OpenXML — предназначена для облегчения автоматизации подобных ручных процессов, делая файловую структуру документов Office легко доступной для программистов. С помощью подходящих инструментов разработчика вы можете проводить программные масштабные сравнения DOCX в своих собственных приложениях.
В этой статье вы узнаете, как выполнять сравнения DOCX программно, вызывая специализированный веб-API с примерами кода на Java. Это поможет вам автоматизировать сравнение DOCX без необходимости разбираться в форматировании OpenXML или писать тонну нового кода. Однако, прежде чем мы перейдем к нашей демонстрации, мы сначала кратко рассмотрим форматирование OpenXML, а также узнаем о библиотеке с открытым исходным кодом, которую можно использовать для чтения и записи файлов Office на Java.
Понимание OpenXML
Форматирование OpenXML существует уже давно (с 2007 года), и в настоящее время это стандарт, на котором основаны все основные документы Office.
Благодаря форматированию OpenXML все файлы Office, включая Word (DOCX), Excel (XLSX), PowerPoint (PPTX) и другие, структурированы как zip-архивы с открытым исходным кодом, содержащие сжатые метаданные, спецификации файлов и т.д. В формате XML.
Мы можем легко проверить эту файловую структуру для себя, переименовав файлы Office в zip-файлы . Для этого мы можем зайти на диск в один из каталогов нашего файла DOCX (Windows) и переименовать наш файл, используя приведенную ниже команду (заменив примерное имя файла ниже вашим собственным именем файла):
ren «hello world».docx «привет, мир».zip
Затем мы можем открыть ZIP-версию нашего файла DOCX и покопаться в нашем файловом архиве.
Когда мы открываем файлы DOCX в нашем приложении MS Word, наши файлы распаковываются, и затем мы можем использовать различные встроенные инструменты приложения для манипулирования содержимым наших файлов.
Эта файловая структура с открытым исходным кодом позволяет относительно просто создавать приложения, которые читают и записывают файлы DOCX. Это, используя хорошо известный пример, причина, по которой такие программы, как Google Drive, могут загружать файлы DOCX и манипулировать ими в своих собственных приложениях текстового редактора. Имея хорошее представление о структуре OpenXML, мы могли бы создавать наши собственные приложения для редактирования текста для работы с файлами DOCX, если бы захотели – просто это потребовало бы МНОГО работы. Это также не стоило бы нашего времени, учитывая количество приложений и программных библиотек, которые уже существуют именно для этой цели.
Написание сравнений DOCX на Java
Хотя OpenXML SDK имеет открытый исходный код (размещен на GitHub для любого пользователя), он написан для использования с.ЧИСТЫЕ языки, такие как C #. Если бы мы хотели автоматизировать сравнение DOCX с помощью библиотеки с открытым исходным кодом на Java, нам нужно было бы использовать что-то вроде библиотеки Apache POI для создания нашего приложения.
Наш процесс примерно повлечет за собой:
Добавление зависимостей Apache POI в наш pom.xml
Импорт библиотеки XWPF (предназначена для файлов OpenXML)
Написание некоторого кода для загрузки и извлечения релевантного содержимого из наших документов
В части 3 все начнет усложняться — нам нужно будет написать кучу кода для извлечения и сравнения элементов абзаца из каждого документа, и если мы хотим обеспечить согласованное форматирование в обоих наших документах (что важно для нашего итогового документа сравнения), нам нужно будет разбить наши абзацы на прогоны. Затем нам, конечно, нужно было бы реализовать нашу собственную надежную обработку ошибок, прежде чем записывать результат сравнения DOCX в новый файл.
Преимущества веб-API для сравнения DOCX
Написание нашего сравнения DOCX с нуля потребовало бы времени, а также возложило бы всю нагрузку по обработке файлов непосредственно на наш собственный сервер. Возможно, это не имеет большого значения для сравнений, связанных с документами DOCX меньшего размера, но это может сказаться на документах большего размера и более масштабных операциях (с большим объемом).
Вызывая вместо этого веб-API для обработки нашего сравнения DOCX, мы ограничим объем кода, который нам нужно написать, и перенесем тяжелую работу по нашему процессу сравнения на внешний сервер. Таким образом, мы сможем сосредоточить больше наших практических усилий по программированию на создании надежных функций в нашем приложении, которые обрабатывают результаты наших сравнений DOCX различными способами.
Демонстрация
Используя приведенные ниже примеры кода, мы можем вызвать API, который упрощает процесс автоматизации сравнений DOCX. Вместо того, чтобы писать кучу нового кода, нам просто нужно скопировать соответствующие примеры, загрузить наши входные файлы и записать результирующие строки сравнения в новые собственные файлы DOCX.
Чтобы продемонстрировать, как выглядит результат нашего программного сравнения, я включил скриншот простого результата сравнения DOCX ниже. В этом документе показано сравнение двух версий классического отрывка из Lorem Ipsum – одна содержит весь исходный текст на латинице, а другая содержит несколько строк текста на английском:
Скриншот простого результата сравнения DOCX
Для вызова API, мы можем приступить к установке SDK клиента. Давайте добавим ссылку на наш репозиторий pom.xml :
XML
И давайте добавим ссылку на зависимость в нашем pom.xml:
XML
После этого мы можем добавить следующее Import в наш контроллер:
Java
// 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 в месяц без каких-либо обязательств) в следующем фрагменте конфигурации:
Java
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:
Java
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 содержат какие-либо ошибки, конечная точка попытается автоматически восстановить файлы перед выполнением сравнения.
Заключение
В этой статье мы узнали об инструменте сравнения DOCX в MS Word и обсудили, как можно автоматизировать сравнение DOCX (благодаря форматированию OpenXML). Затем мы узнали, как вызвать низкокодированный API сравнения DOCX с примерами кода Java