[url] [link_x] [link_y] [link_w] [link_h]\n"); exit(1); } $widthPx = (float) $argv[1]; $heightPx = (float) $argv[2]; $imagePath = $argv[3]; $outputPath = $argv[4]; $url = $argv[5] ?? ''; if (!file_exists($imagePath)) { fwrite(STDERR, "Image not found: {$imagePath}\n"); exit(1); } $imagePath = realpath($imagePath) ?: $imagePath; $url = trim(html_entity_decode($url, ENT_QUOTES | ENT_HTML5, 'UTF-8')); $url = str_replace( ["\xE2\x81\x84", "\xE2\x88\x95", "\xEF\xBC\x8F", "\xE2\xA7\xB8", '/', '⁄', '∕'], '/', $url ); if ($url !== '' && !preg_match('#^https?://#i', $url)) { $url = 'https://' . ltrim($url, '/'); } $widthMm = max(1, $widthPx * 25.4 / 96); $heightMm = max(1, $heightPx * 25.4 / 96); $pxToMm = static function (float $px): float { return $px * 25.4 / 96; }; $mpdf = new \Mpdf\Mpdf([ 'format' => [$widthMm, $heightMm], 'margin_left' => 0, 'margin_right' => 0, 'margin_top' => 0, 'margin_bottom' => 0, 'margin_header' => 0, 'margin_footer' => 0, 'allow_local_files' => true, ]); $escapedImage = htmlspecialchars($imagePath, ENT_QUOTES, 'UTF-8'); $imgTag = ''; $html = ''; if ($url !== '') { $escapedUrl = htmlspecialchars($url, ENT_QUOTES, 'UTF-8'); $hasLinkRect = $argc >= 9; if ($hasLinkRect) { $linkLeftMm = $pxToMm((float) $argv[6]); $linkTopMm = $pxToMm((float) $argv[7]); $linkWidthMm = max(1, $pxToMm((float) $argv[8])); $linkHeightMm = max(1, $pxToMm((float) $argv[9])); $html .= '' . $imgTag . ''; } else { $html .= '' . '' . $imgTag . ''; } } else { $html .= '' . $imgTag; } $html .= ''; $mpdf->WriteHTML($html); $mpdf->Output($outputPath, \Mpdf\Output\Destination::FILE);