.
//
// See LICENSE.TXT file for more information.
// -------------------------------------------------------------------
//
// Description :
// Static methods used by the TCPDF class.
//
//============================================================+
/**
* @file
* This is a PHP class that contains static methods for the TCPDF class.
* @package com.tecnick.tcpdf
* @author Nicola Asuni
* @version 1.1.2
*/
/**
* @class TCPDF_STATIC
* Static methods used by the TCPDF class.
* @package com.tecnick.tcpdf
* @brief PHP class for generating PDF documents without requiring external extensions.
* @version 1.1.1
* @author Nicola Asuni - info@tecnick.com
*/
class TCPDF_STATIC {
/**
* Current TCPDF version.
* @private static
*/
private static $tcpdf_version = '6.4.4';
/**
* String alias for total number of pages.
* @public static
*/
public static $alias_tot_pages = '{:ptp:}';
/**
* String alias for page number.
* @public static
*/
public static $alias_num_page = '{:pnp:}';
/**
* String alias for total number of pages in a single group.
* @public static
*/
public static $alias_group_tot_pages = '{:ptg:}';
/**
* String alias for group page number.
* @public static
*/
public static $alias_group_num_page = '{:png:}';
/**
* String alias for right shift compensation used to correctly align page numbers on the right.
* @public static
*/
public static $alias_right_shift = '{rsc:';
/**
* Encryption padding string.
* @public static
*/
public static $enc_padding = "\x28\xBF\x4E\x5E\x4E\x75\x8A\x41\x64\x00\x4E\x56\xFF\xFA\x01\x08\x2E\x2E\x00\xB6\xD0\x68\x3E\x80\x2F\x0C\xA9\xFE\x64\x53\x69\x7A";
/**
* ByteRange placemark used during digital signature process.
* @since 4.6.028 (2009-08-25)
* @public static
*/
public static $byterange_string = '/ByteRange[0 ********** ********** **********]';
/**
* Array page boxes names
* @public static
*/
public static $pageboxes = ['MediaBox', 'CropBox', 'BleedBox', 'TrimBox', 'ArtBox'];
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/**
* Return the current TCPDF version.
* @return string TCPDF version string
* @since 5.9.012 (2010-11-10)
* @public static
*/
public static function getTCPDFVersion() {
return self::$tcpdf_version;
}
/**
* Return the current TCPDF producer.
* @return string TCPDF producer string
* @since 6.0.000 (2013-03-16)
* @public static
*/
public static function getTCPDFProducer() {
return "\x3F "; // Don't show TCPDF version to hide from crawlers in case of vulnerabilities
}
/**
* Sets the current active configuration setting of magic_quotes_runtime (if the set_magic_quotes_runtime function exist)
* @param bool $mqr FALSE for off, TRUE for on
* @since 4.6.025 (2009-08-17)
* @public static
*/
public static function set_mqr($mqr) : void {
if (!\defined('PHP_VERSION_ID')) {
$version = \PHP_VERSION;
\define('PHP_VERSION_ID', (($version[0] * 10000) + ($version[2] * 100) + $version[4]));
}
if (\PHP_VERSION_ID < 50300) {
@\set_magic_quotes_runtime($mqr);
}
}
/**
* Gets the current active configuration setting of magic_quotes_runtime (if the get_magic_quotes_runtime function exist)
* @return int returns 0 if magic quotes runtime is off or get_magic_quotes_runtime doesn't exist, 1 otherwise
* @since 4.6.025 (2009-08-17)
* @public static
*/
public static function get_mqr() {
if (!\defined('PHP_VERSION_ID')) {
$version = \PHP_VERSION;
\define('PHP_VERSION_ID', (($version[0] * 10000) + ($version[2] * 100) + $version[4]));
}
if (\PHP_VERSION_ID < 50300) {
return @\get_magic_quotes_runtime();
}
return 0;
}
/**
* Check if the URL exist.
* @param string $url URL to check
* @return bool true if the URl exist, false otherwise
* @since 5.9.204 (2013-01-28)
* @public static
*/
public static function isValidURL($url) {
$headers = @\get_headers($url);
if ($headers === false) {
return false;
}
return (\strpos($headers[0], '200') !== false);
}
/**
* Removes SHY characters from text.
* Unicode Data:
]*)><\/div>/', '', $html);
$html = \preg_replace('/
]*)><\/p>/', '', $html);
if (!self::empty_string($tagvs)) {
// set vertical space for some XHTML tags
$tagvspaces = $tagvs;
}
// return the cleaned XHTML code + CSS
return $css.$html;
}
/**
* Returns true if the CSS selector is valid for the selected HTML tag
* @param array $dom array of HTML tags and properties
* @param int $key key of the current HTML tag
* @param string $selector CSS selector string
* @return true if the selector is valid, false otherwise
* @since 5.1.000 (2010-05-25)
* @public static
*/
public static function isValidCSSSelectorForTag($dom, $key, $selector) {
$valid = false; // value to be returned
$tag = $dom[$key]['value'];
$class = [];
if (isset($dom[$key]['attribute']['class']) && !empty($dom[$key]['attribute']['class'])) {
$class = \explode(' ', \strtolower($dom[$key]['attribute']['class']));
}
$id = '';
if (isset($dom[$key]['attribute']['id']) && !empty($dom[$key]['attribute']['id'])) {
$id = \strtolower($dom[$key]['attribute']['id']);
}
$selector = \preg_replace('/([\>\+\~\s]{1})([\.]{1})([^\>\+\~\s]*)/si', '\\1*.\\3', $selector);
$matches = [];
if (\preg_match_all('/([\>\+\~\s]{1})([a-zA-Z0-9\*]+)([^\>\+\~\s]*)/si', $selector, $matches, \PREG_PATTERN_ORDER | \PREG_OFFSET_CAPTURE) > 0) {
$parentop = \array_pop($matches[1]);
$operator = $parentop[0];
$offset = $parentop[1];
$lasttag = \array_pop($matches[2]);
$lasttag = \strtolower(\trim($lasttag[0]));
if (($lasttag === '*') || ($lasttag == $tag)) {
// the last element on selector is our tag or 'any tag'
$attrib = \array_pop($matches[3]);
$attrib = \strtolower(\trim($attrib[0]));
if (!empty($attrib)) {
// check if matches class, id, attribute, pseudo-class or pseudo-element
switch ($attrib[0]) {
case '.': { // class
if (\in_array(\substr($attrib, 1), $class)) {
$valid = true;
}
break;
}
case '#': { // ID
if (\substr($attrib, 1) == $id) {
$valid = true;
}
break;
}
case '[': { // attribute
$attrmatch = [];
if (\preg_match('/\[([a-zA-Z0-9]*)[\s]*([\~\^\$\*\|\=]*)[\s]*["]?([^"\]]*)["]?\]/i', $attrib, $attrmatch) > 0) {
$att = \strtolower($attrmatch[1]);
$val = $attrmatch[3];
if (isset($dom[$key]['attribute'][$att])) {
switch ($attrmatch[2]) {
case '=': {
if ($dom[$key]['attribute'][$att] == $val) {
$valid = true;
}
break;
}
case '~=': {
if (\in_array($val, \explode(' ', $dom[$key]['attribute'][$att]))) {
$valid = true;
}
break;
}
case '^=': {
if ($val == \substr($dom[$key]['attribute'][$att], 0, \strlen($val))) {
$valid = true;
}
break;
}
case '$=': {
if ($val == \substr($dom[$key]['attribute'][$att], -\strlen($val))) {
$valid = true;
}
break;
}
case '*=': {
if (\strpos($dom[$key]['attribute'][$att], $val) !== false) {
$valid = true;
}
break;
}
case '|=': {
if ($dom[$key]['attribute'][$att] == $val) {
$valid = true;
} elseif (\preg_match('/'.$val.'[\-]{1}/i', $dom[$key]['attribute'][$att]) > 0) {
$valid = true;
}
break;
}
default: {
$valid = true;
}
}
}
}
break;
}
case ':': { // pseudo-class or pseudo-element
if ($attrib[1] === ':') { // pseudo-element
// pseudo-elements are not supported!
// (::first-line, ::first-letter, ::before, ::after)
} else { // pseudo-class
// pseudo-classes are not supported!
// (:root, :nth-child(n), :nth-last-child(n), :nth-of-type(n), :nth-last-of-type(n), :first-child, :last-child, :first-of-type, :last-of-type, :only-child, :only-of-type, :empty, :link, :visited, :active, :hover, :focus, :target, :lang(fr), :enabled, :disabled, :checked)
}
break;
}
} // end of switch
} else {
$valid = true;
}
if ($valid && ($offset > 0)) {
$valid = false;
// check remaining selector part
$selector = \substr($selector, 0, $offset);
switch ($operator) {
case ' ': { // descendant of an element
while ($dom[$key]['parent'] > 0) {
if (self::isValidCSSSelectorForTag($dom, $dom[$key]['parent'], $selector)) {
$valid = true;
break;
} else {
$key = $dom[$key]['parent'];
}
}
break;
}
case '>': { // child of an element
$valid = self::isValidCSSSelectorForTag($dom, $dom[$key]['parent'], $selector);
break;
}
case '+': { // immediately preceded by an element
for ($i = ($key - 1); $i > $dom[$key]['parent']; --$i) {
if ($dom[$i]['tag'] && $dom[$i]['opening']) {
$valid = self::isValidCSSSelectorForTag($dom, $i, $selector);
break;
}
}
break;
}
case '~': { // preceded by an element
for ($i = ($key - 1); $i > $dom[$key]['parent']; --$i) {
if ($dom[$i]['tag'] && $dom[$i]['opening']) {
if (self::isValidCSSSelectorForTag($dom, $i, $selector)) {
break;
}
}
}
break;
}
}
}
}
}
return $valid;
}
/**
* Returns the styles array that apply for the selected HTML tag.
* @param array $dom array of HTML tags and properties
* @param int $key key of the current HTML tag
* @param array $css array of CSS properties
* @return array containing CSS properties
* @since 5.1.000 (2010-05-25)
* @public static
*/
public static function getCSSdataArray($dom, $key, $css) {
$cssarray = []; // style to be returned
// get parent CSS selectors
$selectors = [];
if (isset($dom[($dom[$key]['parent'])]['csssel'])) {
$selectors = $dom[($dom[$key]['parent'])]['csssel'];
}
// get all styles that apply
foreach($css as $selector => $style) {
$pos = \strpos($selector, ' ');
// get specificity
$specificity = \substr($selector, 0, $pos);
// remove specificity
$selector = \substr($selector, $pos);
// check if this selector apply to current tag
if (self::isValidCSSSelectorForTag($dom, $key, $selector)) {
if (!\in_array($selector, $selectors)) {
// add style if not already added on parent selector
$cssarray[] = ['k' => $selector, 's' => $specificity, 'c' => $style];
$selectors[] = $selector;
}
}
}
if (isset($dom[$key]['attribute']['style'])) {
// attach inline style (latest properties have high priority)
$cssarray[] = ['k' => '', 's' => '1000', 'c' => $dom[$key]['attribute']['style']];
}
// order the css array to account for specificity
$cssordered = [];
foreach ($cssarray as $key => $val) {
$skey = \sprintf('%04d', $key);
$cssordered[$val['s'].'_'.$skey] = $val;
}
// sort selectors alphabetically to account for specificity
\ksort($cssordered, \SORT_STRING);
return [$selectors, $cssordered];
}
/**
* Compact CSS data array into single string.
* @param array $css array of CSS properties
* @return string containing merged CSS properties
* @since 5.9.070 (2011-04-19)
* @public static
*/
public static function getTagStyleFromCSSarray($css) {
$tagstyle = ''; // value to be returned
foreach ($css as $style) {
// split single css commands
$csscmds = \explode(';', $style['c']);
foreach ($csscmds as $cmd) {
if (!empty($cmd)) {
$pos = \strpos($cmd, ':');
if ($pos !== false) {
$cmd = \substr($cmd, 0, ($pos + 1));
if (\strpos($tagstyle, $cmd) !== false) {
// remove duplicate commands (last commands have high priority)
$tagstyle = \preg_replace('/'.$cmd.'[^;]+/i', '', $tagstyle);
}
}
}
}
$tagstyle .= ';'.$style['c'];
}
// remove multiple semicolons
$tagstyle = \preg_replace('/[;]+/', ';', $tagstyle);
return $tagstyle;
}
/**
* Returns the Roman representation of an integer number
* @param int $number number to convert
* @return string roman representation of the specified number
* @since 4.4.004 (2008-12-10)
* @public static
*/
public static function intToRoman($number) {
$roman = '';
if ($number >= 4000) {
// do not represent numbers above 4000 in Roman numerals
return (string) $number;
}
while ($number >= 1000) {
$roman .= 'M';
$number -= 1000;
}
while ($number >= 900) {
$roman .= 'CM';
$number -= 900;
}
while ($number >= 500) {
$roman .= 'D';
$number -= 500;
}
while ($number >= 400) {
$roman .= 'CD';
$number -= 400;
}
while ($number >= 100) {
$roman .= 'C';
$number -= 100;
}
while ($number >= 90) {
$roman .= 'XC';
$number -= 90;
}
while ($number >= 50) {
$roman .= 'L';
$number -= 50;
}
while ($number >= 40) {
$roman .= 'XL';
$number -= 40;
}
while ($number >= 10) {
$roman .= 'X';
$number -= 10;
}
while ($number >= 9) {
$roman .= 'IX';
$number -= 9;
}
while ($number >= 5) {
$roman .= 'V';
$number -= 5;
}
while ($number >= 4) {
$roman .= 'IV';
$number -= 4;
}
while ($number >= 1) {
$roman .= 'I';
--$number;
}
return $roman;
}
/**
* Find position of last occurrence of a substring in a string
* @param string $haystack the string to search in
* @param string $needle substring to search
* @param int $offset may be specified to begin searching an arbitrary number of characters into the string
* @return int|false Returns the position where the needle exists. Returns FALSE if the needle was not found.
* @since 4.8.038 (2010-03-13)
* @public static
*/
public static function revstrpos($haystack, $needle, $offset = 0) {
$length = \strlen($haystack);
$offset = ($offset > 0)?($length - $offset):\abs($offset);
$pos = \strpos(\strrev($haystack), \strrev($needle), $offset);
return ($pos === false)?false:($length - $pos - \strlen($needle));
}
/**
* Returns an array of hyphenation patterns.
* @param string $file TEX file containing hypenation patterns. TEX patterns can be downloaded from http://www.ctan.org/tex-archive/language/hyph-utf8/tex/generic/hyph-utf8/patterns/
* @return array of hyphenation patterns
* @author Nicola Asuni
* @since 4.9.012 (2010-04-12)
* @public static
*/
public static function getHyphenPatternsFromTEX($file) {
// TEX patterns are available at:
// http://www.ctan.org/tex-archive/language/hyph-utf8/tex/generic/hyph-utf8/patterns/
$data = \file_get_contents($file);
$patterns = [];
// remove comments
$data = \preg_replace('/\%[^\n]*/', '', $data);
// extract the patterns part
\preg_match('/\\\\patterns\{([^\}]*)\}/i', $data, $matches);
$data = \trim(\substr($matches[0], 10, -1));
// extract each pattern
$patterns_array = \preg_split('/[\s]+/', $data);
// create new language array of patterns
$patterns = [];
foreach($patterns_array as $val) {
if (!self::empty_string($val)) {
$val = \trim($val);
$val = \str_replace('\'', '\\\'', $val);
$key = \preg_replace('/[0-9]+/', '', $val);
$patterns[$key] = $val;
}
}
return $patterns;
}
/**
* Get the Path-Painting Operators.
* @param string $style Style of rendering. Possible values are:
*
* - S or D: Stroke the path.
* - s or d: Close and stroke the path.
* - f or F: Fill the path, using the nonzero winding number rule to determine the region to fill.
* - f* or F*: Fill the path, using the even-odd rule to determine the region to fill.
* - B or FD or DF: Fill and then stroke the path, using the nonzero winding number rule to determine the region to fill.
* - B* or F*D or DF*: Fill and then stroke the path, using the even-odd rule to determine the region to fill.
* - b or fd or df: Close, fill, and then stroke the path, using the nonzero winding number rule to determine the region to fill.
* - b or f*d or df*: Close, fill, and then stroke the path, using the even-odd rule to determine the region to fill.
* - CNZ: Clipping mode using the even-odd rule to determine which regions lie inside the clipping path.
* - CEO: Clipping mode using the nonzero winding number rule to determine which regions lie inside the clipping path
* - n: End the path object without filling or stroking it.
*
* @param string $default default style
* @return string
* @author Nicola Asuni
* @since 5.0.000 (2010-04-30)
* @public static
*/
public static function getPathPaintOperator($style, $default='S') {
$op = '';
switch($style) {
case 'S':
case 'D': {
$op = 'S';
break;
}
case 's':
case 'd': {
$op = 's';
break;
}
case 'f':
case 'F': {
$op = 'f';
break;
}
case 'f*':
case 'F*': {
$op = 'f*';
break;
}
case 'B':
case 'FD':
case 'DF': {
$op = 'B';
break;
}
case 'B*':
case 'F*D':
case 'DF*': {
$op = 'B*';
break;
}
case 'b':
case 'fd':
case 'df': {
$op = 'b';
break;
}
case 'b*':
case 'f*d':
case 'df*': {
$op = 'b*';
break;
}
case 'CNZ': {
$op = 'W n';
break;
}
case 'CEO': {
$op = 'W* n';
break;
}
case 'n': {
$op = 'n';
break;
}
default: {
if (!empty($default)) {
$op = self::getPathPaintOperator($default, '');
} else {
$op = '';
}
}
}
return $op;
}
/**
* Get the product of two SVG tranformation matrices
* @param array $ta first SVG tranformation matrix
* @param array $tb second SVG tranformation matrix
* @return array transformation array
* @author Nicola Asuni
* @since 5.0.000 (2010-05-02)
* @public static
*/
public static function getTransformationMatrixProduct($ta, $tb) {
$tm = [];
$tm[0] = ($ta[0] * $tb[0]) + ($ta[2] * $tb[1]);
$tm[1] = ($ta[1] * $tb[0]) + ($ta[3] * $tb[1]);
$tm[2] = ($ta[0] * $tb[2]) + ($ta[2] * $tb[3]);
$tm[3] = ($ta[1] * $tb[2]) + ($ta[3] * $tb[3]);
$tm[4] = ($ta[0] * $tb[4]) + ($ta[2] * $tb[5]) + $ta[4];
$tm[5] = ($ta[1] * $tb[4]) + ($ta[3] * $tb[5]) + $ta[5];
return $tm;
}
/**
* Get the tranformation matrix from SVG transform attribute
* @param string $attribute transformation
* @return array of transformations
* @author Nicola Asuni
* @since 5.0.000 (2010-05-02)
* @public static
*/
public static function getSVGTransformMatrix($attribute) {
// identity matrix
$tm = [1, 0, 0, 1, 0, 0];
$transform = [];
if (\preg_match_all('/(matrix|translate|scale|rotate|skewX|skewY)[\s]*\(([^\)]+)\)/si', $attribute, $transform, \PREG_SET_ORDER) > 0) {
foreach ($transform as $key => $data) {
if (!empty($data[2])) {
$a = 1;
$b = 0;
$c = 0;
$d = 1;
$e = 0;
$f = 0;
$regs = [];
switch ($data[1]) {
case 'matrix': {
if (\preg_match('/([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)/si', $data[2], $regs)) {
$a = $regs[1];
$b = $regs[2];
$c = $regs[3];
$d = $regs[4];
$e = $regs[5];
$f = $regs[6];
}
break;
}
case 'translate': {
if (\preg_match('/([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)/si', $data[2], $regs)) {
$e = $regs[1];
$f = $regs[2];
} elseif (\preg_match('/([a-z0-9\-\.]+)/si', $data[2], $regs)) {
$e = $regs[1];
}
break;
}
case 'scale': {
if (\preg_match('/([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)/si', $data[2], $regs)) {
$a = $regs[1];
$d = $regs[2];
} elseif (\preg_match('/([a-z0-9\-\.]+)/si', $data[2], $regs)) {
$a = $regs[1];
$d = $a;
}
break;
}
case 'rotate': {
if (\preg_match('/([0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)/si', $data[2], $regs)) {
$ang = \deg2rad($regs[1]);
$x = $regs[2];
$y = $regs[3];
$a = \cos($ang);
$b = \sin($ang);
$c = -$b;
$d = $a;
$e = ($x * (1 - $a)) - ($y * $c);
$f = ($y * (1 - $d)) - ($x * $b);
} elseif (\preg_match('/([0-9\-\.]+)/si', $data[2], $regs)) {
$ang = \deg2rad($regs[1]);
$a = \cos($ang);
$b = \sin($ang);
$c = -$b;
$d = $a;
$e = 0;
$f = 0;
}
break;
}
case 'skewX': {
if (\preg_match('/([0-9\-\.]+)/si', $data[2], $regs)) {
$c = \tan(\deg2rad($regs[1]));
}
break;
}
case 'skewY': {
if (\preg_match('/([0-9\-\.]+)/si', $data[2], $regs)) {
$b = \tan(\deg2rad($regs[1]));
}
break;
}
}
$tm = self::getTransformationMatrixProduct($tm, [$a, $b, $c, $d, $e, $f]);
}
}
}
return $tm;
}
/**
* Returns the angle in radiants between two vectors
* @param int $x1 X coordinate of first vector point
* @param int $y1 Y coordinate of first vector point
* @param int $x2 X coordinate of second vector point
* @param int $y2 Y coordinate of second vector point
* @author Nicola Asuni
* @since 5.0.000 (2010-05-04)
* @public static
*/
public static function getVectorsAngle($x1, $y1, $x2, $y2) {
$dprod = ($x1 * $x2) + ($y1 * $y2);
$dist1 = \sqrt(($x1 * $x1) + ($y1 * $y1));
$dist2 = \sqrt(($x2 * $x2) + ($y2 * $y2));
$angle = \acos($dprod / ($dist1 * $dist2));
if (\is_nan($angle)) {
$angle = \M_PI;
}
if ((($x1 * $y2) - ($x2 * $y1)) < 0) {
$angle *= -1;
}
return $angle;
}
/**
* Split string by a regular expression.
* This is a wrapper for the \preg_split function to avoid the bug: https://bugs.php.net/bug.php?id=45850
* @param string $pattern the regular expression pattern to search for without the modifiers, as a string
* @param string $modifiers The modifiers part of the pattern,
* @param string $subject the input string
* @param int $limit If specified, then only substrings up to limit are returned with the rest of the string being placed in the last substring. A limit of -1, 0 or NULL means "no limit" and, as is standard across PHP, you can use NULL to skip to the flags parameter.
* @param int $flags the flags as specified on the \preg_split PHP function
* @return array Returns an array containing substrings of subject split along boundaries matched by pattern.modifier
* @author Nicola Asuni
* @since 6.0.023
* @public static
*/
public static function pregSplit($pattern, $modifiers, $subject, $limit=null, $flags=null) {
// PHP 8.1 deprecates nulls for $limit and $flags
$limit = $limit === null ? -1 : $limit;
$flags = $flags === null ? 0 : $flags;
// the bug only happens on PHP 5.2 when using the u modifier
if ((\strpos($modifiers, 'u') === false) || (\count(\preg_split('//u', "\n\t", -1, \PREG_SPLIT_NO_EMPTY)) == 2)) {
return \preg_split($pattern.$modifiers, $subject, $limit, $flags);
}
// \preg_split is bugged - try alternative solution
$ret = [];
while (($nl = \strpos($subject, "\n")) !== false) {
$ret = \array_merge($ret, \preg_split($pattern.$modifiers, \substr($subject, 0, $nl), $limit, $flags));
$ret[] = "\n";
$subject = \substr($subject, ($nl + 1));
}
if (\strlen($subject) > 0) {
$ret = \array_merge($ret, \preg_split($pattern.$modifiers, $subject, $limit, $flags));
}
return $ret;
}
/**
* Wrapper to use fopen only with local files
* @param string $filename Name of the file to open
* @param string $mode
* @return resource|false returns a file pointer resource on success, or FALSE on error
* @public static
*/
public static function fopenLocal($filename, $mode) {
if (\strpos($filename, '://') === false) {
$filename = 'file://'.$filename;
} elseif (\stream_is_local($filename) !== true) {
return false;
}
return \fopen($filename, $mode);
}
/**
* Check if the URL exist.
* @param string $url URL to check
* @return bool returns TRUE if the URL exists; FALSE otherwise
* @public static
* @since 6.2.25
*/
public static function url_exists($url) {
$crs = \curl_init();
// encode query params in URL to get right response form the server
$url = self::encodeUrlQuery($url);
\curl_setopt($crs, \CURLOPT_URL, $url);
\curl_setopt($crs, \CURLOPT_NOBODY, true);
\curl_setopt($crs, \CURLOPT_FAILONERROR, true);
if ((\ini_get('open_basedir') === '') && (!\ini_get('safe_mode'))) {
\curl_setopt($crs, \CURLOPT_FOLLOWLOCATION, true);
}
\curl_setopt($crs, \CURLOPT_CONNECTTIMEOUT, 5);
\curl_setopt($crs, \CURLOPT_TIMEOUT, 30);
\curl_setopt($crs, \CURLOPT_SSL_VERIFYPEER, false);
\curl_setopt($crs, \CURLOPT_SSL_VERIFYHOST, false);
\curl_setopt($crs, \CURLOPT_USERAGENT, 'tc-lib-file');
\curl_setopt($crs, \CURLOPT_MAXREDIRS, 5);
if (\defined('CURLOPT_PROTOCOLS')) {
\curl_setopt($crs, \CURLOPT_PROTOCOLS, \CURLPROTO_HTTPS | \CURLPROTO_HTTP | \CURLPROTO_FTP | \CURLPROTO_FTPS);
}
\curl_exec($crs);
$code = \curl_getinfo($crs, \CURLINFO_HTTP_CODE);
\curl_close($crs);
return ($code == 200);
}
/**
* Encode query params in URL
*
* @param string $url
* @return string
* @since 6.3.3 (2019-11-01)
* @public static
*/
public static function encodeUrlQuery($url) {
$urlData = \parse_url($url);
if (isset($urlData['query']) && $urlData['query']) {
$urlQueryData = [];
\parse_str(\urldecode($urlData['query']), $urlQueryData);
$updatedUrl = $urlData['scheme'] . '://' . $urlData['host'] . $urlData['path'] . '?' . \http_build_query($urlQueryData);
} else {
$updatedUrl = $url;
}
return $updatedUrl;
}
/**
* Wrapper for file_exists.
* Checks whether a file or directory exists.
* Only allows some protocols and local files.
* @param string $filename path to the file or directory
* @return bool returns TRUE if the file or directory specified by filename exists; FALSE otherwise
* @public static
*/
public static function file_exists($filename) {
if (\preg_match('|^https?://|', $filename) == 1) {
return self::url_exists($filename);
}
if (\strpos($filename, '://')) {
return false; // only support http and https wrappers for security reasons
}
return @\is_file($filename);
}
/**
* Reads entire file into a string.
* The file can be also an URL.
* @param string $file name of the file or URL to read
* @return string|false the function returns the read data or FALSE on failure
* @author Nicola Asuni
* @since 6.0.025
* @public static
*/
public static function fileGetContents($file) {
$alt = [$file];
if ((\strlen($file) > 1)
&& ($file[0] === '/')
&& ($file[1] !== '/')
&& !empty($_SERVER['DOCUMENT_ROOT'])
&& ($_SERVER['DOCUMENT_ROOT'] !== '/')
) {
$findroot = \strpos($file, $_SERVER['DOCUMENT_ROOT']);
if (($findroot === false) || ($findroot > 1)) {
$alt[] = \htmlspecialchars_decode(\urldecode($_SERVER['DOCUMENT_ROOT'].$file));
}
}
$protocol = 'http';
if (!empty($_SERVER['HTTPS']) && (\strtolower($_SERVER['HTTPS']) != 'off')) {
$protocol .= 's';
}
$url = $file;
if (\preg_match('%^//%', $url) && !empty($_SERVER['HTTP_HOST'])) {
$url = $protocol.':'.\strtr($url, ' ', '%20');
}
$url = \htmlspecialchars_decode($url);
$alt[] = $url;
if (\preg_match('%^(https?)://%', $url)
&& empty($_SERVER['HTTP_HOST'])
&& empty($_SERVER['DOCUMENT_ROOT'])
) {
$urldata = \parse_url($url);
if (empty($urldata['query'])) {
$host = $protocol.'://'.$_SERVER['HTTP_HOST'];
if (\strpos($url, $host) === 0) {
// convert URL to full server path
$tmp = \str_replace($host, $_SERVER['DOCUMENT_ROOT'], $url);
$alt[] = \htmlspecialchars_decode(\urldecode($tmp));
}
}
}
if (isset($_SERVER['SCRIPT_URI'])
&& !\preg_match('%^(https?|ftp)://%', $file)
&& !\preg_match('%^//%', $file)
) {
$urldata = @\parse_url($_SERVER['SCRIPT_URI']);
$alt[] = $urldata['scheme'].'://'.$urldata['host'].(($file[0] === '/') ? '' : '/').$file;
}
$alt = \array_unique($alt);
foreach ($alt as $path) {
if (!self::file_exists($path)) {
continue;
}
$ret = @\file_get_contents($path);
if ($ret != false) {
return $ret;
}
// try to use CURL for URLs
if (!\ini_get('allow_url_fopen')
&& \function_exists('curl_init')
&& \preg_match('%^(https?|ftp)://%', $path)
) {
// try to get remote file data using cURL
$crs = \curl_init();
\curl_setopt($crs, \CURLOPT_URL, $path);
\curl_setopt($crs, \CURLOPT_BINARYTRANSFER, true);
\curl_setopt($crs, \CURLOPT_FAILONERROR, true);
\curl_setopt($crs, \CURLOPT_RETURNTRANSFER, true);
if ((\ini_get('open_basedir') === '') && (!\ini_get('safe_mode'))) {
\curl_setopt($crs, \CURLOPT_FOLLOWLOCATION, true);
}
\curl_setopt($crs, \CURLOPT_CONNECTTIMEOUT, 5);
\curl_setopt($crs, \CURLOPT_TIMEOUT, 30);
\curl_setopt($crs, \CURLOPT_SSL_VERIFYPEER, false);
\curl_setopt($crs, \CURLOPT_SSL_VERIFYHOST, false);
\curl_setopt($crs, \CURLOPT_USERAGENT, 'tc-lib-file');
\curl_setopt($crs, \CURLOPT_MAXREDIRS, 5);
if (\defined('CURLOPT_PROTOCOLS')) {
\curl_setopt($crs, \CURLOPT_PROTOCOLS, \CURLPROTO_HTTPS | \CURLPROTO_HTTP | \CURLPROTO_FTP | \CURLPROTO_FTPS);
}
$ret = \curl_exec($crs);
\curl_close($crs);
if ($ret !== false) {
return $ret;
}
}
}
return false;
}
/**
* Get ULONG from string (Big Endian 32-bit unsigned integer).
* @param string $str string from where to extract value
* @param int $offset point from where to read the data
* @return int 32 bit value
* @author Nicola Asuni
* @since 5.2.000 (2010-06-02)
* @public static
*/
public static function _getULONG($str, $offset) {
$v = \unpack('Ni', \substr($str, $offset, 4));
return $v['i'];
}
/**
* Get USHORT from string (Big Endian 16-bit unsigned integer).
* @param string $str string from where to extract value
* @param int $offset point from where to read the data
* @return int 16 bit value
* @author Nicola Asuni
* @since 5.2.000 (2010-06-02)
* @public static
*/
public static function _getUSHORT($str, $offset) {
$v = \unpack('ni', \substr($str, $offset, 2));
return $v['i'];
}
/**
* Get SHORT from string (Big Endian 16-bit signed integer).
* @param string $str string from where to extract value
* @param int $offset point from where to read the data
* @return int 16 bit value
* @author Nicola Asuni
* @since 5.2.000 (2010-06-02)
* @public static
*/
public static function _getSHORT($str, $offset) {
$v = \unpack('si', \substr($str, $offset, 2));
return $v['i'];
}
/**
* Get FWORD from string (Big Endian 16-bit signed integer).
* @param string $str string from where to extract value
* @param int $offset point from where to read the data
* @return int 16 bit value
* @author Nicola Asuni
* @since 5.9.123 (2011-09-30)
* @public static
*/
public static function _getFWORD($str, $offset) {
$v = self::_getUSHORT($str, $offset);
if ($v > 0x7fff) {
$v -= 0x10000;
}
return $v;
}
/**
* Get UFWORD from string (Big Endian 16-bit unsigned integer).
* @param string $str string from where to extract value
* @param int $offset point from where to read the data
* @return int 16 bit value
* @author Nicola Asuni
* @since 5.9.123 (2011-09-30)
* @public static
*/
public static function _getUFWORD($str, $offset) {
$v = self::_getUSHORT($str, $offset);
return $v;
}
/**
* Get FIXED from string (32-bit signed fixed-point number (16.16).
* @param string $str string from where to extract value
* @param int $offset point from where to read the data
* @return int 16 bit value
* @author Nicola Asuni
* @since 5.9.123 (2011-09-30)
* @public static
*/
public static function _getFIXED($str, $offset) {
// mantissa
$m = self::_getFWORD($str, $offset);
// fraction
$f = self::_getUSHORT($str, ($offset + 2));
$v = (float) (''.$m.'.'.$f.'');
return $v;
}
/**
* Get BYTE from string (8-bit unsigned integer).
* @param string $str string from where to extract value
* @param int $offset point from where to read the data
* @return int 8 bit value
* @author Nicola Asuni
* @since 5.2.000 (2010-06-02)
* @public static
*/
public static function _getBYTE($str, $offset) {
$v = \unpack('Ci', \substr($str, $offset, 1));
return $v['i'];
}
/**
* Binary-safe and URL-safe file read.
* Reads up to length bytes from the file pointer referenced by handle. Reading stops as soon as one of the following conditions is met: length bytes have been read; EOF (end of file) is reached.
* @param resource $handle
* @param int $length
* @return string|false returns the read string or FALSE in case of error
* @author Nicola Asuni
* @since 4.5.027 (2009-03-16)
* @public static
*/
public static function rfread($handle, $length) {
$data = \fread($handle, $length);
if ($data === false) {
return false;
}
$rest = ($length - \strlen($data));
if (($rest > 0) && !\feof($handle)) {
$data .= self::rfread($handle, $rest);
}
return $data;
}
/**
* Read a 4-byte (32 bit) integer from file.
* @param resource $f file resource
* @return int 4-byte integer
* @public static
*/
public static function _freadint($f) {
$a = \unpack('Ni', \fread($f, 4));
return $a['i'];
}
/**
* Array of page formats
* measures are calculated in this way: (inches * 72) or (millimeters * 72 / 25.4)
* @public static
*
* @var array
*/
public static $page_formats = [
// ISO 216 A Series + 2 SIS 014711 extensions
'A0' => [2383.937, 3370.394], // = ( 841 x 1189 ) mm = ( 33.11 x 46.81 ) in
'A1' => [1683.780, 2383.937], // = ( 594 x 841 ) mm = ( 23.39 x 33.11 ) in
'A2' => [1190.551, 1683.780], // = ( 420 x 594 ) mm = ( 16.54 x 23.39 ) in
'A3' => [841.890, 1190.551], // = ( 297 x 420 ) mm = ( 11.69 x 16.54 ) in
'A4' => [595.276, 841.890], // = ( 210 x 297 ) mm = ( 8.27 x 11.69 ) in
'A5' => [419.528, 595.276], // = ( 148 x 210 ) mm = ( 5.83 x 8.27 ) in
'A6' => [297.638, 419.528], // = ( 105 x 148 ) mm = ( 4.13 x 5.83 ) in
'A7' => [209.764, 297.638], // = ( 74 x 105 ) mm = ( 2.91 x 4.13 ) in
'A8' => [147.402, 209.764], // = ( 52 x 74 ) mm = ( 2.05 x 2.91 ) in
'A9' => [104.882, 147.402], // = ( 37 x 52 ) mm = ( 1.46 x 2.05 ) in
'A10' => [73.701, 104.882], // = ( 26 x 37 ) mm = ( 1.02 x 1.46 ) in
'A11' => [51.024, 73.701], // = ( 18 x 26 ) mm = ( 0.71 x 1.02 ) in
'A12' => [36.850, 51.024], // = ( 13 x 18 ) mm = ( 0.51 x 0.71 ) in
// ISO 216 B Series + 2 SIS 014711 extensions
'B0' => [2834.646, 4008.189], // = ( 1000 x 1414 ) mm = ( 39.37 x 55.67 ) in
'B1' => [2004.094, 2834.646], // = ( 707 x 1000 ) mm = ( 27.83 x 39.37 ) in
'B2' => [1417.323, 2004.094], // = ( 500 x 707 ) mm = ( 19.69 x 27.83 ) in
'B3' => [1000.630, 1417.323], // = ( 353 x 500 ) mm = ( 13.90 x 19.69 ) in
'B4' => [708.661, 1000.630], // = ( 250 x 353 ) mm = ( 9.84 x 13.90 ) in
'B5' => [498.898, 708.661], // = ( 176 x 250 ) mm = ( 6.93 x 9.84 ) in
'B6' => [354.331, 498.898], // = ( 125 x 176 ) mm = ( 4.92 x 6.93 ) in
'B7' => [249.449, 354.331], // = ( 88 x 125 ) mm = ( 3.46 x 4.92 ) in
'B8' => [175.748, 249.449], // = ( 62 x 88 ) mm = ( 2.44 x 3.46 ) in
'B9' => [124.724, 175.748], // = ( 44 x 62 ) mm = ( 1.73 x 2.44 ) in
'B10' => [87.874, 124.724], // = ( 31 x 44 ) mm = ( 1.22 x 1.73 ) in
'B11' => [62.362, 87.874], // = ( 22 x 31 ) mm = ( 0.87 x 1.22 ) in
'B12' => [42.520, 62.362], // = ( 15 x 22 ) mm = ( 0.59 x 0.87 ) in
// ISO 216 C Series + 2 SIS 014711 extensions + 5 EXTENSION
'C0' => [2599.370, 3676.535], // = ( 917 x 1297 ) mm = ( 36.10 x 51.06 ) in
'C1' => [1836.850, 2599.370], // = ( 648 x 917 ) mm = ( 25.51 x 36.10 ) in
'C2' => [1298.268, 1836.850], // = ( 458 x 648 ) mm = ( 18.03 x 25.51 ) in
'C3' => [918.425, 1298.268], // = ( 324 x 458 ) mm = ( 12.76 x 18.03 ) in
'C4' => [649.134, 918.425], // = ( 229 x 324 ) mm = ( 9.02 x 12.76 ) in
'C5' => [459.213, 649.134], // = ( 162 x 229 ) mm = ( 6.38 x 9.02 ) in
'C6' => [323.150, 459.213], // = ( 114 x 162 ) mm = ( 4.49 x 6.38 ) in
'C7' => [229.606, 323.150], // = ( 81 x 114 ) mm = ( 3.19 x 4.49 ) in
'C8' => [161.575, 229.606], // = ( 57 x 81 ) mm = ( 2.24 x 3.19 ) in
'C9' => [113.386, 161.575], // = ( 40 x 57 ) mm = ( 1.57 x 2.24 ) in
'C10' => [79.370, 113.386], // = ( 28 x 40 ) mm = ( 1.10 x 1.57 ) in
'C11' => [56.693, 79.370], // = ( 20 x 28 ) mm = ( 0.79 x 1.10 ) in
'C12' => [39.685, 56.693], // = ( 14 x 20 ) mm = ( 0.55 x 0.79 ) in
'C76' => [229.606, 459.213], // = ( 81 x 162 ) mm = ( 3.19 x 6.38 ) in
'DL' => [311.811, 623.622], // = ( 110 x 220 ) mm = ( 4.33 x 8.66 ) in
'DLE' => [323.150, 637.795], // = ( 114 x 225 ) mm = ( 4.49 x 8.86 ) in
'DLX' => [340.158, 666.142], // = ( 120 x 235 ) mm = ( 4.72 x 9.25 ) in
'DLP' => [280.630, 595.276], // = ( 99 x 210 ) mm = ( 3.90 x 8.27 ) in (1/3 A4)
// SIS 014711 E Series
'E0' => [2491.654, 3517.795], // = ( 879 x 1241 ) mm = ( 34.61 x 48.86 ) in
'E1' => [1757.480, 2491.654], // = ( 620 x 879 ) mm = ( 24.41 x 34.61 ) in
'E2' => [1247.244, 1757.480], // = ( 440 x 620 ) mm = ( 17.32 x 24.41 ) in
'E3' => [878.740, 1247.244], // = ( 310 x 440 ) mm = ( 12.20 x 17.32 ) in
'E4' => [623.622, 878.740], // = ( 220 x 310 ) mm = ( 8.66 x 12.20 ) in
'E5' => [439.370, 623.622], // = ( 155 x 220 ) mm = ( 6.10 x 8.66 ) in
'E6' => [311.811, 439.370], // = ( 110 x 155 ) mm = ( 4.33 x 6.10 ) in
'E7' => [221.102, 311.811], // = ( 78 x 110 ) mm = ( 3.07 x 4.33 ) in
'E8' => [155.906, 221.102], // = ( 55 x 78 ) mm = ( 2.17 x 3.07 ) in
'E9' => [110.551, 155.906], // = ( 39 x 55 ) mm = ( 1.54 x 2.17 ) in
'E10' => [76.535, 110.551], // = ( 27 x 39 ) mm = ( 1.06 x 1.54 ) in
'E11' => [53.858, 76.535], // = ( 19 x 27 ) mm = ( 0.75 x 1.06 ) in
'E12' => [36.850, 53.858], // = ( 13 x 19 ) mm = ( 0.51 x 0.75 ) in
// SIS 014711 G Series
'G0' => [2715.591, 3838.110], // = ( 958 x 1354 ) mm = ( 37.72 x 53.31 ) in
'G1' => [1919.055, 2715.591], // = ( 677 x 958 ) mm = ( 26.65 x 37.72 ) in
'G2' => [1357.795, 1919.055], // = ( 479 x 677 ) mm = ( 18.86 x 26.65 ) in
'G3' => [958.110, 1357.795], // = ( 338 x 479 ) mm = ( 13.31 x 18.86 ) in
'G4' => [677.480, 958.110], // = ( 239 x 338 ) mm = ( 9.41 x 13.31 ) in
'G5' => [479.055, 677.480], // = ( 169 x 239 ) mm = ( 6.65 x 9.41 ) in
'G6' => [337.323, 479.055], // = ( 119 x 169 ) mm = ( 4.69 x 6.65 ) in
'G7' => [238.110, 337.323], // = ( 84 x 119 ) mm = ( 3.31 x 4.69 ) in
'G8' => [167.244, 238.110], // = ( 59 x 84 ) mm = ( 2.32 x 3.31 ) in
'G9' => [119.055, 167.244], // = ( 42 x 59 ) mm = ( 1.65 x 2.32 ) in
'G10' => [82.205, 119.055], // = ( 29 x 42 ) mm = ( 1.14 x 1.65 ) in
'G11' => [59.528, 82.205], // = ( 21 x 29 ) mm = ( 0.83 x 1.14 ) in
'G12' => [39.685, 59.528], // = ( 14 x 21 ) mm = ( 0.55 x 0.83 ) in
// ISO Press
'RA0' => [2437.795, 3458.268], // = ( 860 x 1220 ) mm = ( 33.86 x 48.03 ) in
'RA1' => [1729.134, 2437.795], // = ( 610 x 860 ) mm = ( 24.02 x 33.86 ) in
'RA2' => [1218.898, 1729.134], // = ( 430 x 610 ) mm = ( 16.93 x 24.02 ) in
'RA3' => [864.567, 1218.898], // = ( 305 x 430 ) mm = ( 12.01 x 16.93 ) in
'RA4' => [609.449, 864.567], // = ( 215 x 305 ) mm = ( 8.46 x 12.01 ) in
'SRA0' => [2551.181, 3628.346], // = ( 900 x 1280 ) mm = ( 35.43 x 50.39 ) in
'SRA1' => [1814.173, 2551.181], // = ( 640 x 900 ) mm = ( 25.20 x 35.43 ) in
'SRA2' => [1275.591, 1814.173], // = ( 450 x 640 ) mm = ( 17.72 x 25.20 ) in
'SRA3' => [907.087, 1275.591], // = ( 320 x 450 ) mm = ( 12.60 x 17.72 ) in
'SRA4' => [637.795, 907.087], // = ( 225 x 320 ) mm = ( 8.86 x 12.60 ) in
// German DIN 476
'4A0' => [4767.874, 6740.787], // = ( 1682 x 2378 ) mm = ( 66.22 x 93.62 ) in
'2A0' => [3370.394, 4767.874], // = ( 1189 x 1682 ) mm = ( 46.81 x 66.22 ) in
// Variations on the ISO Standard
'A2_EXTRA' => [1261.417, 1754.646], // = ( 445 x 619 ) mm = ( 17.52 x 24.37 ) in
'A3+' => [932.598, 1369.134], // = ( 329 x 483 ) mm = ( 12.95 x 19.02 ) in
'A3_EXTRA' => [912.756, 1261.417], // = ( 322 x 445 ) mm = ( 12.68 x 17.52 ) in
'A3_SUPER' => [864.567, 1440.000], // = ( 305 x 508 ) mm = ( 12.01 x 20.00 ) in
'SUPER_A3' => [864.567, 1380.472], // = ( 305 x 487 ) mm = ( 12.01 x 19.17 ) in
'A4_EXTRA' => [666.142, 912.756], // = ( 235 x 322 ) mm = ( 9.25 x 12.68 ) in
'A4_SUPER' => [649.134, 912.756], // = ( 229 x 322 ) mm = ( 9.02 x 12.68 ) in
'SUPER_A4' => [643.465, 1009.134], // = ( 227 x 356 ) mm = ( 8.94 x 14.02 ) in
'A4_LONG' => [595.276, 986.457], // = ( 210 x 348 ) mm = ( 8.27 x 13.70 ) in
'F4' => [595.276, 935.433], // = ( 210 x 330 ) mm = ( 8.27 x 12.99 ) in
'SO_B5_EXTRA' => [572.598, 782.362], // = ( 202 x 276 ) mm = ( 7.95 x 10.87 ) in
'A5_EXTRA' => [490.394, 666.142], // = ( 173 x 235 ) mm = ( 6.81 x 9.25 ) in
// ANSI Series
'ANSI_E' => [2448.000, 3168.000], // = ( 864 x 1118 ) mm = ( 34.00 x 44.00 ) in
'ANSI_D' => [1584.000, 2448.000], // = ( 559 x 864 ) mm = ( 22.00 x 34.00 ) in
'ANSI_C' => [1224.000, 1584.000], // = ( 432 x 559 ) mm = ( 17.00 x 22.00 ) in
'ANSI_B' => [792.000, 1224.000], // = ( 279 x 432 ) mm = ( 11.00 x 17.00 ) in
'ANSI_A' => [612.000, 792.000], // = ( 216 x 279 ) mm = ( 8.50 x 11.00 ) in
// Traditional 'Loose' North American Paper Sizes
'USLEDGER' => [1224.000, 792.000], // = ( 432 x 279 ) mm = ( 17.00 x 11.00 ) in
'LEDGER' => [1224.000, 792.000], // = ( 432 x 279 ) mm = ( 17.00 x 11.00 ) in
'ORGANIZERK' => [792.000, 1224.000], // = ( 279 x 432 ) mm = ( 11.00 x 17.00 ) in
'BIBLE' => [792.000, 1224.000], // = ( 279 x 432 ) mm = ( 11.00 x 17.00 ) in
'USTABLOID' => [792.000, 1224.000], // = ( 279 x 432 ) mm = ( 11.00 x 17.00 ) in
'TABLOID' => [792.000, 1224.000], // = ( 279 x 432 ) mm = ( 11.00 x 17.00 ) in
'ORGANIZERM' => [612.000, 792.000], // = ( 216 x 279 ) mm = ( 8.50 x 11.00 ) in
'USLETTER' => [612.000, 792.000], // = ( 216 x 279 ) mm = ( 8.50 x 11.00 ) in
'LETTER' => [612.000, 792.000], // = ( 216 x 279 ) mm = ( 8.50 x 11.00 ) in
'USLEGAL' => [612.000, 1008.000], // = ( 216 x 356 ) mm = ( 8.50 x 14.00 ) in
'LEGAL' => [612.000, 1008.000], // = ( 216 x 356 ) mm = ( 8.50 x 14.00 ) in
'GOVERNMENTLETTER' => [576.000, 756.000], // = ( 203 x 267 ) mm = ( 8.00 x 10.50 ) in
'GLETTER' => [576.000, 756.000], // = ( 203 x 267 ) mm = ( 8.00 x 10.50 ) in
'JUNIORLEGAL' => [576.000, 360.000], // = ( 203 x 127 ) mm = ( 8.00 x 5.00 ) in
'JLEGAL' => [576.000, 360.000], // = ( 203 x 127 ) mm = ( 8.00 x 5.00 ) in
// Other North American Paper Sizes
'QUADDEMY' => [2520.000, 3240.000], // = ( 889 x 1143 ) mm = ( 35.00 x 45.00 ) in
'SUPER_B' => [936.000, 1368.000], // = ( 330 x 483 ) mm = ( 13.00 x 19.00 ) in
'QUARTO' => [648.000, 792.000], // = ( 229 x 279 ) mm = ( 9.00 x 11.00 ) in
'GOVERNMENTLEGAL' => [612.000, 936.000], // = ( 216 x 330 ) mm = ( 8.50 x 13.00 ) in
'FOLIO' => [612.000, 936.000], // = ( 216 x 330 ) mm = ( 8.50 x 13.00 ) in
'MONARCH' => [522.000, 756.000], // = ( 184 x 267 ) mm = ( 7.25 x 10.50 ) in
'EXECUTIVE' => [522.000, 756.000], // = ( 184 x 267 ) mm = ( 7.25 x 10.50 ) in
'ORGANIZERL' => [396.000, 612.000], // = ( 140 x 216 ) mm = ( 5.50 x 8.50 ) in
'STATEMENT' => [396.000, 612.000], // = ( 140 x 216 ) mm = ( 5.50 x 8.50 ) in
'MEMO' => [396.000, 612.000], // = ( 140 x 216 ) mm = ( 5.50 x 8.50 ) in
'FOOLSCAP' => [595.440, 936.000], // = ( 210 x 330 ) mm = ( 8.27 x 13.00 ) in
'COMPACT' => [306.000, 486.000], // = ( 108 x 171 ) mm = ( 4.25 x 6.75 ) in
'ORGANIZERJ' => [198.000, 360.000], // = ( 70 x 127 ) mm = ( 2.75 x 5.00 ) in
// Canadian standard CAN 2-9.60M
'P1' => [1587.402, 2437.795], // = ( 560 x 860 ) mm = ( 22.05 x 33.86 ) in
'P2' => [1218.898, 1587.402], // = ( 430 x 560 ) mm = ( 16.93 x 22.05 ) in
'P3' => [793.701, 1218.898], // = ( 280 x 430 ) mm = ( 11.02 x 16.93 ) in
'P4' => [609.449, 793.701], // = ( 215 x 280 ) mm = ( 8.46 x 11.02 ) in
'P5' => [396.850, 609.449], // = ( 140 x 215 ) mm = ( 5.51 x 8.46 ) in
'P6' => [303.307, 396.850], // = ( 107 x 140 ) mm = ( 4.21 x 5.51 ) in
// North American Architectural Sizes
'ARCH_E' => [2592.000, 3456.000], // = ( 914 x 1219 ) mm = ( 36.00 x 48.00 ) in
'ARCH_E1' => [2160.000, 3024.000], // = ( 762 x 1067 ) mm = ( 30.00 x 42.00 ) in
'ARCH_D' => [1728.000, 2592.000], // = ( 610 x 914 ) mm = ( 24.00 x 36.00 ) in
'BROADSHEET' => [1296.000, 1728.000], // = ( 457 x 610 ) mm = ( 18.00 x 24.00 ) in
'ARCH_C' => [1296.000, 1728.000], // = ( 457 x 610 ) mm = ( 18.00 x 24.00 ) in
'ARCH_B' => [864.000, 1296.000], // = ( 305 x 457 ) mm = ( 12.00 x 18.00 ) in
'ARCH_A' => [648.000, 864.000], // = ( 229 x 305 ) mm = ( 9.00 x 12.00 ) in
// -- North American Envelope Sizes
// - Announcement Envelopes
'ANNENV_A2' => [314.640, 414.000], // = ( 111 x 146 ) mm = ( 4.37 x 5.75 ) in
'ANNENV_A6' => [342.000, 468.000], // = ( 121 x 165 ) mm = ( 4.75 x 6.50 ) in
'ANNENV_A7' => [378.000, 522.000], // = ( 133 x 184 ) mm = ( 5.25 x 7.25 ) in
'ANNENV_A8' => [396.000, 584.640], // = ( 140 x 206 ) mm = ( 5.50 x 8.12 ) in
'ANNENV_A10' => [450.000, 692.640], // = ( 159 x 244 ) mm = ( 6.25 x 9.62 ) in
'ANNENV_SLIM' => [278.640, 638.640], // = ( 98 x 225 ) mm = ( 3.87 x 8.87 ) in
// - Commercial Envelopes
'COMMENV_N6_1/4' => [252.000, 432.000], // = ( 89 x 152 ) mm = ( 3.50 x 6.00 ) in
'COMMENV_N6_3/4' => [260.640, 468.000], // = ( 92 x 165 ) mm = ( 3.62 x 6.50 ) in
'COMMENV_N8' => [278.640, 540.000], // = ( 98 x 191 ) mm = ( 3.87 x 7.50 ) in
'COMMENV_N9' => [278.640, 638.640], // = ( 98 x 225 ) mm = ( 3.87 x 8.87 ) in
'COMMENV_N10' => [296.640, 684.000], // = ( 105 x 241 ) mm = ( 4.12 x 9.50 ) in
'COMMENV_N11' => [324.000, 746.640], // = ( 114 x 263 ) mm = ( 4.50 x 10.37 ) in
'COMMENV_N12' => [342.000, 792.000], // = ( 121 x 279 ) mm = ( 4.75 x 11.00 ) in
'COMMENV_N14' => [360.000, 828.000], // = ( 127 x 292 ) mm = ( 5.00 x 11.50 ) in
// - Catalogue Envelopes
'CATENV_N1' => [432.000, 648.000], // = ( 152 x 229 ) mm = ( 6.00 x 9.00 ) in
'CATENV_N1_3/4' => [468.000, 684.000], // = ( 165 x 241 ) mm = ( 6.50 x 9.50 ) in
'CATENV_N2' => [468.000, 720.000], // = ( 165 x 254 ) mm = ( 6.50 x 10.00 ) in
'CATENV_N3' => [504.000, 720.000], // = ( 178 x 254 ) mm = ( 7.00 x 10.00 ) in
'CATENV_N6' => [540.000, 756.000], // = ( 191 x 267 ) mm = ( 7.50 x 10.50 ) in
'CATENV_N7' => [576.000, 792.000], // = ( 203 x 279 ) mm = ( 8.00 x 11.00 ) in
'CATENV_N8' => [594.000, 810.000], // = ( 210 x 286 ) mm = ( 8.25 x 11.25 ) in
'CATENV_N9_1/2' => [612.000, 756.000], // = ( 216 x 267 ) mm = ( 8.50 x 10.50 ) in
'CATENV_N9_3/4' => [630.000, 810.000], // = ( 222 x 286 ) mm = ( 8.75 x 11.25 ) in
'CATENV_N10_1/2' => [648.000, 864.000], // = ( 229 x 305 ) mm = ( 9.00 x 12.00 ) in
'CATENV_N12_1/2' => [684.000, 900.000], // = ( 241 x 318 ) mm = ( 9.50 x 12.50 ) in
'CATENV_N13_1/2' => [720.000, 936.000], // = ( 254 x 330 ) mm = ( 10.00 x 13.00 ) in
'CATENV_N14_1/4' => [810.000, 882.000], // = ( 286 x 311 ) mm = ( 11.25 x 12.25 ) in
'CATENV_N14_1/2' => [828.000, 1044.000], // = ( 292 x 368 ) mm = ( 11.50 x 14.50 ) in
// Japanese (JIS P 0138-61) Standard B-Series
'JIS_B0' => [2919.685, 4127.244], // = ( 1030 x 1456 ) mm = ( 40.55 x 57.32 ) in
'JIS_B1' => [2063.622, 2919.685], // = ( 728 x 1030 ) mm = ( 28.66 x 40.55 ) in
'JIS_B2' => [1459.843, 2063.622], // = ( 515 x 728 ) mm = ( 20.28 x 28.66 ) in
'JIS_B3' => [1031.811, 1459.843], // = ( 364 x 515 ) mm = ( 14.33 x 20.28 ) in
'JIS_B4' => [728.504, 1031.811], // = ( 257 x 364 ) mm = ( 10.12 x 14.33 ) in
'JIS_B5' => [515.906, 728.504], // = ( 182 x 257 ) mm = ( 7.17 x 10.12 ) in
'JIS_B6' => [362.835, 515.906], // = ( 128 x 182 ) mm = ( 5.04 x 7.17 ) in
'JIS_B7' => [257.953, 362.835], // = ( 91 x 128 ) mm = ( 3.58 x 5.04 ) in
'JIS_B8' => [181.417, 257.953], // = ( 64 x 91 ) mm = ( 2.52 x 3.58 ) in
'JIS_B9' => [127.559, 181.417], // = ( 45 x 64 ) mm = ( 1.77 x 2.52 ) in
'JIS_B10' => [90.709, 127.559], // = ( 32 x 45 ) mm = ( 1.26 x 1.77 ) in
'JIS_B11' => [62.362, 90.709], // = ( 22 x 32 ) mm = ( 0.87 x 1.26 ) in
'JIS_B12' => [45.354, 62.362], // = ( 16 x 22 ) mm = ( 0.63 x 0.87 ) in
// PA Series
'PA0' => [2381.102, 3174.803], // = ( 840 x 1120 ) mm = ( 33.07 x 44.09 ) in
'PA1' => [1587.402, 2381.102], // = ( 560 x 840 ) mm = ( 22.05 x 33.07 ) in
'PA2' => [1190.551, 1587.402], // = ( 420 x 560 ) mm = ( 16.54 x 22.05 ) in
'PA3' => [793.701, 1190.551], // = ( 280 x 420 ) mm = ( 11.02 x 16.54 ) in
'PA4' => [595.276, 793.701], // = ( 210 x 280 ) mm = ( 8.27 x 11.02 ) in
'PA5' => [396.850, 595.276], // = ( 140 x 210 ) mm = ( 5.51 x 8.27 ) in
'PA6' => [297.638, 396.850], // = ( 105 x 140 ) mm = ( 4.13 x 5.51 ) in
'PA7' => [198.425, 297.638], // = ( 70 x 105 ) mm = ( 2.76 x 4.13 ) in
'PA8' => [147.402, 198.425], // = ( 52 x 70 ) mm = ( 2.05 x 2.76 ) in
'PA9' => [99.213, 147.402], // = ( 35 x 52 ) mm = ( 1.38 x 2.05 ) in
'PA10' => [73.701, 99.213], // = ( 26 x 35 ) mm = ( 1.02 x 1.38 ) in
// Standard Photographic Print Sizes
'PASSPORT_PHOTO' => [99.213, 127.559], // = ( 35 x 45 ) mm = ( 1.38 x 1.77 ) in
'E' => [233.858, 340.157], // = ( 82 x 120 ) mm = ( 3.25 x 4.72 ) in
'L' => [252.283, 360.000], // = ( 89 x 127 ) mm = ( 3.50 x 5.00 ) in
'3R' => [252.283, 360.000], // = ( 89 x 127 ) mm = ( 3.50 x 5.00 ) in
'KG' => [289.134, 430.866], // = ( 102 x 152 ) mm = ( 4.02 x 5.98 ) in
'4R' => [289.134, 430.866], // = ( 102 x 152 ) mm = ( 4.02 x 5.98 ) in
'4D' => [340.157, 430.866], // = ( 120 x 152 ) mm = ( 4.72 x 5.98 ) in
'2L' => [360.000, 504.567], // = ( 127 x 178 ) mm = ( 5.00 x 7.01 ) in
'5R' => [360.000, 504.567], // = ( 127 x 178 ) mm = ( 5.00 x 7.01 ) in
'8P' => [430.866, 575.433], // = ( 152 x 203 ) mm = ( 5.98 x 7.99 ) in
'6R' => [430.866, 575.433], // = ( 152 x 203 ) mm = ( 5.98 x 7.99 ) in
'6P' => [575.433, 720.000], // = ( 203 x 254 ) mm = ( 7.99 x 10.00 ) in
'8R' => [575.433, 720.000], // = ( 203 x 254 ) mm = ( 7.99 x 10.00 ) in
'6PW' => [575.433, 864.567], // = ( 203 x 305 ) mm = ( 7.99 x 12.01 ) in
'S8R' => [575.433, 864.567], // = ( 203 x 305 ) mm = ( 7.99 x 12.01 ) in
'4P' => [720.000, 864.567], // = ( 254 x 305 ) mm = ( 10.00 x 12.01 ) in
'10R' => [720.000, 864.567], // = ( 254 x 305 ) mm = ( 10.00 x 12.01 ) in
'4PW' => [720.000, 1080.000], // = ( 254 x 381 ) mm = ( 10.00 x 15.00 ) in
'S10R' => [720.000, 1080.000], // = ( 254 x 381 ) mm = ( 10.00 x 15.00 ) in
'11R' => [790.866, 1009.134], // = ( 279 x 356 ) mm = ( 10.98 x 14.02 ) in
'S11R' => [790.866, 1224.567], // = ( 279 x 432 ) mm = ( 10.98 x 17.01 ) in
'12R' => [864.567, 1080.000], // = ( 305 x 381 ) mm = ( 12.01 x 15.00 ) in
'S12R' => [864.567, 1292.598], // = ( 305 x 456 ) mm = ( 12.01 x 17.95 ) in
// Common Newspaper Sizes
'NEWSPAPER_BROADSHEET' => [2125.984, 1700.787], // = ( 750 x 600 ) mm = ( 29.53 x 23.62 ) in
'NEWSPAPER_BERLINER' => [1332.283, 892.913], // = ( 470 x 315 ) mm = ( 18.50 x 12.40 ) in
'NEWSPAPER_TABLOID' => [1218.898, 793.701], // = ( 430 x 280 ) mm = ( 16.93 x 11.02 ) in
'NEWSPAPER_COMPACT' => [1218.898, 793.701], // = ( 430 x 280 ) mm = ( 16.93 x 11.02 ) in
// Business Cards
'CREDIT_CARD' => [153.014, 242.646], // = ( 54 x 86 ) mm = ( 2.13 x 3.37 ) in
'BUSINESS_CARD' => [153.014, 242.646], // = ( 54 x 86 ) mm = ( 2.13 x 3.37 ) in
'BUSINESS_CARD_ISO7810' => [153.014, 242.646], // = ( 54 x 86 ) mm = ( 2.13 x 3.37 ) in
'BUSINESS_CARD_ISO216' => [147.402, 209.764], // = ( 52 x 74 ) mm = ( 2.05 x 2.91 ) in
'BUSINESS_CARD_IT' => [155.906, 240.945], // = ( 55 x 85 ) mm = ( 2.17 x 3.35 ) in
'BUSINESS_CARD_UK' => [155.906, 240.945], // = ( 55 x 85 ) mm = ( 2.17 x 3.35 ) in
'BUSINESS_CARD_FR' => [155.906, 240.945], // = ( 55 x 85 ) mm = ( 2.17 x 3.35 ) in
'BUSINESS_CARD_DE' => [155.906, 240.945], // = ( 55 x 85 ) mm = ( 2.17 x 3.35 ) in
'BUSINESS_CARD_ES' => [155.906, 240.945], // = ( 55 x 85 ) mm = ( 2.17 x 3.35 ) in
'BUSINESS_CARD_CA' => [144.567, 252.283], // = ( 51 x 89 ) mm = ( 2.01 x 3.50 ) in
'BUSINESS_CARD_US' => [144.567, 252.283], // = ( 51 x 89 ) mm = ( 2.01 x 3.50 ) in
'BUSINESS_CARD_JP' => [155.906, 257.953], // = ( 55 x 91 ) mm = ( 2.17 x 3.58 ) in
'BUSINESS_CARD_HK' => [153.071, 255.118], // = ( 54 x 90 ) mm = ( 2.13 x 3.54 ) in
'BUSINESS_CARD_AU' => [155.906, 255.118], // = ( 55 x 90 ) mm = ( 2.17 x 3.54 ) in
'BUSINESS_CARD_DK' => [155.906, 255.118], // = ( 55 x 90 ) mm = ( 2.17 x 3.54 ) in
'BUSINESS_CARD_SE' => [155.906, 255.118], // = ( 55 x 90 ) mm = ( 2.17 x 3.54 ) in
'BUSINESS_CARD_RU' => [141.732, 255.118], // = ( 50 x 90 ) mm = ( 1.97 x 3.54 ) in
'BUSINESS_CARD_CZ' => [141.732, 255.118], // = ( 50 x 90 ) mm = ( 1.97 x 3.54 ) in
'BUSINESS_CARD_FI' => [141.732, 255.118], // = ( 50 x 90 ) mm = ( 1.97 x 3.54 ) in
'BUSINESS_CARD_HU' => [141.732, 255.118], // = ( 50 x 90 ) mm = ( 1.97 x 3.54 ) in
'BUSINESS_CARD_IL' => [141.732, 255.118], // = ( 50 x 90 ) mm = ( 1.97 x 3.54 ) in
// Billboards
'4SHEET' => [2880.000, 4320.000], // = ( 1016 x 1524 ) mm = ( 40.00 x 60.00 ) in
'6SHEET' => [3401.575, 5102.362], // = ( 1200 x 1800 ) mm = ( 47.24 x 70.87 ) in
'12SHEET' => [8640.000, 4320.000], // = ( 3048 x 1524 ) mm = (120.00 x 60.00 ) in
'16SHEET' => [5760.000, 8640.000], // = ( 2032 x 3048 ) mm = ( 80.00 x 120.00) in
'32SHEET' => [11520.000, 8640.000], // = ( 4064 x 3048 ) mm = (160.00 x 120.00) in
'48SHEET' => [17280.000, 8640.000], // = ( 6096 x 3048 ) mm = (240.00 x 120.00) in
'64SHEET' => [23040.000, 8640.000], // = ( 8128 x 3048 ) mm = (320.00 x 120.00) in
'96SHEET' => [34560.000, 8640.000], // = (12192 x 3048 ) mm = (480.00 x 120.00) in
// -- Old European Sizes
// - Old Imperial English Sizes
'EN_EMPEROR' => [3456.000, 5184.000], // = ( 1219 x 1829 ) mm = ( 48.00 x 72.00 ) in
'EN_ANTIQUARIAN' => [2232.000, 3816.000], // = ( 787 x 1346 ) mm = ( 31.00 x 53.00 ) in
'EN_GRAND_EAGLE' => [2070.000, 3024.000], // = ( 730 x 1067 ) mm = ( 28.75 x 42.00 ) in
'EN_DOUBLE_ELEPHANT' => [1926.000, 2880.000], // = ( 679 x 1016 ) mm = ( 26.75 x 40.00 ) in
'EN_ATLAS' => [1872.000, 2448.000], // = ( 660 x 864 ) mm = ( 26.00 x 34.00 ) in
'EN_COLOMBIER' => [1692.000, 2484.000], // = ( 597 x 876 ) mm = ( 23.50 x 34.50 ) in
'EN_ELEPHANT' => [1656.000, 2016.000], // = ( 584 x 711 ) mm = ( 23.00 x 28.00 ) in
'EN_DOUBLE_DEMY' => [1620.000, 2556.000], // = ( 572 x 902 ) mm = ( 22.50 x 35.50 ) in
'EN_IMPERIAL' => [1584.000, 2160.000], // = ( 559 x 762 ) mm = ( 22.00 x 30.00 ) in
'EN_PRINCESS' => [1548.000, 2016.000], // = ( 546 x 711 ) mm = ( 21.50 x 28.00 ) in
'EN_CARTRIDGE' => [1512.000, 1872.000], // = ( 533 x 660 ) mm = ( 21.00 x 26.00 ) in
'EN_DOUBLE_LARGE_POST' => [1512.000, 2376.000], // = ( 533 x 838 ) mm = ( 21.00 x 33.00 ) in
'EN_ROYAL' => [1440.000, 1800.000], // = ( 508 x 635 ) mm = ( 20.00 x 25.00 ) in
'EN_SHEET' => [1404.000, 1692.000], // = ( 495 x 597 ) mm = ( 19.50 x 23.50 ) in
'EN_HALF_POST' => [1404.000, 1692.000], // = ( 495 x 597 ) mm = ( 19.50 x 23.50 ) in
'EN_SUPER_ROYAL' => [1368.000, 1944.000], // = ( 483 x 686 ) mm = ( 19.00 x 27.00 ) in
'EN_DOUBLE_POST' => [1368.000, 2196.000], // = ( 483 x 775 ) mm = ( 19.00 x 30.50 ) in
'EN_MEDIUM' => [1260.000, 1656.000], // = ( 445 x 584 ) mm = ( 17.50 x 23.00 ) in
'EN_DEMY' => [1260.000, 1620.000], // = ( 445 x 572 ) mm = ( 17.50 x 22.50 ) in
'EN_LARGE_POST' => [1188.000, 1512.000], // = ( 419 x 533 ) mm = ( 16.50 x 21.00 ) in
'EN_COPY_DRAUGHT' => [1152.000, 1440.000], // = ( 406 x 508 ) mm = ( 16.00 x 20.00 ) in
'EN_POST' => [1116.000, 1386.000], // = ( 394 x 489 ) mm = ( 15.50 x 19.25 ) in
'EN_CROWN' => [1080.000, 1440.000], // = ( 381 x 508 ) mm = ( 15.00 x 20.00 ) in
'EN_PINCHED_POST' => [1062.000, 1332.000], // = ( 375 x 470 ) mm = ( 14.75 x 18.50 ) in
'EN_BRIEF' => [972.000, 1152.000], // = ( 343 x 406 ) mm = ( 13.50 x 16.00 ) in
'EN_FOOLSCAP' => [972.000, 1224.000], // = ( 343 x 432 ) mm = ( 13.50 x 17.00 ) in
'EN_SMALL_FOOLSCAP' => [954.000, 1188.000], // = ( 337 x 419 ) mm = ( 13.25 x 16.50 ) in
'EN_POTT' => [900.000, 1080.000], // = ( 318 x 381 ) mm = ( 12.50 x 15.00 ) in
// - Old Imperial Belgian Sizes
'BE_GRAND_AIGLE' => [1984.252, 2948.031], // = ( 700 x 1040 ) mm = ( 27.56 x 40.94 ) in
'BE_COLOMBIER' => [1757.480, 2409.449], // = ( 620 x 850 ) mm = ( 24.41 x 33.46 ) in
'BE_DOUBLE_CARRE' => [1757.480, 2607.874], // = ( 620 x 920 ) mm = ( 24.41 x 36.22 ) in
'BE_ELEPHANT' => [1746.142, 2182.677], // = ( 616 x 770 ) mm = ( 24.25 x 30.31 ) in
'BE_PETIT_AIGLE' => [1700.787, 2381.102], // = ( 600 x 840 ) mm = ( 23.62 x 33.07 ) in
'BE_GRAND_JESUS' => [1559.055, 2069.291], // = ( 550 x 730 ) mm = ( 21.65 x 28.74 ) in
'BE_JESUS' => [1530.709, 2069.291], // = ( 540 x 730 ) mm = ( 21.26 x 28.74 ) in
'BE_RAISIN' => [1417.323, 1842.520], // = ( 500 x 650 ) mm = ( 19.69 x 25.59 ) in
'BE_GRAND_MEDIAN' => [1303.937, 1714.961], // = ( 460 x 605 ) mm = ( 18.11 x 23.82 ) in
'BE_DOUBLE_POSTE' => [1233.071, 1601.575], // = ( 435 x 565 ) mm = ( 17.13 x 22.24 ) in
'BE_COQUILLE' => [1218.898, 1587.402], // = ( 430 x 560 ) mm = ( 16.93 x 22.05 ) in
'BE_PETIT_MEDIAN' => [1176.378, 1502.362], // = ( 415 x 530 ) mm = ( 16.34 x 20.87 ) in
'BE_RUCHE' => [1020.472, 1303.937], // = ( 360 x 460 ) mm = ( 14.17 x 18.11 ) in
'BE_PROPATRIA' => [977.953, 1218.898], // = ( 345 x 430 ) mm = ( 13.58 x 16.93 ) in
'BE_LYS' => [898.583, 1125.354], // = ( 317 x 397 ) mm = ( 12.48 x 15.63 ) in
'BE_POT' => [870.236, 1088.504], // = ( 307 x 384 ) mm = ( 12.09 x 15.12 ) in
'BE_ROSETTE' => [765.354, 983.622], // = ( 270 x 347 ) mm = ( 10.63 x 13.66 ) in
// - Old Imperial French Sizes
'FR_UNIVERS' => [2834.646, 3685.039], // = ( 1000 x 1300 ) mm = ( 39.37 x 51.18 ) in
'FR_DOUBLE_COLOMBIER' => [2551.181, 3571.654], // = ( 900 x 1260 ) mm = ( 35.43 x 49.61 ) in
'FR_GRANDE_MONDE' => [2551.181, 3571.654], // = ( 900 x 1260 ) mm = ( 35.43 x 49.61 ) in
'FR_DOUBLE_SOLEIL' => [2267.717, 3401.575], // = ( 800 x 1200 ) mm = ( 31.50 x 47.24 ) in
'FR_DOUBLE_JESUS' => [2154.331, 3174.803], // = ( 760 x 1120 ) mm = ( 29.92 x 44.09 ) in
'FR_GRAND_AIGLE' => [2125.984, 3004.724], // = ( 750 x 1060 ) mm = ( 29.53 x 41.73 ) in
'FR_PETIT_AIGLE' => [1984.252, 2664.567], // = ( 700 x 940 ) mm = ( 27.56 x 37.01 ) in
'FR_DOUBLE_RAISIN' => [1842.520, 2834.646], // = ( 650 x 1000 ) mm = ( 25.59 x 39.37 ) in
'FR_JOURNAL' => [1842.520, 2664.567], // = ( 650 x 940 ) mm = ( 25.59 x 37.01 ) in
'FR_COLOMBIER_AFFICHE' => [1785.827, 2551.181], // = ( 630 x 900 ) mm = ( 24.80 x 35.43 ) in
'FR_DOUBLE_CAVALIER' => [1757.480, 2607.874], // = ( 620 x 920 ) mm = ( 24.41 x 36.22 ) in
'FR_CLOCHE' => [1700.787, 2267.717], // = ( 600 x 800 ) mm = ( 23.62 x 31.50 ) in
'FR_SOLEIL' => [1700.787, 2267.717], // = ( 600 x 800 ) mm = ( 23.62 x 31.50 ) in
'FR_DOUBLE_CARRE' => [1587.402, 2551.181], // = ( 560 x 900 ) mm = ( 22.05 x 35.43 ) in
'FR_DOUBLE_COQUILLE' => [1587.402, 2494.488], // = ( 560 x 880 ) mm = ( 22.05 x 34.65 ) in
'FR_JESUS' => [1587.402, 2154.331], // = ( 560 x 760 ) mm = ( 22.05 x 29.92 ) in
'FR_RAISIN' => [1417.323, 1842.520], // = ( 500 x 650 ) mm = ( 19.69 x 25.59 ) in
'FR_CAVALIER' => [1303.937, 1757.480], // = ( 460 x 620 ) mm = ( 18.11 x 24.41 ) in
'FR_DOUBLE_COURONNE' => [1303.937, 2040.945], // = ( 460 x 720 ) mm = ( 18.11 x 28.35 ) in
'FR_CARRE' => [1275.591, 1587.402], // = ( 450 x 560 ) mm = ( 17.72 x 22.05 ) in
'FR_COQUILLE' => [1247.244, 1587.402], // = ( 440 x 560 ) mm = ( 17.32 x 22.05 ) in
'FR_DOUBLE_TELLIERE' => [1247.244, 1927.559], // = ( 440 x 680 ) mm = ( 17.32 x 26.77 ) in
'FR_DOUBLE_CLOCHE' => [1133.858, 1700.787], // = ( 400 x 600 ) mm = ( 15.75 x 23.62 ) in
'FR_DOUBLE_POT' => [1133.858, 1757.480], // = ( 400 x 620 ) mm = ( 15.75 x 24.41 ) in
'FR_ECU' => [1133.858, 1474.016], // = ( 400 x 520 ) mm = ( 15.75 x 20.47 ) in
'FR_COURONNE' => [1020.472, 1303.937], // = ( 360 x 460 ) mm = ( 14.17 x 18.11 ) in
'FR_TELLIERE' => [963.780, 1247.244], // = ( 340 x 440 ) mm = ( 13.39 x 17.32 ) in
'FR_POT' => [878.740, 1133.858], // = ( 310 x 400 ) mm = ( 12.20 x 15.75 ) in
];
/**
* Get page dimensions from format name.
* @param mixed $format The format name @see self::$page_format
* @return array containing page width and height in points
* @since 5.0.010 (2010-05-17)
* @public static
*/
public static function getPageSizeFromFormat($format) {
if (isset(self::$page_formats[$format])) {
return self::$page_formats[$format];
}
return self::$page_formats['A4'];
}
/**
* Set page boundaries.
* @param int $page page number
* @param string $type valid values are: - 'MediaBox' : the boundaries of the physical medium on which the page shall be displayed or printed;
- 'CropBox' : the visible region of default user space;
- 'BleedBox' : the region to which the contents of the page shall be clipped when output in a production environment;
- 'TrimBox' : the intended dimensions of the finished page after trimming;
- 'ArtBox' : the page's meaningful content (including potential white space).
* @param float $llx lower-left x coordinate in user units
* @param float $lly lower-left y coordinate in user units
* @param float $urx upper-right x coordinate in user units
* @param float $ury upper-right y coordinate in user units
* @param bool $points if true uses user units as unit of measure, otherwise uses PDF points
* @param float $k scale factor (number of points in user unit)
* @param array $pagedim array of page dimensions
* @return array pagedim array of page dimensions
* @since 5.0.010 (2010-05-17)
* @public static
*/
public static function setPageBoxes($page, $type, $llx, $lly, $urx, $ury, $points, $k, $pagedim=[]) {
if (!isset($pagedim[$page])) {
// initialize array
$pagedim[$page] = [];
}
if (!\in_array($type, self::$pageboxes)) {
return;
}
if ($points) {
$k = 1;
}
$pagedim[$page][$type]['llx'] = ($llx * $k);
$pagedim[$page][$type]['lly'] = ($lly * $k);
$pagedim[$page][$type]['urx'] = ($urx * $k);
$pagedim[$page][$type]['ury'] = ($ury * $k);
return $pagedim;
}
/**
* Swap X and Y coordinates of page boxes (change page boxes orientation).
* @param int $page page number
* @param array $pagedim array of page dimensions
* @return array pagedim array of page dimensions
* @since 5.0.010 (2010-05-17)
* @public static
*/
public static function swapPageBoxCoordinates($page, $pagedim) {
foreach (self::$pageboxes as $type) {
// swap X and Y coordinates
if (isset($pagedim[$page][$type])) {
$tmp = $pagedim[$page][$type]['llx'];
$pagedim[$page][$type]['llx'] = $pagedim[$page][$type]['lly'];
$pagedim[$page][$type]['lly'] = $tmp;
$tmp = $pagedim[$page][$type]['urx'];
$pagedim[$page][$type]['urx'] = $pagedim[$page][$type]['ury'];
$pagedim[$page][$type]['ury'] = $tmp;
}
}
return $pagedim;
}
/**
* Get the canonical page layout mode.
* @param string $layout The page layout. Possible values are:- SinglePage Display one page at a time
- OneColumn Display the pages in one column
- TwoColumnLeft Display the pages in two columns, with odd-numbered pages on the left
- TwoColumnRight Display the pages in two columns, with odd-numbered pages on the right
- TwoPageLeft (PDF 1.5) Display the pages two at a time, with odd-numbered pages on the left
- TwoPageRight (PDF 1.5) Display the pages two at a time, with odd-numbered pages on the right
* @return string canonical page layout name
* @public static
*/
public static function getPageLayoutMode($layout='SinglePage') {
switch ($layout) {
case 'default':
case 'single':
case 'SinglePage': {
$layout_mode = 'SinglePage';
break;
}
case 'continuous':
case 'OneColumn': {
$layout_mode = 'OneColumn';
break;
}
case 'two':
case 'TwoColumnLeft': {
$layout_mode = 'TwoColumnLeft';
break;
}
case 'TwoColumnRight': {
$layout_mode = 'TwoColumnRight';
break;
}
case 'TwoPageLeft': {
$layout_mode = 'TwoPageLeft';
break;
}
case 'TwoPageRight': {
$layout_mode = 'TwoPageRight';
break;
}
default: {
$layout_mode = 'SinglePage';
}
}
return $layout_mode;
}
/**
* Get the canonical page layout mode.
* @param string $mode A name object specifying how the document should be displayed when opened:- UseNone Neither document outline nor thumbnail images visible
- UseOutlines Document outline visible
- UseThumbs Thumbnail images visible
- FullScreen Full-screen mode, with no menu bar, window controls, or any other window visible
- UseOC (PDF 1.5) Optional content group panel visible
- UseAttachments (PDF 1.6) Attachments panel visible
* @return string canonical page mode name
* @public static
*/
public static function getPageMode($mode='UseNone') {
switch ($mode) {
case 'UseNone': {
$page_mode = 'UseNone';
break;
}
case 'UseOutlines': {
$page_mode = 'UseOutlines';
break;
}
case 'UseThumbs': {
$page_mode = 'UseThumbs';
break;
}
case 'FullScreen': {
$page_mode = 'FullScreen';
break;
}
case 'UseOC': {
$page_mode = 'UseOC';
break;
}
case '': {
$page_mode = 'UseAttachments';
break;
}
default: {
$page_mode = 'UseNone';
}
}
return $page_mode;
}
} // END OF TCPDF_STATIC CLASS
//============================================================+
// END OF FILE
//============================================================+