|
|
|
@ -1,13 +1,13 @@
|
|
|
|
|
<?php
|
|
|
|
|
//============================================================+
|
|
|
|
|
// File name : tcpdf.php
|
|
|
|
|
// Version : 6.6.5
|
|
|
|
|
// Version : 6.7.5
|
|
|
|
|
// Begin : 2002-08-03
|
|
|
|
|
// Last Update : 2023-09-06
|
|
|
|
|
// Last Update : 2024-03-18
|
|
|
|
|
// Author : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
|
|
|
|
|
// License : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
|
|
|
|
|
// -------------------------------------------------------------------
|
|
|
|
|
// Copyright (C) 2002-2023 Nicola Asuni - Tecnick.com LTD
|
|
|
|
|
// Copyright (C) 2002-2024 Nicola Asuni - Tecnick.com LTD
|
|
|
|
|
//
|
|
|
|
|
// This file is part of TCPDF software library.
|
|
|
|
|
//
|
|
|
|
@ -128,7 +128,7 @@ require_once(dirname(__FILE__).'/include/tcpdf_static.php');
|
|
|
|
|
* TCPDF project (http://www.tcpdf.org) has been originally derived in 2002 from the Public Domain FPDF class by Olivier Plathey (http://www.fpdf.org), but now is almost entirely rewritten.<br>
|
|
|
|
|
* @package com.tecnick.tcpdf
|
|
|
|
|
* @brief PHP class for generating PDF documents without requiring external extensions.
|
|
|
|
|
* @version 6.6.5
|
|
|
|
|
* @version 6.7.5
|
|
|
|
|
* @author Nicola Asuni - info@tecnick.com
|
|
|
|
|
* @IgnoreAnnotation("protected")
|
|
|
|
|
* @IgnoreAnnotation("public")
|
|
|
|
@ -838,6 +838,13 @@ class TCPDF {
|
|
|
|
|
*/
|
|
|
|
|
protected $file_id;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Internal secret used to encrypt data.
|
|
|
|
|
* @protected
|
|
|
|
|
* @since 6.7.5 (2024-03-21)
|
|
|
|
|
*/
|
|
|
|
|
protected $hash_key;
|
|
|
|
|
|
|
|
|
|
// --- bookmark ---
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -1880,10 +1887,10 @@ class TCPDF {
|
|
|
|
|
// set file ID for trailer
|
|
|
|
|
$serformat = (is_array($format) ? json_encode($format) : $format);
|
|
|
|
|
$this->file_id = md5(TCPDF_STATIC::getRandomSeed('TCPDF'.$orientation.$unit.$serformat.$encoding));
|
|
|
|
|
$this->hash_key = hash_hmac('sha256', TCPDF_STATIC::getRandomSeed($this->file_id), TCPDF_STATIC::getRandomSeed('TCPDF'), false);
|
|
|
|
|
$this->font_obj_ids = array();
|
|
|
|
|
$this->page_obj_id = array();
|
|
|
|
|
$this->form_obj_id = array();
|
|
|
|
|
|
|
|
|
|
// set pdf/a mode
|
|
|
|
|
if ($pdfa != false) {
|
|
|
|
|
$this->pdfa_mode = true;
|
|
|
|
@ -4427,7 +4434,7 @@ class TCPDF {
|
|
|
|
|
$this->Error('Unknow font type: '.$type.'');
|
|
|
|
|
}
|
|
|
|
|
// set name if unset
|
|
|
|
|
if (!isset($name) OR empty($name)) {
|
|
|
|
|
if (empty($name)) {
|
|
|
|
|
$name = $fontkey;
|
|
|
|
|
}
|
|
|
|
|
// create artificial font style variations if missing (only works with non-embedded fonts)
|
|
|
|
@ -4470,7 +4477,7 @@ class TCPDF {
|
|
|
|
|
// we are inside an XObject template
|
|
|
|
|
$this->xobjects[$this->xobjid]['fonts'][$fontkey] = $this->numfonts;
|
|
|
|
|
}
|
|
|
|
|
if (isset($diff) AND (!empty($diff))) {
|
|
|
|
|
if (!empty($diff)) {
|
|
|
|
|
//Search existing encodings
|
|
|
|
|
$d = 0;
|
|
|
|
|
$nb = count($this->diffs);
|
|
|
|
@ -16389,6 +16396,53 @@ class TCPDF {
|
|
|
|
|
* @since 3.2.000 (2008-06-20)
|
|
|
|
|
*/
|
|
|
|
|
protected function getHtmlDomArray($html) {
|
|
|
|
|
// set inheritable properties fot the first void element
|
|
|
|
|
// possible inheritable properties are: azimuth, border-collapse, border-spacing, caption-side, color, cursor, direction, empty-cells, font, font-family, font-stretch, font-size, font-size-adjust, font-style, font-variant, font-weight, letter-spacing, line-height, list-style, list-style-image, list-style-position, list-style-type, orphans, page, page-break-inside, quotes, speak, speak-header, text-align, text-indent, text-transform, volume, white-space, widows, word-spacing
|
|
|
|
|
$dom = array(
|
|
|
|
|
array(
|
|
|
|
|
'tag' => false,
|
|
|
|
|
'block' => false,
|
|
|
|
|
'value' => '',
|
|
|
|
|
'parent' => 0,
|
|
|
|
|
'hide' => false,
|
|
|
|
|
'fontname' => $this->FontFamily,
|
|
|
|
|
'fontstyle' => $this->FontStyle,
|
|
|
|
|
'fontsize' => $this->FontSizePt,
|
|
|
|
|
'font-stretch' => $this->font_stretching,
|
|
|
|
|
'letter-spacing' => $this->font_spacing,
|
|
|
|
|
'stroke' => $this->textstrokewidth,
|
|
|
|
|
'fill' => (($this->textrendermode % 2) == 0),
|
|
|
|
|
'clip' => ($this->textrendermode > 3),
|
|
|
|
|
'line-height' => $this->cell_height_ratio,
|
|
|
|
|
'bgcolor' => false,
|
|
|
|
|
'fgcolor' => $this->fgcolor, // color
|
|
|
|
|
'strokecolor' => $this->strokecolor,
|
|
|
|
|
'align' => '',
|
|
|
|
|
'listtype' => '',
|
|
|
|
|
'text-indent' => 0,
|
|
|
|
|
'text-transform' => '',
|
|
|
|
|
'border' => array(),
|
|
|
|
|
'dir' => $this->rtl?'rtl':'ltr',
|
|
|
|
|
'width' => 0,
|
|
|
|
|
'height' => 0,
|
|
|
|
|
'x' => 0,
|
|
|
|
|
'y' => 0,
|
|
|
|
|
'w' => 0,
|
|
|
|
|
'h' => 0,
|
|
|
|
|
'l' => 0,
|
|
|
|
|
't' => 0,
|
|
|
|
|
'r' => 0,
|
|
|
|
|
'b' => 0,
|
|
|
|
|
'padding' => array('T' => 0, 'R' => 0, 'B' => 0, 'L' => 0),
|
|
|
|
|
'margin' => array('T' => 0, 'R' => 0, 'B' => 0, 'L' => 0),
|
|
|
|
|
'border-spacing' => array('H' => 0, 'V' => 0),
|
|
|
|
|
'border-collapse' => 'separate',
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
if(empty($html)) {
|
|
|
|
|
return $dom;
|
|
|
|
|
}
|
|
|
|
|
// array of CSS styles ( selector => properties).
|
|
|
|
|
$css = array();
|
|
|
|
|
// get CSS array defined at previous call
|
|
|
|
@ -16533,37 +16587,8 @@ class TCPDF {
|
|
|
|
|
// count elements
|
|
|
|
|
$maxel = count($a);
|
|
|
|
|
$elkey = 0;
|
|
|
|
|
$key = 0;
|
|
|
|
|
// create an array of elements
|
|
|
|
|
$dom = array();
|
|
|
|
|
$dom[$key] = array();
|
|
|
|
|
// set inheritable properties fot the first void element
|
|
|
|
|
// possible inheritable properties are: azimuth, border-collapse, border-spacing, caption-side, color, cursor, direction, empty-cells, font, font-family, font-stretch, font-size, font-size-adjust, font-style, font-variant, font-weight, letter-spacing, line-height, list-style, list-style-image, list-style-position, list-style-type, orphans, page, page-break-inside, quotes, speak, speak-header, text-align, text-indent, text-transform, volume, white-space, widows, word-spacing
|
|
|
|
|
$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; // color
|
|
|
|
|
$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; // true when we are inside the THEAD tag
|
|
|
|
|
++$key;
|
|
|
|
|
$key = 1;
|
|
|
|
|
$level = array();
|
|
|
|
|
array_push($level, 0); // root
|
|
|
|
|
while ($elkey < $maxel) {
|
|
|
|
@ -17200,41 +17225,59 @@ class TCPDF {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Return an hash code used to ensure that the serialized data has been generated by this TCPDF instance.
|
|
|
|
|
* @param string $data serialized data
|
|
|
|
|
* @return string
|
|
|
|
|
* @public static
|
|
|
|
|
* Calculates the hash value of the given data.
|
|
|
|
|
*
|
|
|
|
|
* @param string $data The data to be hashed.
|
|
|
|
|
* @return string The hashed value of the data.
|
|
|
|
|
*/
|
|
|
|
|
protected function getHashForTCPDFtagParams($data) {
|
|
|
|
|
return md5(strlen($data).$this->file_id.$data);
|
|
|
|
|
protected function hashTCPDFtag($data) {
|
|
|
|
|
return hash_hmac('sha256', $data, $this->hash_key, false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Serialize an array of parameters to be used with TCPDF tag in HTML code.
|
|
|
|
|
* @param array $data parameters array
|
|
|
|
|
* @return string containing serialized data
|
|
|
|
|
* Serialize data to be used with TCPDF tag in HTML code.
|
|
|
|
|
* @param string $method TCPDF method name
|
|
|
|
|
* @param array $params Method parameters
|
|
|
|
|
* @return string Serialized data
|
|
|
|
|
* @public static
|
|
|
|
|
*/
|
|
|
|
|
public function serializeTCPDFtagParameters($data) {
|
|
|
|
|
public function serializeTCPDFtag($method, $params=array()) {
|
|
|
|
|
$data = array('m' => $method, 'p' => $params);
|
|
|
|
|
$encoded = urlencode(json_encode($data));
|
|
|
|
|
return $this->getHashForTCPDFtagParams($encoded).$encoded;
|
|
|
|
|
$hash = $this->hashTCPDFtag($encoded);
|
|
|
|
|
return strlen($hash).'+'.$hash.'+'.$encoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Unserialize parameters to be used with TCPDF tag in HTML code.
|
|
|
|
|
* Unserialize data to be used with TCPDF tag in HTML code.
|
|
|
|
|
* @param string $data serialized data
|
|
|
|
|
* @return array containing unserialized data
|
|
|
|
|
* @protected static
|
|
|
|
|
*/
|
|
|
|
|
protected function unserializeTCPDFtagParameters($data) {
|
|
|
|
|
$hash = substr($data, 0, 32);
|
|
|
|
|
$encoded = substr($data, 32);
|
|
|
|
|
if ($hash != $this->getHashForTCPDFtagParams($encoded)) {
|
|
|
|
|
protected function unserializeTCPDFtag($data) {
|
|
|
|
|
$hpos = strpos($data, '+');
|
|
|
|
|
$hlen = intval(substr($data, 0, $hpos));
|
|
|
|
|
$hash = substr($data, $hpos + 1, $hlen);
|
|
|
|
|
$encoded = substr($data, $hpos + 2 + $hlen);
|
|
|
|
|
if ($hash != $this->hashTCPDFtag($encoded)) {
|
|
|
|
|
$this->Error('Invalid parameters');
|
|
|
|
|
}
|
|
|
|
|
return json_decode(urldecode($encoded), true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Check if a TCPDF tag is allowed
|
|
|
|
|
* @param string $method TCPDF method name
|
|
|
|
|
* @return boolean
|
|
|
|
|
* @protected
|
|
|
|
|
*/
|
|
|
|
|
protected function allowedTCPDFtag($method) {
|
|
|
|
|
if (defined('K_ALLOWED_TCPDF_TAGS')) {
|
|
|
|
|
return (strpos(K_ALLOWED_TCPDF_TAGS, '|'.$method.'|') !== false);
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Prints a cell (rectangular area) with optional borders, background color and html text string.
|
|
|
|
|
* The upper-left corner of the cell corresponds to the current position. After the call, the current position moves to the right or to the next line.<br />
|
|
|
|
@ -17248,8 +17291,7 @@ class TCPDF {
|
|
|
|
|
* @param float|null $y upper-left corner Y coordinate
|
|
|
|
|
* @param string $html html text to print. Default value: empty string.
|
|
|
|
|
* @param mixed $border Indicates if borders must be drawn around the cell. The value can be a number:<ul><li>0: no border (default)</li><li>1: frame</li></ul> or a string containing some or all of the following characters (in any order):<ul><li>L: left</li><li>T: top</li><li>R: right</li><li>B: bottom</li></ul> or an array of line styles for each border group - for example: array('LTRB' => array('width' => 2, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0)))
|
|
|
|
|
* @param int $ln Indicates where the current position should go after the call. Possible values are:<ul><li>0: to the right (or left for RTL language)</li><li>1: to the beginning of the next line</li><li>2: below</li></ul>
|
|
|
|
|
Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value: 0.
|
|
|
|
|
* @param int $ln Indicates where the current position should go after the call. Possible values are:<ul><li>0: to the right (or left for RTL language)</li><li>1: to the beginning of the next line</li><li>2: below</li></ul> Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value: 0.
|
|
|
|
|
* @param boolean $fill Indicates if the cell background must be painted (true) or transparent (false).
|
|
|
|
|
* @param boolean $reseth if true reset the last cell height (default true).
|
|
|
|
|
* @param string $align Allows to center or align the text. Possible values are:<ul><li>L : left align</li><li>C : center</li><li>R : right align</li><li>'' : empty string : left for LTR or right for RTL</li></ul>
|
|
|
|
@ -19510,17 +19552,14 @@ Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value:
|
|
|
|
|
case 'tcpdf': {
|
|
|
|
|
if (defined('K_TCPDF_CALLS_IN_HTML') AND (K_TCPDF_CALLS_IN_HTML === true)) {
|
|
|
|
|
// Special tag used to call TCPDF methods
|
|
|
|
|
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;
|
|
|
|
|
// This tag is disabled by default by the K_TCPDF_CALLS_IN_HTML constant on TCPDF configuration file.
|
|
|
|
|
// Please use this feature only if you are in control of the HTML content and you are sure that it does not contain any harmful code.
|
|
|
|
|
if (!empty($tag['attribute']['data'])) {
|
|
|
|
|
$tcpdf_tag_data = $this->unserializeTCPDFtag($tag['attribute']['data']);
|
|
|
|
|
if ($this->allowedTCPDFtag($tcpdf_tag_data['m'])) {
|
|
|
|
|
call_user_func_array(array($this, $tcpdf_tag_data['m']), $tcpdf_tag_data['p']);
|
|
|
|
|
}
|
|
|
|
|
$this->newline = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
@ -21867,25 +21906,23 @@ Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value:
|
|
|
|
|
* @since 4.5.029 (2009-03-19)
|
|
|
|
|
*/
|
|
|
|
|
public function rollbackTransaction($self=false) {
|
|
|
|
|
if (isset($this->objcopy)) {
|
|
|
|
|
$objcopy = $this->objcopy;
|
|
|
|
|
$this->_destroy(true, true);
|
|
|
|
|
if ($self) {
|
|
|
|
|
$objvars = get_object_vars($objcopy);
|
|
|
|
|
foreach ($objvars as $key => $value) {
|
|
|
|
|
$this->$key = $value;
|
|
|
|
|
}
|
|
|
|
|
$objcopy->_destroy(true, true);
|
|
|
|
|
/* The unique file_id should not be used during cleanup again */
|
|
|
|
|
$objcopy->file_id = NULL;
|
|
|
|
|
unset($objcopy);
|
|
|
|
|
return $this;
|
|
|
|
|
}
|
|
|
|
|
/* The unique file_id should not be used during cleanup again */
|
|
|
|
|
$this->file_id = NULL;
|
|
|
|
|
return $objcopy;
|
|
|
|
|
if (!isset($this->objcopy)) {
|
|
|
|
|
return $this;
|
|
|
|
|
}
|
|
|
|
|
return $this;
|
|
|
|
|
$file_id = $this->file_id;
|
|
|
|
|
$objcopy = $this->objcopy;
|
|
|
|
|
$this->_destroy(true, true);
|
|
|
|
|
if ($self) {
|
|
|
|
|
$objvars = get_object_vars($objcopy);
|
|
|
|
|
foreach ($objvars as $key => $value) {
|
|
|
|
|
$this->$key = $value;
|
|
|
|
|
}
|
|
|
|
|
$objcopy->_destroy(true, true);
|
|
|
|
|
unset($objcopy);
|
|
|
|
|
return $this;
|
|
|
|
|
}
|
|
|
|
|
$this->file_id = $file_id;
|
|
|
|
|
return $objcopy;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// --- MULTI COLUMNS METHODS -----------------------
|
|
|
|
|