mirror of
https://github.com/Karaka-Management/Resources.git
synced 2026-01-12 05:38:41 +00:00
459 lines
15 KiB
PHP
459 lines
15 KiB
PHP
<?php
|
|
|
|
namespace Mpdf\Tag;
|
|
|
|
use Mpdf\Mpdf;
|
|
|
|
class Img extends Tag
|
|
{
|
|
|
|
public function open($attr, &$ahtml, &$ihtml)
|
|
{
|
|
$this->mpdf->ignorefollowingspaces = false;
|
|
$objattr = [];
|
|
$objattr['margin_top'] = 0;
|
|
$objattr['margin_bottom'] = 0;
|
|
$objattr['margin_left'] = 0;
|
|
$objattr['margin_right'] = 0;
|
|
$objattr['padding_top'] = 0;
|
|
$objattr['padding_bottom'] = 0;
|
|
$objattr['padding_left'] = 0;
|
|
$objattr['padding_right'] = 0;
|
|
$objattr['width'] = 0;
|
|
$objattr['height'] = 0;
|
|
$objattr['border_top']['w'] = 0;
|
|
$objattr['border_bottom']['w'] = 0;
|
|
$objattr['border_left']['w'] = 0;
|
|
$objattr['border_right']['w'] = 0;
|
|
if (isset($attr['SRC'])) {
|
|
$srcpath = $attr['SRC'];
|
|
$orig_srcpath = (isset($attr['ORIG_SRC']) ? $attr['ORIG_SRC'] : '');
|
|
$properties = $this->cssManager->MergeCSS('', 'IMG', $attr);
|
|
if (isset($properties ['DISPLAY']) && strtolower($properties ['DISPLAY']) === 'none') {
|
|
return;
|
|
}
|
|
if (isset($properties['Z-INDEX']) && $this->mpdf->current_layer == 0) {
|
|
$v = (int) $properties['Z-INDEX'];
|
|
if ($v > 0) {
|
|
$objattr['z-index'] = $v;
|
|
}
|
|
}
|
|
|
|
$objattr['visibility'] = 'visible';
|
|
if (isset($properties['VISIBILITY'])) {
|
|
$v = strtolower($properties['VISIBILITY']);
|
|
if (($v === 'hidden' || $v === 'printonly' || $v === 'screenonly') && $this->mpdf->visibility === 'visible') {
|
|
$objattr['visibility'] = $v;
|
|
}
|
|
}
|
|
|
|
// VSPACE and HSPACE converted to margins in MergeCSS
|
|
if (isset($properties['MARGIN-TOP'])) {
|
|
$objattr['margin_top'] = $this->sizeConverter->convert(
|
|
$properties['MARGIN-TOP'],
|
|
$this->mpdf->blk[$this->mpdf->blklvl]['inner_width'],
|
|
$this->mpdf->FontSize,
|
|
false
|
|
);
|
|
}
|
|
if (isset($properties['MARGIN-BOTTOM'])) {
|
|
$objattr['margin_bottom'] = $this->sizeConverter->convert(
|
|
$properties['MARGIN-BOTTOM'],
|
|
$this->mpdf->blk[$this->mpdf->blklvl]['inner_width'],
|
|
$this->mpdf->FontSize,
|
|
false
|
|
);
|
|
}
|
|
if (isset($properties['MARGIN-LEFT'])) {
|
|
$objattr['margin_left'] = $this->sizeConverter->convert(
|
|
$properties['MARGIN-LEFT'],
|
|
$this->mpdf->blk[$this->mpdf->blklvl]['inner_width'],
|
|
$this->mpdf->FontSize,
|
|
false
|
|
);
|
|
}
|
|
if (isset($properties['MARGIN-RIGHT'])) {
|
|
$objattr['margin_right'] = $this->sizeConverter->convert(
|
|
$properties['MARGIN-RIGHT'],
|
|
$this->mpdf->blk[$this->mpdf->blklvl]['inner_width'],
|
|
$this->mpdf->FontSize,
|
|
false
|
|
);
|
|
}
|
|
|
|
if (isset($properties['PADDING-TOP'])) {
|
|
$objattr['padding_top'] = $this->sizeConverter->convert(
|
|
$properties['PADDING-TOP'],
|
|
$this->mpdf->blk[$this->mpdf->blklvl]['inner_width'],
|
|
$this->mpdf->FontSize,
|
|
false
|
|
);
|
|
}
|
|
if (isset($properties['PADDING-BOTTOM'])) {
|
|
$objattr['padding_bottom'] = $this->sizeConverter->convert(
|
|
$properties['PADDING-BOTTOM'],
|
|
$this->mpdf->blk[$this->mpdf->blklvl]['inner_width'],
|
|
$this->mpdf->FontSize,
|
|
false
|
|
);
|
|
}
|
|
if (isset($properties['PADDING-LEFT'])) {
|
|
$objattr['padding_left'] = $this->sizeConverter->convert(
|
|
$properties['PADDING-LEFT'],
|
|
$this->mpdf->blk[$this->mpdf->blklvl]['inner_width'],
|
|
$this->mpdf->FontSize,
|
|
false
|
|
);
|
|
}
|
|
if (isset($properties['PADDING-RIGHT'])) {
|
|
$objattr['padding_right'] = $this->sizeConverter->convert(
|
|
$properties['PADDING-RIGHT'],
|
|
$this->mpdf->blk[$this->mpdf->blklvl]['inner_width'],
|
|
$this->mpdf->FontSize,
|
|
false
|
|
);
|
|
}
|
|
|
|
if (isset($properties['BORDER-TOP'])) {
|
|
$objattr['border_top'] = $this->mpdf->border_details($properties['BORDER-TOP']);
|
|
}
|
|
if (isset($properties['BORDER-BOTTOM'])) {
|
|
$objattr['border_bottom'] = $this->mpdf->border_details($properties['BORDER-BOTTOM']);
|
|
}
|
|
if (isset($properties['BORDER-LEFT'])) {
|
|
$objattr['border_left'] = $this->mpdf->border_details($properties['BORDER-LEFT']);
|
|
}
|
|
if (isset($properties['BORDER-RIGHT'])) {
|
|
$objattr['border_right'] = $this->mpdf->border_details($properties['BORDER-RIGHT']);
|
|
}
|
|
|
|
if (isset($properties['VERTICAL-ALIGN'])) {
|
|
$objattr['vertical-align'] = $this->getAlign($properties['VERTICAL-ALIGN']);
|
|
}
|
|
$w = 0;
|
|
$h = 0;
|
|
if (isset($properties['WIDTH'])) {
|
|
$w = $this->sizeConverter->convert(
|
|
$properties['WIDTH'],
|
|
$this->mpdf->blk[$this->mpdf->blklvl]['inner_width'],
|
|
$this->mpdf->FontSize,
|
|
false
|
|
);
|
|
} elseif (isset($attr['WIDTH'])) {
|
|
$w = $this->sizeConverter->convert(
|
|
$attr['WIDTH'],
|
|
$this->mpdf->blk[$this->mpdf->blklvl]['inner_width'],
|
|
$this->mpdf->FontSize,
|
|
false
|
|
);
|
|
}
|
|
if (isset($properties['HEIGHT'])) {
|
|
$h = $this->sizeConverter->convert(
|
|
$properties['HEIGHT'],
|
|
$this->mpdf->blk[$this->mpdf->blklvl]['inner_width'],
|
|
$this->mpdf->FontSize,
|
|
false
|
|
);
|
|
} elseif (isset($attr['HEIGHT'])) {
|
|
$h = $this->sizeConverter->convert(
|
|
$attr['HEIGHT'],
|
|
$this->mpdf->blk[$this->mpdf->blklvl]['inner_width'],
|
|
$this->mpdf->FontSize,
|
|
false
|
|
);
|
|
}
|
|
$maxw = $maxh = $minw = $minh = false;
|
|
if (isset($properties['MAX-WIDTH'])) {
|
|
$maxw = $this->sizeConverter->convert(
|
|
$properties['MAX-WIDTH'],
|
|
$this->mpdf->blk[$this->mpdf->blklvl]['inner_width'],
|
|
$this->mpdf->FontSize,
|
|
false
|
|
);
|
|
} elseif (isset($attr['MAX-WIDTH'])) {
|
|
$maxw = $this->sizeConverter->convert(
|
|
$attr['MAX-WIDTH'],
|
|
$this->mpdf->blk[$this->mpdf->blklvl]['inner_width'],
|
|
$this->mpdf->FontSize,
|
|
false
|
|
);
|
|
}
|
|
if (isset($properties['MAX-HEIGHT'])) {
|
|
$maxh = $this->sizeConverter->convert(
|
|
$properties['MAX-HEIGHT'],
|
|
$this->mpdf->blk[$this->mpdf->blklvl]['inner_width'],
|
|
$this->mpdf->FontSize,
|
|
false
|
|
);
|
|
} elseif (isset($attr['MAX-HEIGHT'])) {
|
|
$maxh = $this->sizeConverter->convert(
|
|
$attr['MAX-HEIGHT'],
|
|
$this->mpdf->blk[$this->mpdf->blklvl]['inner_width'],
|
|
$this->mpdf->FontSize,
|
|
false
|
|
);
|
|
}
|
|
if (isset($properties['MIN-WIDTH'])) {
|
|
$minw = $this->sizeConverter->convert(
|
|
$properties['MIN-WIDTH'],
|
|
$this->mpdf->blk[$this->mpdf->blklvl]['inner_width'],
|
|
$this->mpdf->FontSize,
|
|
false
|
|
);
|
|
} elseif (isset($attr['MIN-WIDTH'])) {
|
|
$minw = $this->sizeConverter->convert(
|
|
$attr['MIN-WIDTH'],
|
|
$this->mpdf->blk[$this->mpdf->blklvl]['inner_width'],
|
|
$this->mpdf->FontSize,
|
|
false
|
|
);
|
|
}
|
|
if (isset($properties['MIN-HEIGHT'])) {
|
|
$minh = $this->sizeConverter->convert(
|
|
$properties['MIN-HEIGHT'],
|
|
$this->mpdf->blk[$this->mpdf->blklvl]['inner_width'],
|
|
$this->mpdf->FontSize,
|
|
false
|
|
);
|
|
} elseif (isset($attr['MIN-HEIGHT'])) {
|
|
$minh = $this->sizeConverter->convert(
|
|
$attr['MIN-HEIGHT'],
|
|
$this->mpdf->blk[$this->mpdf->blklvl]['inner_width'],
|
|
$this->mpdf->FontSize,
|
|
false
|
|
);
|
|
}
|
|
|
|
if (isset($properties['OPACITY']) && $properties['OPACITY'] > 0 && $properties['OPACITY'] <= 1) {
|
|
$objattr['opacity'] = $properties['OPACITY'];
|
|
}
|
|
if ($this->mpdf->HREF) {
|
|
if (strpos($this->mpdf->HREF, '.') === false && strpos($this->mpdf->HREF, '@') !== 0) {
|
|
$href = $this->mpdf->HREF;
|
|
while (array_key_exists($href, $this->mpdf->internallink)) {
|
|
$href = '#' . $href;
|
|
}
|
|
$this->mpdf->internallink[$href] = $this->mpdf->AddLink();
|
|
$objattr['link'] = $this->mpdf->internallink[$href];
|
|
} else {
|
|
$objattr['link'] = $this->mpdf->HREF;
|
|
}
|
|
}
|
|
$extraheight = $objattr['padding_top'] + $objattr['padding_bottom'] + $objattr['margin_top']
|
|
+ $objattr['margin_bottom'] + $objattr['border_top']['w'] + $objattr['border_bottom']['w'];
|
|
|
|
$extrawidth = $objattr['padding_left'] + $objattr['padding_right'] + $objattr['margin_left']
|
|
+ $objattr['margin_right'] + $objattr['border_left']['w'] + $objattr['border_right']['w'];
|
|
|
|
// mPDF 5.7.3 TRANSFORMS
|
|
if (isset($properties['BACKGROUND-COLOR']) && $properties['BACKGROUND-COLOR'] != '') {
|
|
$objattr['bgcolor'] = $this->colorConverter->convert($properties['BACKGROUND-COLOR'], $this->mpdf->PDFAXwarnings);
|
|
}
|
|
|
|
/* -- BACKGROUNDS -- */
|
|
if (isset($properties['GRADIENT-MASK']) && preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/', $properties['GRADIENT-MASK'])) {
|
|
$objattr['GRADIENT-MASK'] = $properties['GRADIENT-MASK'];
|
|
}
|
|
/* -- END BACKGROUNDS -- */
|
|
|
|
// mPDF 6
|
|
$interpolation = false;
|
|
if (!empty($properties['IMAGE-RENDERING'])) {
|
|
$interpolation = false;
|
|
if (strtolower($properties['IMAGE-RENDERING']) === 'crisp-edges') {
|
|
$interpolation = false;
|
|
} elseif (strtolower($properties['IMAGE-RENDERING']) === 'optimizequality') {
|
|
$interpolation = true;
|
|
} elseif (strtolower($properties['IMAGE-RENDERING']) === 'smooth') {
|
|
$interpolation = true;
|
|
} elseif (strtolower($properties['IMAGE-RENDERING']) === 'auto') {
|
|
$interpolation = $this->mpdf->interpolateImages;
|
|
}
|
|
$info['interpolation'] = $interpolation;
|
|
}
|
|
|
|
// Image file
|
|
$info = $this->imageProcessor->getImage($srcpath, true, true, $orig_srcpath, $interpolation); // mPDF 6
|
|
if (!$info) {
|
|
$info = $this->imageProcessor->getImage($this->mpdf->noImageFile);
|
|
if ($info) {
|
|
$srcpath = $this->mpdf->noImageFile;
|
|
$w = ($info['w'] * (25.4 / $this->mpdf->img_dpi));
|
|
$h = ($info['h'] * (25.4 / $this->mpdf->img_dpi));
|
|
}
|
|
}
|
|
if (!$info) {
|
|
return;
|
|
}
|
|
|
|
$image_orientation = 0;
|
|
if (isset($attr['ROTATE'])) {
|
|
$image_orientation = $attr['ROTATE'];
|
|
} elseif (isset($properties['IMAGE-ORIENTATION'])) {
|
|
$image_orientation = $properties['IMAGE-ORIENTATION'];
|
|
}
|
|
if ($image_orientation) {
|
|
if ($image_orientation == 90 || $image_orientation == -90 || $image_orientation == 270) {
|
|
$tmpw = $info['w'];
|
|
$info['w'] = $info['h'];
|
|
$info['h'] = $tmpw;
|
|
}
|
|
$objattr['ROTATE'] = $image_orientation;
|
|
}
|
|
|
|
$objattr['file'] = $srcpath;
|
|
//Default width and height calculation if needed
|
|
if ($w == 0 && $h == 0) {
|
|
/* -- IMAGES-WMF -- */
|
|
if ($info['type'] === 'wmf') {
|
|
// WMF units are twips (1/20pt)
|
|
// divide by 20 to get points
|
|
// divide by k to get user units
|
|
$w = abs($info['w']) / (20 * Mpdf::SCALE);
|
|
$h = abs($info['h']) / (20 * Mpdf::SCALE);
|
|
} else { /* -- END IMAGES-WMF -- */
|
|
if ($info['type'] === 'svg') {
|
|
// SVG units are pixels
|
|
$w = abs($info['w']) / Mpdf::SCALE;
|
|
$h = abs($info['h']) / Mpdf::SCALE;
|
|
} else {
|
|
//Put image at default image dpi
|
|
$w = ($info['w'] / Mpdf::SCALE) * (72 / $this->mpdf->img_dpi);
|
|
$h = ($info['h'] / Mpdf::SCALE) * (72 / $this->mpdf->img_dpi);
|
|
}
|
|
}
|
|
if (isset($properties['IMAGE-RESOLUTION'])) {
|
|
if (preg_match('/from-image/i', $properties['IMAGE-RESOLUTION']) && isset($info['set-dpi']) && $info['set-dpi'] > 0) {
|
|
$w *= $this->mpdf->img_dpi / $info['set-dpi'];
|
|
$h *= $this->mpdf->img_dpi / $info['set-dpi'];
|
|
} elseif (preg_match('/(\d+)dpi/i', $properties['IMAGE-RESOLUTION'], $m)) {
|
|
$dpi = $m[1];
|
|
if ($dpi > 0) {
|
|
$w *= $this->mpdf->img_dpi / $dpi;
|
|
$h *= $this->mpdf->img_dpi / $dpi;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// IF WIDTH OR HEIGHT SPECIFIED
|
|
if ($w == 0) {
|
|
$w = $info['h'] ? abs($h * $info['w'] / $info['h']) : INF;
|
|
}
|
|
|
|
if ($h == 0) {
|
|
$h = $info['w'] ? abs($w * $info['h'] / $info['w']) : INF;
|
|
}
|
|
|
|
if ($minw && $w < $minw) {
|
|
$w = $minw;
|
|
$h = $info['w'] ? abs($w * $info['h'] / $info['w']) : INF;
|
|
}
|
|
if ($maxw && $w > $maxw) {
|
|
$w = $maxw;
|
|
$h = $info['w'] ? abs($w * $info['h'] / $info['w']) : INF;
|
|
}
|
|
if ($minh && $h < $minh) {
|
|
$h = $minh;
|
|
$w = $info['h'] ? abs($h * $info['w'] / $info['h']) : INF;
|
|
}
|
|
if ($maxh && $h > $maxh) {
|
|
$h = $maxh;
|
|
$w = $info['h'] ? abs($h * $info['w'] / $info['h']) : INF;
|
|
}
|
|
|
|
// Resize to maximum dimensions of page
|
|
$maxWidth = $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'];
|
|
$maxHeight = $this->mpdf->h - ($this->mpdf->tMargin + $this->mpdf->bMargin + 1);
|
|
if ($this->mpdf->fullImageHeight) {
|
|
$maxHeight = $this->mpdf->fullImageHeight;
|
|
}
|
|
if (($w + $extrawidth) > ($maxWidth + 0.0001)) { // mPDF 5.7.4 0.0001 to allow for rounding errors when w==maxWidth
|
|
$w = $maxWidth - $extrawidth;
|
|
$h = abs($w * $info['h'] / $info['w']);
|
|
}
|
|
|
|
if ($h + $extraheight > $maxHeight) {
|
|
$h = $maxHeight - $extraheight;
|
|
$w = abs($h * $info['w'] / $info['h']);
|
|
}
|
|
$objattr['type'] = 'image';
|
|
$objattr['itype'] = $info['type'];
|
|
|
|
$objattr['orig_h'] = $info['h'];
|
|
$objattr['orig_w'] = $info['w'];
|
|
/* -- IMAGES-WMF -- */
|
|
if ($info['type'] === 'wmf') {
|
|
$objattr['wmf_x'] = $info['x'];
|
|
$objattr['wmf_y'] = $info['y'];
|
|
} else { /* -- END IMAGES-WMF -- */
|
|
if ($info['type'] === 'svg') {
|
|
$objattr['wmf_x'] = $info['x'];
|
|
$objattr['wmf_y'] = $info['y'];
|
|
}
|
|
}
|
|
$objattr['height'] = $h + $extraheight;
|
|
$objattr['width'] = $w + $extrawidth;
|
|
$objattr['image_height'] = $h;
|
|
$objattr['image_width'] = $w;
|
|
/* -- CSS-IMAGE-FLOAT -- */
|
|
if (!$this->mpdf->ColActive && !$this->mpdf->tableLevel && !$this->mpdf->listlvl && !$this->mpdf->kwt) {
|
|
if (isset($properties['FLOAT']) && (strtoupper($properties['FLOAT']) === 'RIGHT' || strtoupper($properties['FLOAT']) === 'LEFT')) {
|
|
$objattr['float'] = strtoupper(substr($properties['FLOAT'], 0, 1));
|
|
}
|
|
}
|
|
/* -- END CSS-IMAGE-FLOAT -- */
|
|
// mPDF 5.7.3 TRANSFORMS
|
|
if (isset($properties['TRANSFORM']) && !$this->mpdf->ColActive && !$this->mpdf->kwt) {
|
|
$objattr['transform'] = $properties['TRANSFORM'];
|
|
}
|
|
|
|
$e = "\xbb\xa4\xactype=image,objattr=" . serialize($objattr) . "\xbb\xa4\xac";
|
|
|
|
/* -- TABLES -- */
|
|
// Output it to buffers
|
|
if ($this->mpdf->tableLevel) {
|
|
$this->mpdf->_saveCellTextBuffer($e, $this->mpdf->HREF);
|
|
$this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s'] += $objattr['width'];
|
|
} else {
|
|
/* -- END TABLES -- */
|
|
$this->mpdf->_saveTextBuffer($e, $this->mpdf->HREF);
|
|
} // *TABLES*
|
|
/* -- ANNOTATIONS -- */
|
|
if ($this->mpdf->title2annots && isset($attr['TITLE'])) {
|
|
$objattr = [];
|
|
$objattr['margin_top'] = 0;
|
|
$objattr['margin_bottom'] = 0;
|
|
$objattr['margin_left'] = 0;
|
|
$objattr['margin_right'] = 0;
|
|
$objattr['width'] = 0;
|
|
$objattr['height'] = 0;
|
|
$objattr['border_top']['w'] = 0;
|
|
$objattr['border_bottom']['w'] = 0;
|
|
$objattr['border_left']['w'] = 0;
|
|
$objattr['border_right']['w'] = 0;
|
|
$objattr['CONTENT'] = $attr['TITLE'];
|
|
$objattr['type'] = 'annot';
|
|
$objattr['POS-X'] = 0;
|
|
$objattr['POS-Y'] = 0;
|
|
$objattr['ICON'] = 'Comment';
|
|
$objattr['AUTHOR'] = '';
|
|
$objattr['SUBJECT'] = '';
|
|
$objattr['OPACITY'] = $this->mpdf->annotOpacity;
|
|
$objattr['COLOR'] = $this->colorConverter->convert('yellow', $this->mpdf->PDFAXwarnings);
|
|
$e = "\xbb\xa4\xactype=annot,objattr=" . serialize($objattr) . "\xbb\xa4\xac";
|
|
if ($this->mpdf->tableLevel) { // *TABLES*
|
|
$this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['textbuffer'][] = [$e]; // *TABLES*
|
|
} // *TABLES*
|
|
else { // *TABLES*
|
|
$this->mpdf->textbuffer[] = [$e];
|
|
} // *TABLES*
|
|
}
|
|
/* -- END ANNOTATIONS -- */
|
|
}
|
|
}
|
|
|
|
public function close(&$ahtml, &$ihtml)
|
|
{
|
|
}
|
|
}
|