-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFilesystemPdfImageEmbedder.php
More file actions
71 lines (58 loc) · 2.81 KB
/
FilesystemPdfImageEmbedder.php
File metadata and controls
71 lines (58 loc) · 2.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<?php
// SPDX-FileCopyrightText: 2026 LibreSign
// SPDX-License-Identifier: AGPL-3.0-or-later
declare(strict_types=1);
namespace LibreSign\XObjectTemplate\Pdf;
use InvalidArgumentException;
use LibreSign\XObjectTemplate\Pdf\Jpeg\JpegPdfImageFactory;
use LibreSign\XObjectTemplate\Pdf\Jpeg\JpegPdfImageFactoryInterface;
use LibreSign\XObjectTemplate\Pdf\Png\PngPdfImageFactory;
use LibreSign\XObjectTemplate\Pdf\Png\PngPdfImageFactoryInterface;
use LibreSign\XObjectTemplate\Pdf\Svg\SvgPdfXObjectFactory;
use LibreSign\XObjectTemplate\Pdf\Svg\SvgPdfXObjectFactoryInterface;
final readonly class FilesystemPdfImageEmbedder implements PdfImageEmbedderInterface
{
private FilesystemImageSourceReaderInterface $sourceReader;
private ImageMetadataInspectorInterface $metadataInspector;
private JpegPdfImageFactoryInterface $jpegImageFactory;
private PngPdfImageFactoryInterface $pngImageFactory;
private SvgPdfXObjectFactoryInterface $svgXObjectFactory;
public function __construct(
?FilesystemImageSourceReaderInterface $sourceReader = null,
?ImageMetadataInspectorInterface $metadataInspector = null,
?JpegPdfImageFactoryInterface $jpegImageFactory = null,
?PngPdfImageFactoryInterface $pngImageFactory = null,
?SvgPdfXObjectFactoryInterface $svgXObjectFactory = null,
) {
$this->sourceReader = $sourceReader ?? new FilesystemImageSourceReader();
$this->metadataInspector = $metadataInspector ?? new ImageMetadataInspector();
$this->jpegImageFactory = $jpegImageFactory ?? new JpegPdfImageFactory();
$this->pngImageFactory = $pngImageFactory ?? new PngPdfImageFactory();
$this->svgXObjectFactory = $svgXObjectFactory ?? new SvgPdfXObjectFactory();
}
public function embed(string $source): EmbeddedPdfImage
{
$contents = $this->sourceReader->read($source);
if ($this->isSvgSource($source, $contents)) {
return $this->svgXObjectFactory->create($contents, $source);
}
$imageInfo = $this->metadataInspector->detect($contents, $source);
$mime = $this->metadataInspector->resolveMimeType($imageInfo, $source);
return match ($mime) {
'image/jpeg' => $this->jpegImageFactory->create($contents, $imageInfo),
'image/png' => $this->pngImageFactory->create($contents),
default => throw new InvalidArgumentException(
sprintf('Unsupported image format "%s".', $mime),
),
};
}
private function isSvgSource(string $source, string $contents): bool
{
if (preg_match('/\.svgz?$/i', $source) === 1) {
return true;
}
$trimmed = ltrim($contents);
return str_starts_with($trimmed, '<svg')
|| (str_starts_with($trimmed, '<?xml') && str_contains($trimmed, '<svg'));
}
}