Генератор документов - феррари на которой можно ездить только вокруг дома, Новый модуль получился хорошим но не предназначен для использования разработчиками.
Александр Солошенко написал: Я кажись понял, /home/bitrix/www/bitrix/modules/documentgenerator/lib/body/docxxml.php - здесь лежит php, который работает с картинками...
Антон Горбылев, у меня стоит следующая задача: необходимо подменять изображение подписи на КП в зависимости от ответственного за сделку. Думаю, сценарий будет следующим: 1. в карточке сотрудника загрузим файлы с росписями. 2. на событии: onBeforeProcessDocument достаю файл соответствующего изображения. 3. подменяю роспись на КП изображением полученным на шаге №2. ACHTUNG!!! вопрос: как сделать 3-й шаг: подменяю роспись на КП изображением полученным на шаге №2.
Администратор
Сообщений: Баллов: 55Регистрация: 22.01.2014
0
03.09.2020 09:55:07
Ахат Баязи,передайте в качестве значения путь к файлу или ид из b_file.
Антон Горбылев написал: Александр Солошенко ,задача решаемая. Эту же задачу я решил при вставке в документ картинок / списков. Там такая же логика. Делается это следующим образом (по крайней мере у меня)
1. Проходите по document.xml, где делаете все замены. При этом вам надо для каждой ссылки генерировать уникальынй rId (посмотрите \Bitrix\DocumentGenerator\Body\Xml::getRandomId()). Вставляйте тег с вашим идентификатором. Сохраните в отдельной переменной соотношение идентификатор => ссылка 2. Пройдитесь по вашему массиву идентификаторов и вставьте что надо в rels
Ну и помните, что кроме document.xml там могут быть и другие .xml файлы, которые, по-хорошему, надо также обработать.
Антон, я так понимаю, что мне нужно вставить из генератора бизнес-процессов блок "Выполнение произвольного php кода". Какие блоки коды должны быть отображены? Я так понимаю: 1. $rootActivity = $this->GetRootActivity(); 2. Открываю как zip-архив сгенерированный файл docx, который сформировался на основе ранее подгруженного шаблона и данных передаваемых из бп. 3. Открываю документ xml и делаю замены так, как Вы указали в пункте 1. 4. Вставляю то, что нужно в rels 5. Сохраняю архив и выдаю пользователю новый файл.
Верно?
В пункте 3 что нужно использовать?
Если можно, то более детально расписать блоки кода (логику). Я не очень силен в php, но хорошо знаю английский и есть большое желание подтянуть php.
Администратор
Сообщений: Баллов: 55Регистрация: 22.01.2014
0
04.09.2020 10:03:21
Александр Солошенко, в общих чертах верно. По поводу работы с БП не подскажу, посмотрите существующие действия (папка activities).
Антон, добрый день, я взял файл docxxml.php И сделал свои правки, основываясь на коде, который используется для вставок картинок. Получилось что-то такое:
/**
* Get all hyperlink nodes marked with placeholders.
* If $generateNewhyperlinkIds is true - will replace relation ids to new values.
*
* @param bool $generateNewHyperlinkIds
* @param \DOMNode|null $contextNode
* @return array
*/
public function findHyperlinks(bool $generateNewHyperlinkIds = false, \DOMNode $contextNode = null): array
Все ли изменения я сделал и что еще нужно поменять в самом docxxml.php? И какой файл должен отвечать за передачу гиперссылок? БП мне генерирует ссылки вида: [url= ;[/ url]
Существует ли возможность повлиять на шрифт генерации документа в PDF? У меня шаблон документа в шрифте Geometria, при генерации PDF возвращает документ в шрифте Liberation Serif. Если нет возможности задать необходимый шрифт PDF, то где можно посмотреть список шрифтов поддерживаемых PDF конвертером?
Администратор
Сообщений: Баллов: 55Регистрация: 22.01.2014
0
15.09.2020 18:05:57
Александр Чувилёв, список поддерживаемых шрифтов небольшой. Какой-то дефолтный список, что входит в CentOS, подробнее не скажу.
Попробуйте поставить галочку "сохранить шрифт в файле" в шаблоне документа - возможно, поможет (а может и нет).
Ахат Баязи написал: Антон Горбылев , у меня стоит следующая задача: необходимо подменять изображение подписи на КП в зависимости от ответственного за сделку. Думаю, сценарий будет следующим: 1. в карточке сотрудника загрузим файлы с росписями. 2. на событии: onBeforeProcessDocument достаю файл соответствующего изображения. 3. подменяю роспись на КП изображением полученным на шаге №2. ACHTUNG!!! вопрос: как сделать 3-й шаг: подменяю роспись на КП изображением полученным на шаге №2.
решение оказалось до боли просты: 1. создаем пользовательское поле у сотрудника (тип файл): UF_CRM_SIGN 2. загрузить в него файл росписи сотрудника 3. в шаблоне использовать штатную картинку росписи директора 3. В событии onBeforeProcessDocument делаем подмену росписи директора росписью сотрудника.
Пощупал своими руками, что такое создать документ docx без генератора документов. Действовал по следующему алгоритму: 1. Установил композер 2. Установил библиотеку phpword 3. Подключил файл autoload.php, который расположен в папке vendor, в файле init.php 4. Собственно по подготовленному раннее шаблону разобрал документ на текст и переменные и данные зависимые от переменных 5. В генераторе бизнес-процессов запустил действие "Произвольный PHP-код". Получил текущий бизнес-процесс. 6. Преобразовал данные и записал их в документ docx, после чего сохранил на сервере.
Итого вышло 220 строк кода на 1-1,5 страницы документа в зависимости от количества данных(гиперссылок и строк, генерируемых в генераторе бп) и примерно 15 часов работы. Я не профессиональный разработчик php, поэтому код скорее всего можно оптимизировать, но сэкономить получится не более 30-40 строк кода.
Вывод: генератор документов мощнейший инструмент, который позволяет создавать документы со скоростью в 10-15 раз быстрее, чем писать ручками, притом еще нужно понимать, что писать. Поэтому автору большой респект.
И все-таки функционал гиперссылок очень нужен, хочется верить, что в ближайших релизах появится, а пока пользуемся PHPWord кому нужны, как и мне, гиперссылки из генератора бизнес-процессов.