Как стать автором
Обновить

Опыт формирование документов

Введение


Судьба подкинула интересную задачку — на сервере по заданому образцу формировать документы, вся прелесть заключается в том, что это строгий документ, т.е. своевольностей не допускается, порядок букв продиктован формой утвержденной кабинетов министров и т.д и т.п.

Первоначально задачка казалась простой, возможно даже примитивной, сверстать в Ворде шаблончик, забить поля для нужных данных, малость разметки и в формирователе тупо подставляем чего надо, документ готов. Делов-то.

А фига вам


Началось с того, что в качестве метки данных был выбрано чего типа field1, и первый сюрприз — field — это английский текст, 1 уже русский, так как документ по умолчанию русский И в документе это числилось как два различных элемента, поиск разваливался. Да и автозамена заглавных букв достала. Ну ладно в качестве лечения копируем в блокнот и снова вставка в ворд. Съело, пока документ не был открыт снова, прошелся своей орфографией и вся разметка в трубу. Вылечилось только отключением авто определения языка и проверки орфографии и никто уже и не знает чего еще ковырял в настройках. Редакции такие метки не поддавались ни какой, точнее Ворд их сразу рубил на кусочки.

После некоторых экспериментов с XMLDoc (есть такой формат) перешли на родной вордовский docx и к нему шаблонизатор нашелся, phpDoc/phpWord звался. Который и поламался, как только начал его кормить своим шаблоном, ковыряние показало — почему-то не работают регексы (ну не работает не жадный поиск и хоть процессор вырви, проверял и в командной строке, не жует и все), перепилил на обыкновенный поиск и дело пошло. Ура, результат кривее нету, а тут задачка еще усугубилась — документ должен экспортироваться также и в PDF. А у шаблонизатора на борту конвертор в PDF, который почему-то не работал, точнее криво парсил документ. Не годно.

Первое и самое простое, средствами OLE открываем Вордо документ и сохраняем как PDF, красота! 10 строчек и все как часы. Одна засада — никто не дает добро ставить официльный Ворд, а под нее закупать лицензированную Винду. Крах всех надежд.

Почухав репу нащупали решение — Libre тоже в Pdf может! Только вот открыт его по человечески не может. Облом.

Порывшись по просторам интернета, нашлось решение — клепаем html его прогоняем через шаблонизатор (еще один сообразить пришлось) протираем через библиотечку (использовалась mpdf), резултат pdf документ, кривой как мой кабель в сеть. Да и вот засада получается два шаблона, от чего руководство было не в восторге. Начал задумыватсья из html сбить doc.

Рассматривались онлайн сервисы, но у них то нет автоматизации, то платные. Проверил LiveDocX, уже к Zend прикручен — облом полный, документ кривущий, да и на халяву только 200 в день остальные $30 в месяц. Идите вы, по некоторым серверам за $30 в год то что надо выдают. Не то.

Жесть, даже гугл ушел в аут. Это тупик, начинаются перебираться варианты vine word, всевозможные конвертеры, кстати нашел интересную альтернативу MS Office — WPS Office весу крохи (изначально затачивался под мобилы) функционал почти тот же, и личико слизали, естественно халява + полноценный русский перевод.

К теме — кошмар, ужас, отчаяние и не определенность, тут еще и «Не желаете ли обновить вашу систему», да обновляй. ЧУДО!!! Свершилось! Libre 5! Корректно читает docx! О да, святой update.

Далее дело техники, гугль рассказал как устроить конвертацию в командной строке, и можно не ставить графику (что на сервере только кстати), скармливаем наши шаблончики, сформированные данные, и то, что так хотелось видеть. Почти.

Осталась разгребсти еще кое-какие засады. Первая — стили. В Ворде разметка стилей по умолчанию одна, В Либре другая, и результат совсем как неожиданный. Лечение — во всем документе всем элементам по максимуму прописываем пользовательские стили. Вуаля — все цивильненько, хотя и занудило, шаблон то не один, но и 100.

Вторая переносы между страницами — в тексте есть логические блоки, которые нельзя разрывать, ну это решилось просто — выделяем интересующий блок -> Абзац -> Свойства -> Не разрывать и вооля красота!

Третья — Таблицы (главная беда, из за которой вся канитель) — беда та же слетает разметка стилей, переносы между страницами, лечение тоже, только в свойствах таблицы. Но главная беда в заголовке, точнее в шапке, если табличка продолжается на новой странице, то и подпишите, что это за колонки, а сам шапка, на пол листа, и под ней строчка с нумерацией колонок. Ничего лучше не нашлось, как разделить на 2 таблицы и сделать их не разрывными.

Финишный марафет и всем даже понравилось.

Еще засады. как оказалась Либра 5 коректно читает, а вот сохранить в docx корректно уже не умеет. По сему возникло резонное предложение — использовать не docx, а odt. Засада — MS Word корректно не читает. Похоже разработчики решили нагадить друг другу. Зато просто doc все жуют замечательно, только вот шаблонизатора не него не встречалось.

Вывод


В принципе задача была решена положительно. Изначально использовать docx похоже не самое удачное решение, с odt вроде получше, но после шаблонизации его обязательно надо конвертировать в doc, иначе Ворд не съест. Похоже раз используется свободное ПО то использовать до последнего байта. Опыт — сын ошибок трудных.

P.S.: Извиняюсь за отсутствие точных деталей, просто хотел показать с какими проблемами появляются, когда производишь вроде банальную задачу формирование документов. Надеюсь кому-то удастся избежать моих граблей.

А пока судьба закинула новую задачку — посчитать количество страниц в разделе (считалка на борту), как всегда MS и Libre не дружат. Как разрулил, в другой раз.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.