Конвертация doc в pdf с сохранением оригинального форматирования на Java
Собственно, как реализовать конвертацию .doc в .pdf так, чтобы полученный файл сохранил то же форматирование, что и оригинальный файл. Из-за специфики проекта работать приходится только с потоками InputStream/OutputStream, возможности сохранять где-то на сервере промежуточные файлы нет. Файл, при этом, может содержать не только текст, но и изображения, таблицы. Пробовал самый, наверное, простой вариант - библиотеку JodConverter + LibreOffice/OpenOffice, но либра почему-то вообще убирает все автоматические переносы, а ОО расставляет их по-своему, что, в конечном итоге, сильно меняет вид получаемого документа. Пробовал вариант с Apache POI, но не смог разобраться с тем, как заставить его работать только со стримами. Кусок кода с JodConverter и либрой выглядит примерно так:
public static FileObject convertJod(final IFile file, final String toExt) throws IOException {
ByteArrayInputStream inputStream = new ByteArrayInputStream(file.getFileData());
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
final DocumentFormat sourceFormat = DefaultDocumentFormatRegistry.getFormatByExtension(
FilenameUtils.getExtension(file.getFileName()));
final DocumentFormat targetFormat = DefaultDocumentFormatRegistry.getFormatByExtension(toExt);
final LocalOfficeManager localOfficeManager = LocalOfficeManager
.builder()
.install()
.processTimeout(ONE_HOUR)
.taskExecutionTimeout(ONE_HOUR)
.maxTasksPerProcess(200)
.officeHome("/opt/libreoffice7.1")
.build();
try {
localOfficeManager.start();
JodConverter
.convert(inputStream)
.as(sourceFormat)
.to(outputStream)
.as(targetFormat)
.execute();
}
catch (OfficeException e) {
_log.error(e.getMessage(), e);
}
finally {
OfficeUtils.stopQuietly(localOfficeManager);
}
final String fileName = FileUtility.getFileNameWithoutExtension(file.getFileName()) + DOT + toExt;
byte[] resultArray = outputStream.toByteArray();
return new FileObject(fileName, MimeTypeRegistry.getMimeTypeByFileExtension(toExt), resultArray);
}