Как правильно конвертировать из DOCM в PDF с помощью Java-библиотек с открытым исходным кодом? - PullRequest
1 голос
/ 25 октября 2019

Я начал изучать, как конвертировать .docm файлы в PDF-файлы. Насколько я посмотрел, есть только библиотеки с открытым исходным кодом для преобразования .docx в pdf. Мое решение состояло в том, чтобы искать способ преобразовать .docm в .docx, сохраняя каждую информацию. Для этого я не смог найти подходящее решение с открытым исходным кодом, но я нашел отправку для apache-poi ( ссылка ). Используя код, найденный в этом коммите, мне удалось создать файлы .docx со всей информацией, которую содержал мой файл .docm.

        String dir = "<directory>";
    for (int i = 1; i < 41; i++) {
        File f = new File(dir + File.separator + i + ".docm");
        File target = new File(dir + "output" + i + ".docx");
        try {
            new DocumentConverter(f).toDocx(target);
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }

Я скопировал код из ссылки и использовал его вышеуказанным способом.

Как только у меня были файлы .docx со всей информацией, я начал преобразовывать их в файлы .pdf. Для этого я нашел 2 возможные библиотеки с открытым исходным кодом, docx4j и documents4j .

Docx4j конвертировать в pdf-код:

    try {
            Docx4J.toPDF(WordprocessingMLPackage.load(target), new FileOutputStream(dir + "out" + i + ".pdf"));
        } catch (FileNotFoundException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (Docx4JException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

Это даст мне PDF-файл, содержащий всю информацию, кроме комментариев MS Word.

Documents4j конвертируется в pdf-код:

try (ByteArrayOutputStream bo = new ByteArrayOutputStream()) {
                try (InputStream in = new BufferedInputStream(new FileInputStream(target));) {
                    IConverter converter = LocalConverter.builder()
                            .baseFolder(new File(dir))
                            .workerPool(20, 25, 2, TimeUnit.SECONDS)
                            .processTimeout(5, TimeUnit.SECONDS)
                            .build();

                    Future<Boolean> conversion = converter
                            .convert(in).as(DocumentType.DOC)
                            .to(bo).as(DocumentType.PDF)
                            .prioritizeWith(1000) // optional
                            .schedule();
                    conversion.get();
                    try (OutputStream outputStream = new FileOutputStream("out"+ i +".pdf")) {
                        bo.writeTo(outputStream);
                    }
                    converter.shutDown();
                } 
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InterruptedException | ExecutionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } 

Это даст мне PDF-файл, который выглядит хорошо и содержит комментарии MS Word.

Дальнейшее тестирование показало, что pocs docx4j были точными в тексте, но позиции были изменены (например: параграфы объединены или разделены на две части). PDF-файлы из documents4j были более точными с точки зрения позиции, но, как я уже сказал, в них отсутствовала информация. Мои тесты проводились на бланках документов, созданных таким же образом, а недостающая информация всегда была в одном и том же месте.

У меня следующие вопросы:

  1. Существует ли сертифицированный способ правильного преобразования файла .docm в файл .docx с библиотеками с открытым исходным кодом?
  2. Что такоеЧто-то не так, когда я использую document4j для создания PDF-файлов?
  3. Как я могу включить комментарии MS Word с помощью docx4j?
  4. Есть ли какие-либо альтернативы моему выбору библиотек? (Только с открытым исходным кодом)

РЕДАКТИРОВАТЬ: Я забыл указать, что я использую последнюю версию из каждой библиотеки.

1 Ответ

0 голосов
/ 27 октября 2019

documents4j делегирует реальную работу в MS Word через скрипт VBS, поэтому любые изменения в результате происходят из-за конфигурации в скрипте. Вы можете попытаться поэкспериментировать с ним, чтобы увидеть, можете ли вы включить в Word тот контент, который вам не хватает: https://github.com/documents4j/documents4j/blob/master/documents4j-transformer-msoffice/documents4j-transformer-msoffice-word/src/main/resources/word_convert.vbs

Просто создайте проект и посмотрите, как изменения повлияют на вывод.

...