| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- <?php
- declare(strict_types=1);
- /*
- * (c) Jeroen van den Enden <info@endroid.nl>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
- namespace Endroid\QrCode\Writer;
- use Endroid\QrCode\Exception\ValidationException;
- use Endroid\QrCode\QrCodeInterface;
- class FpdfWriter extends AbstractWriter
- {
- /**
- * Defines as which unit the size is handled. Default is: "mm".
- *
- * Allowed values: 'mm', 'pt', 'cm', 'in'
- */
- public const WRITER_OPTION_MEASURE_UNIT = 'fpdf_measure_unit';
- public function writeString(QrCodeInterface $qrCode): string
- {
- if (!\class_exists(\FPDF::class)) {
- throw new \BadMethodCallException('The Fpdf writer requires FPDF as dependency but the class "\\FPDF" couldn\'t be found.');
- }
- if ($qrCode->getValidateResult()) {
- throw new ValidationException('Built-in validation reader can not check fpdf qr codes: please disable via setValidateResult(false)');
- }
- $foregroundColor = $qrCode->getForegroundColor();
- if (0 !== $foregroundColor['a']) {
- throw new \InvalidArgumentException('The foreground color has an alpha channel, but the fpdf qr writer doesn\'t support alpha channels.');
- }
- $backgroundColor = $qrCode->getBackgroundColor();
- if (0 !== $backgroundColor['a']) {
- throw new \InvalidArgumentException('The foreground color has an alpha channel, but the fpdf qr writer doesn\'t support alpha channels.');
- }
- $label = $qrCode->getLabel();
- $labelHeight = null !== $label ? 30 : 0;
- $data = $qrCode->getData();
- $options = $qrCode->getWriterOptions();
- $fpdf = new \FPDF(
- 'P',
- $options[self::WRITER_OPTION_MEASURE_UNIT] ?? 'mm',
- [$data['outer_width'], $data['outer_height'] + $labelHeight]
- );
- $fpdf->AddPage();
- $fpdf->SetFillColor($backgroundColor['r'], $backgroundColor['g'], $backgroundColor['b']);
- $fpdf->Rect(0, 0, $data['outer_width'], $data['outer_height'], 'F');
- $fpdf->SetFillColor($foregroundColor['r'], $foregroundColor['g'], $foregroundColor['b']);
- foreach ($data['matrix'] as $row => $values) {
- foreach ($values as $column => $value) {
- if (1 === $value) {
- $fpdf->Rect(
- $data['margin_left'] + ($column * $data['block_size']),
- $data['margin_left'] + ($row * $data['block_size']),
- $data['block_size'],
- $data['block_size'],
- 'F'
- );
- }
- }
- }
- $logoPath = $qrCode->getLogoPath();
- if (null !== $logoPath) {
- $this->addLogo(
- $fpdf,
- $logoPath,
- $qrCode->getLogoWidth(),
- $qrCode->getLogoHeight(),
- $data['outer_width'],
- $data['outer_height']
- );
- }
- if (null !== $label) {
- $fpdf->setY($data['outer_height'] + 5);
- $fpdf->SetFont('Helvetica', null, $qrCode->getLabelFontSize());
- $fpdf->Cell(0, 0, $label, 0, 0, strtoupper($qrCode->getLabelAlignment()[0]));
- }
- return $fpdf->Output('S');
- }
- protected function addLogo(\FPDF $fpdf, string $logoPath, ?int $logoWidth, ?int $logoHeight, int $imageWidth, int $imageHeight): void
- {
- if (null === $logoHeight || null === $logoWidth) {
- [$logoSourceWidth, $logoSourceHeight] = \getimagesize($logoPath);
- if (null === $logoWidth) {
- $logoWidth = (int) $logoSourceWidth;
- }
- if (null === $logoHeight) {
- $aspectRatio = $logoWidth / $logoSourceWidth;
- $logoHeight = (int) ($logoSourceHeight * $aspectRatio);
- }
- }
- $logoX = $imageWidth / 2 - (int) $logoWidth / 2;
- $logoY = $imageHeight / 2 - (int) $logoHeight / 2;
- $fpdf->Image($logoPath, $logoX, $logoY, $logoWidth, $logoHeight);
- }
- public static function getContentType(): string
- {
- return 'application/pdf';
- }
- public static function getSupportedExtensions(): array
- {
- return ['pdf'];
- }
- public function getName(): string
- {
- return 'fpdf';
- }
- }
|