From ae8edffdc84fdd9ae754708795b7f085cadabb70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hmer?= Date: Sun, 2 Jul 2023 13:57:15 +0200 Subject: [PATCH] Put the dompdf fonts and temp files in a folder inside var/dompdf, which should always be writable by the server process --- config/services.yaml | 5 ++ src/Services/LabelSystem/DompdfFactory.php | 54 +++++++++++++++++++++ src/Services/LabelSystem/LabelGenerator.php | 6 ++- 3 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 src/Services/LabelSystem/DompdfFactory.php diff --git a/config/services.yaml b/config/services.yaml index 9e15eca0..300497de 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -221,6 +221,11 @@ services: tags: - { name: 'app.label_placeholder_provider', priority: 10} + App\Services\LabelSystem\DompdfFactory: + arguments: + $fontDirectory: '%kernel.project_dir%/var/dompdf/fonts/' + $tmpDirectory: '%kernel.project_dir%/var/dompdf/tmp/' + #################################################################################################################### # Trees #################################################################################################################### diff --git a/src/Services/LabelSystem/DompdfFactory.php b/src/Services/LabelSystem/DompdfFactory.php new file mode 100644 index 00000000..4017a393 --- /dev/null +++ b/src/Services/LabelSystem/DompdfFactory.php @@ -0,0 +1,54 @@ +. + */ + +namespace App\Services\LabelSystem; + +use Dompdf\Dompdf; +use Jbtronics\DompdfFontLoaderBundle\Services\DompdfFactoryInterface; +use Symfony\Component\DependencyInjection\Attribute\AsDecorator; + +#[AsDecorator(decorates: DompdfFactoryInterface::class)] +class DompdfFactory implements DompdfFactoryInterface +{ + public function __construct(private string $fontDirectory, private string $tmpDirectory) + { + //Create folder if it does not exist + $this->createDirectoryIfNotExisting($this->fontDirectory); + $this->createDirectoryIfNotExisting($this->tmpDirectory); + } + + private function createDirectoryIfNotExisting(string $path): void + { + if (!is_dir($path)) { + if (!mkdir($concurrentDirectory = $path, 0777, true) && !is_dir($concurrentDirectory)) { + throw new \RuntimeException(sprintf('Directory "%s" was not created', $concurrentDirectory)); + } + } + } + + public function create(): Dompdf + { + return new Dompdf([ + 'fontDir' => $this->fontDirectory, + 'fontCache' => $this->fontDirectory, + 'tempDir' => $this->tmpDirectory, + ]); + } +} \ No newline at end of file diff --git a/src/Services/LabelSystem/LabelGenerator.php b/src/Services/LabelSystem/LabelGenerator.php index 943a4245..f16b135a 100644 --- a/src/Services/LabelSystem/LabelGenerator.php +++ b/src/Services/LabelSystem/LabelGenerator.php @@ -47,6 +47,7 @@ use App\Entity\Parts\PartLot; use App\Entity\Parts\Storelocation; use Dompdf\Dompdf; use InvalidArgumentException; +use Jbtronics\DompdfFontLoaderBundle\Services\DompdfFactoryInterface; /** * @see \App\Tests\Services\LabelSystem\LabelGeneratorTest @@ -55,7 +56,8 @@ final class LabelGenerator { public const MM_TO_POINTS_FACTOR = 2.83465; - public function __construct(private readonly LabelHTMLGenerator $labelHTMLGenerator) + public function __construct(private readonly LabelHTMLGenerator $labelHTMLGenerator, + private readonly DompdfFactoryInterface $dompdfFactory) { } @@ -78,7 +80,7 @@ final class LabelGenerator } } - $dompdf = new Dompdf(); + $dompdf = $this->dompdfFactory->create(); $dompdf->setPaper($this->mmToPointsArray($options->getWidth(), $options->getHeight())); $dompdf->loadHtml($this->labelHTMLGenerator->getLabelHTML($options, $elements)); $dompdf->render();