Вложения к документам, Генерация pdf - Разработка модуля для хранения и управления документами в электронном виде

Для реализации вложенных файлов было принято решение использовать сторонний гем paperclip (https://github. com/thoughtbot/paperclip). Он позволяет организовать хранение загруженных файлов, управление размерами изображений, а также связь изображений и объектов.

Функциональность гема была несколько расширена, вложенный файл теперь относится к объекту типа FileAttach, содержащий дополнительную логику для управления типами и состояниями файлов.

Теперь для того, чтобы появилась возможность прикладывать изображения к документу, в определении его класса необходимо вызвать метод has_file_attaches.

Генерация pdf

Согласно разработанной архитектуре, в проекте должно появиться несколько типов документов, генерирующих вложение при сохранении.

Было решено использовать дополнительный абстрактный класс Agreement, наследник класса Document. В данном классе была реализована логика генерации pdf-файлов при сохранении документа.

Конкретные классы договоров наследуются от класса Agreement и должны переопределить метод fields_to_replace, в котором формируется хеш вида {:имя_поля => значение}. Т. к. документ имеет доступ как к объекту, к которому относится, так и к любым другим документам, то в хеш могут быть собраны практически любые необходимые данные (в трудовом договоре это могут быть паспортные данные владельца, номер ИНН и пр.)

После сохранения документа вызывается метод generate_attachment, унаследованный от класса Agreement. Метод проводит поиск odt-шаблона документа в папке app/agreement_templates/ и, в случае успеха, создает временную копию найденного шаблона. В ней производится следующая обработка:

    1) вызов метода fields_to_replace с целью получения хеша значений для замены; 2) поиск лексем вида "[ИМЯ_ПОЛЯ]" в шаблоне и замена вхождений значениями из хеша; 3) вызов консольной команды libreoffice для конвертации полученного odt-файла в pdf; 4) приложение pdf в виде вложенного файла к документу; 5) удаление временного odt-файла.

Для обработки odt был использован сторонний гем ODFReport.

Каждому классу, наследующемуся от Agreement, необходимо создать одноименный odt-файл в каталоге app/agreement_templates/.

Похожие статьи




Вложения к документам, Генерация pdf - Разработка модуля для хранения и управления документами в электронном виде

Предыдущая | Следующая