15 февраля 2011 г.

конвертирование документов

В базе хранятся MSWord'овские документы. Встала задача преобразовывать их в PDF. Решили, что лучше всего подойдет для этих целей OpenOffice - кросплатформенный, из коробки умеет в PDF сохранять. Для доступа к ООо использовали JODConverter (чтоб не заморачиватся).

Можно использовать и форки ООо - пробовал и на стандартном OpenOffice.org и LibraOffice - работает.
ООо запускается, что бы слушать на порту 8100, примерно так:
soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard 
а далее на java уже пишем простейший код для преоброзования "всего во вся". Пример с сайта:

File inputFile = new File("document.doc");
File outputFile = new File("document.pdf");
 
// connect to an OpenOffice.org instance running on port 8100
OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);
connection.connect();
 
// convert
DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
converter.convert(inputFile, outputFile);
 
// close the connection
connection.disconnect();
 работает не сказать что бы уж совсем шустро, особенно на больших документах, но, по моему, быстрее многих PDF-принтеров. Тем более, что для PDF-принтера все равно необходимо приложение "источник" (WSWord).
Да, чуть не забыл, на 7-ке не хватает версии java что бы выполнятся. Впринципе есть исходники JODConverter и проект OpenSource...

Основные проблемы были с самим OOo, как то,
 - не все документы WSWord правильно понимаются\отображаются в ООо,
 - на Linux нет всех Windows шрифтов, поэтому ООо не всегда правильно отображает документы сделанные с "красивыми" шрифтами.

По первой проблеме, сделать что-то сложно, только вручную подправить в MSWord'е, и проверить в ООо, что бы хоть как-то корректно было. Но не всегда получается. Была проблема со "сканами" вставленными в Word'овский документ. FineReader так делает. Там абсалютное позиционирование рисунков, которые ООо наотрез отказался правильно понимать. Решил проблему следющим образом: если возникали подозрения, что документ "скан" (по размеру, типу, и т.д.), его сначало конвертил в txt далее смотрел, что если текста нет (только переводы строки), то зачит это скан, далее его конвертил в HTML и правил в нем абсолютное позиционирование, и уже полученный HTML конвертил в PDF.

Проблема со шрифтами в Linux, решается, например, подсовыванием Виндовых шрифтов, можно это сделать только для ООо, например так: ООо - Font-FAQ...

Комментариев нет:

Отправить комментарий