Html2Pdf + Symfony + Docker: невозможно получить размер изображения - PullRequest
0 голосов
/ 03 декабря 2018

У меня проблема с генерацией PDF с HMTL2Pdf.Я использую:

  • Фреймворк Symfony
  • spipu / html2Pdf
  • Докер с контейнером для приложения (8080) и контейнером Minio (9001) для файлов

Я пытаюсь отобразить изображение в своем PDF-файле, но у меня есть ошибка: Unable to get the size of the image [http://127.0.0.1:9001/events/photos/37652647-203b-4196-8792-6b5da989eddc.jpeg].

Мой шаблон веточки

{% for page in pages %}
<page backtop="20mm" backright="10mm" backbottom="20mm" backleft="10mm">
    <img src="{{ page.background|storage_url }}">
</page
{% endfor %}

Мой контроллер

public function handle(): string
{
    $template = $this->renderer->render('pdf/index.html.twig', [
        'pages' => $this->pageManager->findAll(),
    ]);

    $this->pdfCreator->create('L', 'A4', 'fr', true, 'UTF-8', array(10, 15, 10, 15));
    return $this->pdfCreator->generatePdf($template, "test");
}

Мой сервис pdfCreator

use Spipu\Html2Pdf\Html2Pdf as Html2Pdf;

final class PdfCreator implements PdfCreatorInterface
{
    /** @var Html2Pdf $pdf */
    private $pdf;

    public function create($orientation = null, $format = null, $lang = null, $unicode = null, $encoding = null, $margin = null): void
    {
        $this->pdf = new Html2Pdf($orientation, $format, $lang, $unicode, $encoding, $margin);
    }

    /**
     * @param $template
     * @param $name
     * @return string
     * @throws \Spipu\Html2Pdf\Exception\Html2PdfException
     */
    public function generatePdf($template, $name): string
    {
        $this->pdf->writeHTML($template);
        return $this->pdf->Output($name.'.pdf');
    }
}

Примечание:

  • Если я удаляю <img>, мой PDF-файл правильно отображается
  • Мой путь к изображениюправильно, потому что я могу отображать его таким же образом на другой странице моего приложения

Можете ли вы помочь мне отобразить мое изображение?Я не могу использовать абсолютный путь, потому что мое изображение получено из другого контейнера Minio (9001), поэтому я не знаю, как это сделать

1 Ответ

0 голосов
/ 03 декабря 2018

Моя проблема состояла в том, чтобы попытаться использовать URL-адрес 9001 для доступа к моему изображению, поэтому я сделал это, чтобы решить мою проблему:

  • Получить содержимое моего изображения
  • Создать временный файлс этим содержанием
  • Показать этот временный файл в формате pdf

Мой шаблон

{% for page in pages %}
    <page backtop="20mm" backright="10mm" backbottom="20mm" backleft="10mm">
        <img src="/tmp/{{ page.background }}" style="width: 100px; height: 100px">
    </page>
{% endfor %}

Мой контроллер

public function handle(FileUploader $fileUploader): string
{
    $pages = $this->pageManager->findAll();
    foreach ($pages as $page) {
        $fileUploader->makeTempFile($page->getBackground());
    }
    $template = $this->renderer->render('pdf/index.html.twig', [
        'pages' => $pages,
    ]);

    $this->pdfCreator->create('L', 'A4', 'fr', true, 'UTF-8', array(10, 15, 10, 15));
    return $this->pdfCreator->generatePdf($template, "test");
}

Мой сервис FileUploader

use Gaufrette\FilesystemInterface;
use Ramsey\Uuid\Uuid;
use Symfony\Component\HttpFoundation\File\File;

final class FileUploader implements FileUploaderInterface
{
    private $filesystem;

    public function __construct(FilesystemInterface $filesystem)
    {
        $this->filesystem = $filesystem;
    }

    public function upload(File $file): string
    {
        $filename = Uuid::uuid4()->toString().'.'.$file->guessExtension();

        $this->filesystem->write($filename, file_get_contents($file->getPathname()));

        return $filename;
    }

    public function get(string $fileName)
    {
        return $this->filesystem->read($fileName);
    }

    public function makeTempFile(string $fileName)
    {
        $content = $this->get($fileName);
        file_put_contents(sys_get_temp_dir().'/'.$fileName, $content);
    }
}

И я добавляю GD в свой DockerFile php-fpm

FROM php:7.2-fpm

RUN apt-get update

RUN apt-get install -y libpq-dev git libicu-dev libpng-dev libjpeg62-turbo-dev \
    && docker-php-ext-configure intl \
    && docker-php-ext-install intl pdo pdo_pgsql pgsql gd

WORKDIR /var/www/symfony

И это работает!спасибо за вашу помощь.

...