Skip to content

Commit

Permalink
Added fpdf writer
Browse files Browse the repository at this point in the history
  • Loading branch information
MaximilianKresse committed Jun 30, 2020
1 parent 1616778 commit 7f496ce
Show file tree
Hide file tree
Showing 3 changed files with 159 additions and 2 deletions.
6 changes: 4 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,13 @@
"myclabs/php-enum": "^1.5"
},
"require-dev": {
"endroid/quality": "dev-master"
"endroid/quality": "dev-master",
"setasign/fpdf": "^1.8"
},
"suggest": {
"roave/security-advisories": "Avoids installation of package versions with vulnerabilities",
"symfony/security-checker": "Checks your composer.lock for vulnerabilities"
"symfony/security-checker": "Checks your composer.lock for vulnerabilities",
"setasign/fpdf": "Required to use the QR FPDF writer."
},
"autoload": {
"psr-4": {
Expand Down
153 changes: 153 additions & 0 deletions src/Writer/FpdfWriter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
<?php

declare(strict_types=1);

/*
* (c) Jeroen van den Enden <[email protected]>
*
* 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\GenerateImageException;
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 __construct()
{
if(!\class_exists(\FPDF::class)){
throw new \BadMethodCallException(
'The QRFpdf output requires FPDF as dependency but the class "\FPDF" couldn\'t be found.'
);
}
}

public function writeString(QrCodeInterface $qrCode): string
{
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 ($foregroundColor['a'] !== 0) {
throw new \InvalidArgumentException(
'The foreground color has an alpha channel, but the fpdf qr writer doesn\'t support alpha channels.'
);
}
$backgroundColor = $qrCode->getBackgroundColor();
if ($backgroundColor['a'] !== 0) {
throw new \InvalidArgumentException(
'The foreground color has an alpha channel, but the fpdf qr writer doesn\'t support alpha channels.'
);
}

$label = $qrCode->getLabel();
if (null !== $label) {
throw new \InvalidArgumentException('The fpdf qr writer doesn\'t support a label.');
}

$data = $qrCode->getData();
$options = $qrCode->getWriterOptions();

$fpdf = new \FPDF(
'P',
$options[self::WRITER_OPTION_MEASURE_UNIT] ?? 'mm',
[$data['outer_width'], $data['outer_height']]
);
$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']
);
}

return $fpdf->Output('S');
}

protected function addLogo(
\FPDF $fpdf,
string $logoPath,
?int $logoWidth,
?int $logoHeight,
int $imageWidth,
int $imageHeight
) {
if (null === $logoHeight || null === $logoWidth) {
$logoImage = \imagecreatefromstring(\file_get_contents($logoPath));
if (!\is_resource($logoImage)) {
throw new GenerateImageException('Unable to generate image: check your GD installation or logo path');
}

$logoSourceWidth = \imagesx($logoImage);
$logoSourceHeight = \imagesy($logoImage);

\imagedestroy($logoImage);

if (null === $logoWidth) {
$logoWidth = $logoSourceWidth;
}

if (null === $logoHeight) {
$aspectRatio = $logoWidth / $logoSourceWidth;
$logoHeight = (int) ($logoSourceHeight * $aspectRatio);
}
}

$logoX = $imageWidth / 2 - $logoWidth / 2;
$logoY = $imageHeight / 2 - $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';
}
}
2 changes: 2 additions & 0 deletions src/WriterRegistry.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
use Endroid\QrCode\Writer\BinaryWriter;
use Endroid\QrCode\Writer\DebugWriter;
use Endroid\QrCode\Writer\EpsWriter;
use Endroid\QrCode\Writer\FpdfWriter;
use Endroid\QrCode\Writer\PngWriter;
use Endroid\QrCode\Writer\SvgWriter;
use Endroid\QrCode\Writer\WriterInterface;
Expand All @@ -39,6 +40,7 @@ public function loadDefaultWriters(): void
new EpsWriter(),
new PngWriter(),
new SvgWriter(),
new FpdfWriter()
]);

$this->setDefaultWriter('png');
Expand Down

0 comments on commit 7f496ce

Please sign in to comment.