Здравствуйте! В данной статье мы рассмотрим автоматическую генерацию PDF документа средствами PHP. Реализуем возможность сохранять любую статью на сайте в PDF формате. Данный функционал будем разворачивать на CMS 1c-Bitrix. Чем больше изучаю эту платформу, тем больше убеждаюсь в качестве её разработки.
Итак, общий алгоритм будет следующим: при сохранении, ипдейте элемента в инф. блоке, создается/обновляется PDF документ. Что бы ни изобретать велосипед, для создания PDF файла, будем использовать библиотеку mPDF (http://mpdf1.com/) . На момент написания статьи, последний актуальный релиз mPDF v5.7. Качаем архив, разархивируем и заливаем на сервер (в корень сайта).
Теперь задача стоит в выборе метода генерации, можно создать отдельный скрипт, передать ему ID элемента и на выходе выплюнуть сгенерированный файл, можно повесить обработчик на события: создание и апдейт элемента инф. блока. Для теста я выбрал второй вариант, т.к. поток статей не очень большой и не будет существенной нагрузки при перезаписи или создании PDF документов.
Теперь при создании или апдейте элемента будет создаваться или обновляться PDF файл с текстом статьи. В данном примере текст документа генерируется из названия и детального описания элемента. Названием файла выступает его уникальный ID.
Так же прописываем обработчик, который будет удалять сгенерированный файл, при удалении элемента:
Как обучающая - гуд, но на практике я бы обращался к файлу посреднику (/bitrix/pdf.php?ID=13), который на лету бы генерил PDF. Это даст бОльшую гибкость. Ну и проверку прав можно будет вкорячить. Сейчас есть риск утечки запрещенной инфы.
И
$res = CIBlockElement::GetByID($arFields['ID']);
а это зачем? Ведь в arFields все нужное прилетает.
С производительностью у mPDF беда, подходит только для простых вещей. Для генерации pdf самый оптимальный вариант - это wkhtml2pdf, но не всегда есть возможность установить эту команду на сервер.
Антон Долганин , ага косячок, подправлю. Эту функцию использую еще в одной компоненте, где на вход прилетает только ID, поэтому доп. запрос сохранился.
mPDF не поддерживает mbstring.func_overload 2. Когда-то много времени потерял, почему не работало. Реально работает TCPDF, но результат бывает некрасивый. TCPDF далеко не все атрибуты и стили поддерживает.
Зайцев Артемий, тоже использую TCPDF. Уже и не помню, почему в своё время не подружился с mPDF, но не подружился =) Ну и баркоды нативно, в виденных примерах mPDF для генерации ШК используют код из TCPDF.
А как решили проблемы с mbstring.func_overload ? Для mPDF требуется 0, а для bitrix выше. Просто возникла такая проблема, на локал хосте удалось через htaccess в отдельной папке где формируется файл, указать этот параметр равный "0". Но при переносе на новый сервер с версии (php 5.3+) это уже сделать невозможно. В общем на новом сервере, файлы формируются в 2-а раза меньшим объемом и не открываются ("файл поврежден и не может быть восстановлен") На старом все ок.
Немного не понял в какой файл вставлять код функций function IBlockAfterSave($arFields) И подскажите как применить все это дело только к определенному инфоблоку? например по ID инфоблока
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».