. */ namespace App\Services\LabelSystem; use App\Entity\Contracts\NamedElementInterface; use App\Entity\LabelSystem\LabelOptions; use App\Entity\Parts\Part; use App\Entity\Parts\PartLot; use App\Entity\Parts\Storelocation; use App\Services\ElementTypeNameGenerator; use Dompdf\Dompdf; use Twig\Environment; final class LabelGenerator { public const CLASS_SUPPORT_MAPPING = [ 'part' => Part::class, 'part_lot' => PartLot::class, 'storelocation' => Storelocation::class, ]; public const MM_TO_POINTS_FACTOR = 2.83465; private $labelHTMLGenerator; public function __construct(LabelHTMLGenerator $labelHTMLGenerator) { $this->labelHTMLGenerator = $labelHTMLGenerator; } /** * @param LabelOptions $options * @param object|object[] $elements An element or an array of elements for which labels should be generated * @return string */ public function generateLabel(LabelOptions $options, $elements): string { if (!is_array($elements) && !is_object($elements)) { throw new \InvalidArgumentException('$element must be an object or an array of objects!'); } if (!is_array($elements)) { $elements = [$elements]; } foreach ($elements as $element) { if (!$this->supports($options, $element)) { throw new \InvalidArgumentException('The given options are not compatible with the given element!'); } } $dompdf = new Dompdf(); $dompdf->setPaper($this->mmToPointsArray($options->getWidth(), $options->getHeight())); $dompdf->loadHtml($this->labelHTMLGenerator->getLabelHTML($options, $elements)); $dompdf->render(); return $dompdf->output(); } /** * Check if the given LabelOptions can be used with $element. * @param LabelOptions $options * @param object $element * @return bool */ public function supports(LabelOptions $options, object $element) { $supported_type = $options->getSupportedElement(); if (!isset(static::CLASS_SUPPORT_MAPPING[$supported_type])) { throw new \InvalidArgumentException('Supported type name of the Label options not known!'); } return is_a($element, static::CLASS_SUPPORT_MAPPING[$supported_type]); } /** * Converts width and height given in mm to an size array, that can be used by DOMPDF for page size * @param float $width The width of the paper * @param float $height The height of the paper * @return float[] */ public function mmToPointsArray(float $width, float $height): array { return [0.0, 0.0, $width * self::MM_TO_POINTS_FACTOR, $height * self::MM_TO_POINTS_FACTOR]; } }