mirror of
https://github.com/Karaka-Management/Resources.git
synced 2026-01-11 21:38:39 +00:00
120 lines
3.6 KiB
PHP
Executable File
120 lines
3.6 KiB
PHP
Executable File
<?php
|
|
|
|
namespace Mpdf\Writer;
|
|
|
|
use Mpdf\Strict;
|
|
use Mpdf\Mpdf;
|
|
|
|
final class ImageWriter
|
|
{
|
|
|
|
use Strict;
|
|
|
|
/**
|
|
* @var \Mpdf\Mpdf
|
|
*/
|
|
private $mpdf;
|
|
|
|
/**
|
|
* @var \Mpdf\Writer\BaseWriter
|
|
*/
|
|
private $writer;
|
|
|
|
public function __construct(Mpdf $mpdf, BaseWriter $writer)
|
|
{
|
|
$this->mpdf = $mpdf;
|
|
$this->writer = $writer;
|
|
}
|
|
|
|
public function writeImages()
|
|
{
|
|
$filter = $this->mpdf->compress ? '/Filter /FlateDecode ' : '';
|
|
|
|
foreach ($this->mpdf->images as $file => $info) {
|
|
|
|
$this->writer->object();
|
|
|
|
$this->mpdf->images[$file]['n'] = $this->mpdf->n;
|
|
|
|
$this->writer->write('<</Type /XObject');
|
|
$this->writer->write('/Subtype /Image');
|
|
$this->writer->write('/Width ' . $info['w']);
|
|
$this->writer->write('/Height ' . $info['h']);
|
|
|
|
if (isset($info['interpolation']) && $info['interpolation']) {
|
|
$this->writer->write('/Interpolate true'); // mPDF 6 - image interpolation shall be performed by a conforming reader
|
|
}
|
|
|
|
if (isset($info['masked'])) {
|
|
$this->writer->write('/SMask ' . ($this->mpdf->n - 1) . ' 0 R');
|
|
}
|
|
|
|
// set color space
|
|
$icc = false;
|
|
if (isset($info['icc']) && ( $info['icc'] !== false)) {
|
|
// ICC Colour Space
|
|
$icc = true;
|
|
$this->writer->write('/ColorSpace [/ICCBased ' . ($this->mpdf->n + 1) . ' 0 R]');
|
|
} elseif ($info['cs'] === 'Indexed') {
|
|
if ($this->mpdf->PDFX || ($this->mpdf->PDFA && $this->mpdf->restrictColorSpace === 3)) {
|
|
throw new \Mpdf\MpdfException('PDFA1-b and PDFX/1-a files do not permit using mixed colour space (' . $file . ').');
|
|
}
|
|
$this->writer->write('/ColorSpace [/Indexed /DeviceRGB ' . (strlen($info['pal']) / 3 - 1) . ' ' . ($this->mpdf->n + 1) . ' 0 R]');
|
|
} else {
|
|
$this->writer->write('/ColorSpace /' . $info['cs']);
|
|
if ($info['cs'] === 'DeviceCMYK') {
|
|
if ($this->mpdf->PDFA && $this->mpdf->restrictColorSpace !== 3) {
|
|
throw new \Mpdf\MpdfException('PDFA1-b does not permit Images using mixed colour space (' . $file . ').');
|
|
}
|
|
if ($info['type'] === 'jpg') {
|
|
$this->writer->write('/Decode [1 0 1 0 1 0 1 0]');
|
|
}
|
|
} elseif (($this->mpdf->PDFX || ($this->mpdf->PDFA && $this->mpdf->restrictColorSpace === 3)) && $info['cs'] === 'DeviceRGB') {
|
|
throw new \Mpdf\MpdfException('PDFA1-b and PDFX/1-a files do not permit using mixed colour space (' . $file . ').');
|
|
}
|
|
}
|
|
|
|
$this->writer->write('/BitsPerComponent ' . $info['bpc']);
|
|
|
|
if (isset($info['f']) && $info['f']) {
|
|
$this->writer->write('/Filter /' . $info['f']);
|
|
}
|
|
|
|
if (isset($info['parms'])) {
|
|
$this->writer->write($info['parms']);
|
|
}
|
|
|
|
if (isset($info['trns']) && is_array($info['trns'])) {
|
|
$trns = '';
|
|
$maskCount = count($info['trns']);
|
|
for ($i = 0; $i < $maskCount; $i++) {
|
|
$trns .= $info['trns'][$i] . ' ' . $info['trns'][$i] . ' ';
|
|
}
|
|
$this->writer->write('/Mask [' . $trns . ']');
|
|
}
|
|
|
|
$this->writer->write('/Length ' . strlen($info['data']) . '>>');
|
|
$this->writer->stream($info['data']);
|
|
|
|
unset($this->mpdf->images[$file]['data']);
|
|
|
|
$this->writer->write('endobj');
|
|
|
|
if ($icc) { // ICC colour profile
|
|
$this->writer->object();
|
|
$icc = $this->mpdf->compress ? gzcompress($info['icc']) : $info['icc'];
|
|
$this->writer->write('<</N ' . $info['ch'] . ' ' . $filter . '/Length ' . strlen($icc) . '>>');
|
|
$this->writer->stream($icc);
|
|
$this->writer->write('endobj');
|
|
} elseif ($info['cs'] === 'Indexed') { // Palette
|
|
$this->writer->object();
|
|
$pal = $this->mpdf->compress ? gzcompress($info['pal']) : $info['pal'];
|
|
$this->writer->write('<<' . $filter . '/Length ' . strlen($pal) . '>>');
|
|
$this->writer->stream($pal);
|
|
$this->writer->write('endobj');
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|