Привет, девелоперы. Скажите мне, пожалуйста – а как нынче люди всяки сложные документы генерируют?
Вот смотрите, какая ситуация.
Есть самодельная система, которая управляет прохождением заказов в типографии.
На самом деле, неважно, чем она там управляет — если будет интересно, я расскажу, но вопрос не в этом. Самое главное – что все работает в браузере.
Вопрос в том, что оттуда генерируются документы. Счета, счета-фактуры, акты, накладные и прочая бухгалтерская убоина.
И затык состоит именно в том, как генерить эти самые документы.
Сейчас все происходит так:
— берем xls-файлик с документом, пишем в нем на местах для заполнения {ПОКУПАТЕЛЬ_ОРГАНИЗАЦИЯ}, {СЧЕТ_НОМЕР} и все такое, конвертируем его в html, этот html читаем в php строкой, потом str_replace’ом меняем {СЧЕТ_НОМЕР} на то, что нужно, и отдаем этот html в браузер пользователю.
Недостатки этого в том, что довольно хреново из него делается PDF, и уж совсем хреново — что-нибудь редактируемое, типа того же xls или ods.
Плюсы в том, что генерится очень быстро и юзер может сразу его распечатать.
Идея есть такая:
— берем xls-файлик, делаем из него ods, и пользуясь тем, что это, по-сути, zip-архив с xml-файликами, делаем все в принципе то же самое (str_replace), но с файлом content.xml из этого архива, тем самым меняя содержание документа. Потом запаковываем content.xml обратно в ods-файлик, и можем отдать его пользователю.
На сервере, в свою очередь, стоит libreoffice без графики, который может ods-документ конверитровать в PDF.
Плюсы в том, что мы генерируем гораздо более предсказуемый документ (чем в случае с html-ом), из которого потом получается очень красивый и правильный DPF.
Но есть и минусы. PDF генерится достаточно долго — до 10 секунд. Пользователь вынужден либо ждать, либо скачивать ODS и открывать его. А ему, предположим, всего лишь распечатать надо. Слишком дофига действий, как по мне.
В общем-то, я бы остановился на этом варианте, если бы не тормоз со стороны офиса. Очень чувствуется вот эта вот 10-секунная задержка. Ситуация, когда менеждер открывает заказ, вносит позиции и генерирует счет предполагает непрерывность, и эта задержка даже мне действует на нервы — представляю, каково придется менеджерам, которые с этим работать будут.
Расскажите мне — может я чего-то не знаю? Может быть, все давно уже пользуются некой системой для генерации документов из чего угодно, а я один ни сном ни духом? А вы бы как решали такую задачу? Так же, или все же есть что-то покрасивее, чем мой велосипед?

Tagged with →  

24 Responses to Привет, девелоперы.

  1. Nirer:

    Вопрос в том, что оттуда генерируются документы. Счета, счета–фактуры, акты, накладные и прочая бухгалтерская убоина.

    1с?

  2. Ur2Dead:

    не-не, не вариант. Я думал об этом одно время — но херня получается. К 1С-у нужен же интерфейс, чтобы я ей текст отдал, а она мне в ответ файлик. Такого нет (ну, я не нашел). Да и к тому же в каком формате она мне файлик отдаст?
    Ну и до кучи — серв, на котором все это крутится — на FreeBSD. Не получится с 1С.

  3. Issen:

    адинцэ начиная с 8.1 с FreeBSD работает. Вот описание
    а во-вторых, что мешает для печати формировать вывод в html вообще сразу? с использованием css media-query.
    если надо парсить xls прямо в пхп — вот

    конечно, мог глупость сказать, пост по диагонали читал.

  4. Ur2Dead:

    нет, 1С — не то, что нужно. Даже если я поставлю ее на фряху на свою — коннекта-то к ней все равно нет.
    Схема такая, вкратце:
    — на входе имеем данные (текст) и шаблонный ods.
    — расставляем их по местам в content.xml.
    — отдаем юзеру ods.
    И вот если бы чем-то быстро и ненапряжно этот ods преобразовать в html/pdf/png/что угодно еще — вот это была бы сказка вообще.

  5. Issen:

    на входе у тебя plaintext, который нужно отобразить в шаблонном pdf на правильных местах? я правильно понял?

  6. Issen:

    посмотри сюда. оно, конечно, на perl, но переписать не такая уж и проблема.

  7. Issen:

    ну и последнее. надеюсь, тебе поможет.

  8. Nirer:

    я имел ввиду вообще перестроить организацию, чтобы посадить девочку, которая руками из этого 1с и будет генерировать/отправлять что там кому надо.

    ведь если дока бухгалтерская — её так и так надо проводить руками в какой-то момент. вот и заточить процесс, чтобы всем удобно было.

    обмениваться с 1с-ом (который поставить девочке на винду) — зачем ей юникс? — по фтп/хттп.

    по опыту — перенос бухгалтерии в проект (не связанный с бухгалтерией) обычно является губительным для последнего.

  9. Ur2Dead:

    на входе-то конечно plain text, но на выходе должно быть примерно так:

    Тем не менее спасибо, я почему-то не пытался искать в направлении перла.
    Есть, кстати, возможность openoffice без графики вообще в режиме демона запустить. И теоретически он будет слушать порт и запросы к нему можно отправлять на этот порт.
    Для взаимодействия с опенофиссом в режиме демона я нашел скрипт на питоне (не пашет во фряхе) и приложения на java — работает, но не быстрее, чем запускать офис из консоли на конвертацию ods -> pdf, и периодически рушится без объяснения причин. Оба, если что, тут.
    Думаю, что стоит поискать что-нибудь похожее, но на перле.

  10. Ur2Dead:

    тут видишь, какая штука. На каждого менеджеджера такую девочку? Одна за всеми не успеет сто процентов. Девочке комп с 1С-ом? С дополнительной лицензией? Уж лчше пусть юзеры ODS-ы открывают.
    Зачастую такого рода документы нужны вот прямо здесь и сейчас, для того, чтобы переслать / отдать заказчику, быстро передать на склад и тому подобное — то есть отложенная генерация их не прокатывает. Потом бухгалтерия проводит все, что нужно провести, у себя в 1С-е, но это потом. А доки нужны вот прямо сейчас.

  11. Ur2Dead:

    О! Вот это ты меня правильно послал 🙂

  12. Xuagreen:

    Твои юзеры не будут обламываться печатать XLS? Если да, то есть простой вариант без заморочек.

  13. RedSm:

    PHPExcel — читать и писать Excel, без посредников.
    tcpdf — много чего умеет, но в данном случае делать из html pdf. Шаблон в html, заменяете {USERNAME} на «Вася» и через tcpdf. Картинки тоже умеет в pdf вставлять, что часто удобно.

    Ещё я слышал, что можно и обычный html сохранить с расширением doc и ворд его съест.

  14. Ur2Dead:

    Привет 🙂
    У меня сейчас на выходе ODS (что, в общем-то, один хрен), но это лишний шаг.
    — Нажимаем «Счет-фактура»,
    — проверяем данные,
    — нажимаем «Сформировать»,
    — получаем таблицу,
    — скачиваем,
    — открываем — распечатали.
    Или же
    — Нажимаем «Счет-фактура»,
    — проверяем данные,
    — нажимаем «Сформировать»,
    — получаем таблицу и PDF
    — PDF можем распечатывать сразу.
    То есть исчезает необходимость скачивать и куда-то из браузера уходить, в другие окна.
    Поэтому мне, по-сути, нужен быстрый конвертер ods -> pdf, если все оставлять так, как сейчас есть.

  15. Ur2Dead:

    да, можно отдать html-страницу с content-type: Application/ms-word, но в случае со сложными и многоячеистыми таблицами это не канает, к сожалению.
    Хотелсь бы на выходе иметь два документа — честную таблицу (ods, xls) — для того, чтобы в случае чего отредактировать можно было, и pdf или картинку — для того, чтобы ее быстро распечатать или переслать.

  16. Exewhite:

    кури PHPExcel, он крут. Я им мега-сложные документы генерировал

  17. Xuagreen:

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

  18. Ur2Dead:

    да, но открыть в браузере html и распечатать его прямо из браузера — это не совсем то же самое, что скачать табличный файл, перейти к нему, открыть его, и только потом распечатать. А потом еще закрыть!
    Я, короче, тоже так делаю щас.
    Только наряду с табличным документом генерится html. То есть если юзер хочет только распечатать — он давит на кнопку «Распечатать» и получает html-таблицу в браузере. Распечатал и игого.
    А вот если ему что посерьезнее надо — переслать (pdf) или откедактировать (ods) — то он может скачать либо pdf, либо ods.

  19. Xuagreen:

    поставь на серваке принтер в PDF.

  20. Ur2Dead:

    cups-pdf, давно есть. Печать ods-файлика:
    openoffice —headless —pt cups-pdf /путь/к/любому/файлу/который/может/прочи тать/офис
    Занимает где-то 10 секунд 🙂
    Тут, как мне кажется, дело в офисе. Просто ему для того, чтобы стартануть (даже headless), надо 7-9 секунд. Ну и полторы секунды он потом делает, что ты его просишь.

  21. Xuagreen:

    дык напрямую печатай, нафиг оо?

  22. Ur2Dead:

    в общем-то, можно попробовать…

  23. Xuagreen:

    конечно попробуй — избавишься от лага в семь секунд (:

  24. RedSm:

    У PHPExcel есть несколько режимов совместимости. Если не нужно поддерживать древние версии Excel-а, то можно инициировать режим работы в чистом xml. Удобнее, чем просто с xml работать и скорость такая же.

Добавить комментарий