Чистый код Короткие заметки веб-разработчика

Ошибка Permission denied on base64 в laravel-dompdf

Недавно столкнулся с очень неприятной ошибкой, которую было сложно раздебажить. Идея в том, чтобы встроить в PDF ссылку в виде QR-кода. Но при использовании тега img со значением src в формате data:image/svg+xml;base64,… всё разваливается на части и QR-код не отображается.

На одном из своих проектов, я использую связку laravel-dompdf + php-qrcode. Вкратце, у меня есть HTML код, который конвертируется в PDF с каким-то таким содержанием (важно, что это, просто, картинка в base64):

<img src="data:image/svg+xml;base64,...">
<img src="/www/data/local_image.png">

При этом, картинка, которая открывается по пути работает, а base64 (который не обращается к файловой системе) не работает от слова совсем.

В конфиге laravel-dompdf (config/dompdf.php) можно найти удобное свойство show_warnings. Если перевести его в состояние true, то можно увидеть стектрейс ошибок DomPdf. У меня эта ошибка выглядела примерно вот так:

Permission denied on data:image/svg+xml;base64,...

Что я только не перепробовал делать — все настройки и хаки не приводили к результату. Пропущу часть с поиском проблемы и перейду сразу к решению. Оно заключается в простановке значения allowed_protocols всё в том же конфиге:

'allowed_protocols' => [
    // Здесь могут быть ваши другие настройки
    'data://' => ['rules' => []], // а вот эта штука решит ваши проблемы
],

Как я понял, laravel-dompdf не сконфигурировать изначально на работу с файлами, которые являются base64-закодированной строкой. От сюда и проблемы с интерпретацией картинки в PDF.