Symfony 4 - DomPDF - Показать изображение с помощью VichUploader?

Я хочу создать PDF-файл с помощью DomPDF в моем проекте Symfony 4. Хотел бы я вставлять изображения из сущности. Образы управляются с помощью VichUploaderBundle.

Есть ли способ их отобразить?

На данный момент я сделал это в своем файле ветки

<html>
    <head>
        <meta charset="UTF-8">
        <title>Title of the PDF</title>
    </head>
    <body>
        <h4>{{ title }}</h4>
        <p>Lorem Ipsum</p>
        <div class="user-pic">
            {% if app.user and app.user.avatar and app.user.avatar.imageName %}
                <img class="img img-responsive img-rounded" src="{{ absolute_url(vich_uploader_asset(app.user.avatar, 'imageFile'))}}">

            {% else %}
                <img src={{"/images/avatar/default.jpg"}}>
            {% endif %}
        </div>
    </body>
</html>

Но это не работает. Изображение отсутствует. Есть только «альт».

Конфигурация моего vichUploader:

avatar:
      uri_prefix: /images/avatar
      upload_destination: "%kernel.project_dir%/public/images/avatar"

      inject_on_load: false
      delete_on_update: true
      delete_on_remove: true

В моем контроллере:

 /**
     * Générer un PDF
     * @Route("/absence/pdf", name="absence_pdf")
     *
     * @return void
     */
    public function createPDF()
    {
        // Configure Dompdf according to your needs
        $pdfOptions = new Options();
        $pdfOptions->set('defaultFont', 'Arial')
        ->set('isRemoteEnabled', true);

        // Instantiate Dompdf with our options
        $dompdf = new Dompdf($pdfOptions);

        // Retrieve the HTML generated in our twig file
        $html = $this->renderView('absence/pdf.html.twig', [
            'title' => "Welcome to our PDF Test"
        ]);

        // Load HTML to Dompdf
        $dompdf->loadHtml($html);

        // (Optional) Setup the paper size and orientation 'portrait' or 'portrait'
        $dompdf->setPaper('A4', 'portrait');

        // Render the HTML as PDF
        $dompdf->render();

        // Output the generated PDF to Browser (inline view)
        $dompdf->stream("mypdf.pdf", [
            "Attachment" => false
        ]);
    }

У меня такая ошибка:

Ошибка: превышено максимальное время выполнения 120 секунд


person eronn    schedule 06.10.2019    source источник
comment
Что вы имеете в виду под не работает? Добавьте свою конфигурацию VichUploader и часть контроллера, которая фактически отображает pdf / изображение, в вопрос, пожалуйста. Что произойдет, если вы визуализируете этот шаблон в формате pdf? Изображение в pdf: а) отсутствует, б) пусто, в) отображается default.jpg, г) ...? Мы не можем угадать текущее поведение этого фрагмента кода.   -  person Nicolai Fröhlich    schedule 06.10.2019
comment
В pdf у меня есть только альт-часть появляющегося изображения. В противном случае изображение отсутствует. Я обновлю свой первый пост   -  person eronn    schedule 06.10.2019
comment
давно я не использовал dompdf. проблема в том, что dompdf вообще не знает о вашем локальном веб-сервере и, следовательно, не может отобразить изображение по - в настоящее время относительному - пути. Решение ниже.   -  person Nicolai Fröhlich    schedule 06.10.2019


Ответы (1)


Средство визуализации DomPDF не знает базовый URL-адрес изображений, потому что вы просто передаете ему строку HTML.

Чтобы правильно отображать изображения с помощью DomPDF, вам необходимо использовать абсолютный путь и включить удаленные источники следующим образом:

В вашем шаблоне используйте функцию absolute_url twig:

absolute_url(vich_uploader_asset(app.user.avatar, 'imageFile'))

В вашем контроллере разрешите DomPDF отображать "удаленные" изображения:

 $pdfOptions->set('isRemoteEnabled', true);
person Nicolai Fröhlich    schedule 06.10.2019
comment
Спасибо за ваш ответ ! Я обновил свой код, но при запуске страницы возникает ошибка: максимальное время выполнения 120 секунд превышено. Однако в моей ветке теперь есть ‹img class = img img-responsive img-rounded src = {{absolute_url (vich_uploader_asset (app.user.avatar, 'imageFile'))}}› (Я обновил свой первый пост, добавив новый код) - person eronn; 06.10.2019