пятница, 25 декабря 2015 г.

Разработка печатной формы "счет-фактура" в формате pdf для сайта на php (tcpdf)

По большому счёту, web-разработкой я не занимаюсь, но иногда приходится "на коленке" писать отдельные модули. Последние полгода я занимаюсь созданием web-фронтэнда к учётной базе 1С для клиентов своего работодателя. О взаимодействии "web-сервисов" 1С и сайта я сейчас распространяться не планирую - может быть напишу отдельную заметку, а сейчас хотел поделиться своим опытом освоения вполне логичной темы развития клиентского портала, а именно - формированием печатных форм документов.Так как клиентский портал я решил писать на PHP (просто из-за того, что этот язык был мне более-менее знаком по моим предыдущим наработкам), то и библиотеки формирования pdf пришлось выбирать из доступных для этого языка. Из всего множества проектов я остановил свой выбор на tcpdf, во-первых, данный проект бесплатен (и для коммерческого использования), во-вторых, для базового "Hello, World!" достаточно написать буквально пару строк "обвязки".
Предлагаемые мной "бланки печатных форм" являются плодом моих размышлений, обмеров линейкой параметров бумажных печатных форм, чтения официальной документации и примеров с сайта проекта, а также помогла статья из первой десятки поисковой выдачи гугла по настройке кириллических шрифтов.

Итак, устанавливаем из репозитория `epel` (как его подключить я уже писал) пакет 'php-tcpdf' банальным yum install php-tcpdf и начинаем наше "колдунство".
Особенность формирования печатной формы обусловлена форматом данных, приходящих от 1С - параметры приходят в виде SOAP-сериализованного объекта, содержащего массив параметров; табличная часть приходит в виде элемента массива параметров, содержащего массив (таблицу) массивов (строк таблицы); на стороне 1С данные формируются таким образом, что каждый конкретный атрибут занимает строго определённый индекс получаемого массива; парсинг ответа 1С в планарный массив я здесь рассматривать не буду (он реализован в функции GetSFParams, подключаемой из внешнего файла), т.к. во-первых, он создан для нетиповой конфигурации, а во-вторых, он даже на мой взгляд весьма "костыльный". Основной профит с моей разработки заключается в том, что мной уже вычислены практически все параметры печатной формы, являющейся "Приложением №1 к постановлению Правительства Российской Федерации от 26.12.2011 № 1137", в ней предусмотрена многостраничная печатная форма (что, к слову, никак не оговаривается в том самом "постановлении"), и она может быть доработана под собственные нужды достаточно легко.
Вопросам настройки tcpdf для работы с русским языком я особого внимания не уделяю - на эту тему материалов и так достаточно (мне хватило упомянутой выше статьи).
Итак, условный файл sf.php: при вызове ему передаётся уникальный идентификатор требуемого документа методом GET (для удобства сохранения/копирования ссылки); контроль прав доступа, аналогично получению и парсингу реквизитов, реализован в подключаемом файле init.php.
В принципе, данный скрипт можно "обернуть" в функцию и вызывать, передавая реквизиты в виде массива, просто мне было удобнее именно так - передавать идентификатор СФ и получать данные из 1С из скрипта.
Пример результата работы скрипта: сгенерированная печатная форма.
UPD 2018-02-13: Загрузил пакет адаптированных шрифтов на сайты Google, так как столкнулся с невозможностью повторения "руссификации" tcpdf по статье из ссылки в шапке. Содержимое архива надо распаковать в папку со шрифтами tcpdf (в моём случае это /usr/share/php/tcpdf/fonts)

2 комментария:

  1. Привет!
    Гугл направил меня на https://sites.google.com/, но я героически нашел ссылку на этот сайт на предыдущем гугловском.

    Ламповый блог, какие уже очень редко делают.

    Вопросы:
    1. Какую версию tcpdf использовали?
    2. Если это возможно, хотелось бы получить:
    a) Cгенерированный вами шрифт Arial
    б) "Акт выполненных работ" и "Счёт на оплату"

    Благодарю за внимание.
    Жду ответ здесь, либо на andres.website@yandex.ru

    ОтветитьУдалить
  2. Спасибо!!!
    Скачал скрипт на http://www.bubnov.su/ , подредактировал под себя, все супер. Шрифт заменил на свой, только уменьшил немного размер, что бы все влазило. Выдавало ошибку на методе GetStringHeight (наверное версия у меня старая), закоментировал ее - все нормально работает и на длинных названиях тоже.
    Огромное СПАСИБО, завтра дедлайн, и осталась куча времени поспать и не провалить сроки

    ОтветитьУдалить