Конвертация 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);
}

Ответы (0 шт):