Я начал изучать, как конвертировать .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 были более точными с точки зрения позиции, но, как я уже сказал, в них отсутствовала информация. Мои тесты проводились на бланках документов, созданных таким же образом, а недостающая информация всегда была в одном и том же месте.
У меня следующие вопросы:
- Существует ли сертифицированный способ правильного преобразования файла .docm в файл .docx с библиотеками с открытым исходным кодом?
- Что такоеЧто-то не так, когда я использую document4j для создания PDF-файлов?
- Как я могу включить комментарии MS Word с помощью docx4j?
- Есть ли какие-либо альтернативы моему выбору библиотек? (Только с открытым исходным кодом)
РЕДАКТИРОВАТЬ: Я забыл указать, что я использую последнюю версию из каждой библиотеки.