32
1
mirror of https://github.com/vdm-io/tcpdf.git synced 2024-11-25 22:07:33 +00:00

updated to v6.4.1

This commit is contained in:
Llewellyn van der Merwe 2021-06-15 04:13:50 +02:00
parent fd4acc640b
commit fca64021ac
Signed by: Llewellyn
GPG Key ID: EFC0C720A240551C
16 changed files with 309 additions and 96 deletions

View File

@ -1,16 +1,91 @@
6.2.25 6.4.1 (2021-03-27)
- Update tcpdf version (no code changes)
6.4.0 (2021-03-27)
- allow styles on <HR> tags
- check if file exists before calling unlink
- Fix image file type for urls with query params
- Fix SVGPath should accept 1.19.30 (equiv 1.19,.30) compacted values list
- Fix Second parameter of TCPDF::cell() must be a number
- PHP 8.0 function signature fixes
- Fix vulnerability to roman numeral bombs
- Optimized a regular expression
- Cache file get contents calls
- Remove mb_internal encoding handling
6.3.5 (2020-02-14)
- Fixed curly braces in pdf417
- Fixed a syntax error issue when accessing an index of a casted variable
6.3.4 (2020-02-12)
- Check if imagekeys exist
- Unlink only images in cache
6.3.3 (2020-02-12)
- Fixed PHP 7.4 - cannot use array offset on integers
- Fixed PDF/A-3B validation issue caused by missing pdfaSchema:property.
- Removed backup changelog files from repo
- Prevents the deletion of non-existent files in /tmp
- Prevent crash in case of no list access in cache path
- Check existence of file before delete it
- Fixed erase users pictures
- Fixed problem with $imagekeys undefined or unlinked
- Fix SVGPath elliptical arc with rx/ry=0 + z should return to initial point
- Fixed PHP 7.4 errors
- handle integers for pages
- Fixed background image doesn't work in RTL
- Fixed PDF/A validity
- Fixed datamatrix.php for PHP 7.4
- Fixed deprecated PHP features
6.3.2 (2019-09-20)
- Update ICC profile
6.3.1 (2019-09-20)
- Fix reported version
- Fix Undefined property: GLPIPDF::$imagekeys
6.3.0 (2019-09-19)
- fix SpotColor handling in HTML
- Add an additional empty test to prevent error in PHP 7.2
- Fix the documentation how to calculate the cell height
- Drop duplicated array indices
- Fix TCPDF_STATIC::fileGetContents()
- Introduce other version of pdfA (2 and 3)
- Add UF and AFRelationship missing
- Fix performance issue of cloned instances
- Change glob to readdir which performs better
- URI in PDF can result in E_NOTICE
- Fix a warning for PHP 7.4
- Fixed gradient offsets for percentage-based stops.
- Fixed file_get_contents return value should also be checked for a non-empty string
- Fix Array and string offset access syntax with curly braces is deprecated
- Fix PHP Warning: chr() expects parameter 1 to be int
- Add a VERSION file
6.2.26 (2018-10-16)
- Update sRGB.icc with the one from the Debian package icc-profiles-free
- Fix unsupported operand types error when codepoints arrays are merged
6.2.25 (2018-09-23)
- Fix support for image URLs. - Fix support for image URLs.
6.2.24 6.2.24
- Support remote urls when checking if file exists. - Support remote urls when checking if file exists.
6.2.23 6.2.23 (2018-09-22)
- Simplify file_exists function. - Simplify file_exists function.
6.2.22 6.2.22 (2018-09-14)
- Fixes on `include/tcpdf_images.php`, `include/tcpdf_static.php` and `tcpdf.php` about file handling
6.2.21 (2018-09-14)
- _no code changes_
6.2.20 (2018-09-14)
- Fix for security vulnerability: Using the phar:// wrapper it was possible to trigger the unserialization of user provided data. - Fix for security vulnerability: Using the phar:// wrapper it was possible to trigger the unserialization of user provided data.
6.2.19 6.2.19 (2018-09-14)
- Merge various fixes for PHP 7.3 compatibility and security. - Merge various fixes for PHP 7.3 compatibility and security.
6.2.13 (2016-06-10) 6.2.13 (2016-06-10)

View File

@ -1 +1 @@
6.3.5 6.4.1

View File

@ -1,6 +1,6 @@
{ {
"name": "tecnickcom/tcpdf", "name": "tecnickcom/tcpdf",
"version": "6.3.5", "version": "6.4.1",
"homepage": "http://www.tcpdf.org/", "homepage": "http://www.tcpdf.org/",
"type": "library", "type": "library",
"description": "TCPDF is a PHP class for generating PDF documents and barcodes.", "description": "TCPDF is a PHP class for generating PDF documents and barcodes.",

View File

@ -740,6 +740,7 @@ class PDF417 {
* @protected * @protected
*/ */
protected function getErrorCorrectionLevel($ecl, $numcw) { protected function getErrorCorrectionLevel($ecl, $numcw) {
$maxecl = 8; // starting error level
// check for automatic levels // check for automatic levels
if (($ecl < 0) OR ($ecl > 8)) { if (($ecl < 0) OR ($ecl > 8)) {
if ($numcw < 41) { if ($numcw < 41) {
@ -755,7 +756,6 @@ class PDF417 {
} }
} }
// get maximum correction level // get maximum correction level
$maxecl = 8; // starting error level
$maxerrsize = (928 - $numcw); // available codewords for error $maxerrsize = (928 - $numcw); // available codewords for error
while ($maxecl > 0) { while ($maxecl > 0) {
$errsize = (2 << $ecl); $errsize = (2 << $ecl);

View File

@ -1386,6 +1386,7 @@ class QRcode {
$p += 2; $p += 2;
} }
$this->items = $this->appendNewInputItem($this->items, QR_MODE_KJ, $p, str_split($this->dataStr)); $this->items = $this->appendNewInputItem($this->items, QR_MODE_KJ, $p, str_split($this->dataStr));
$run = $p;
return $run; return $run;
} }
@ -1455,7 +1456,7 @@ class QRcode {
break; break;
} }
case QR_MODE_KJ: { case QR_MODE_KJ: {
if ($hint == QR_MODE_KJ) { if ($this->hint == QR_MODE_KJ) {
$length = $this->eatKanji(); $length = $this->eatKanji();
} else { } else {
$length = $this->eat8(); $length = $this->eat8();

View File

@ -449,7 +449,7 @@ class TCPDF_COLORS {
} }
if (!in_array($color, self::$jscolor)) { if (!in_array($color, self::$jscolor)) {
// default transparent color // default transparent color
$color = $jscolor[0]; $color = self::$jscolor[0];
} }
return 'color.'.$color; return 'color.'.$color;
} }

View File

@ -557,6 +557,7 @@ class TCPDF_FONTS {
$numGlyphs = TCPDF_STATIC::_getUSHORT($font, $offset); $numGlyphs = TCPDF_STATIC::_getUSHORT($font, $offset);
// ---------- get CIDToGIDMap ---------- // ---------- get CIDToGIDMap ----------
$ctg = array(); $ctg = array();
$c = 0;
foreach ($encodingTables as $enctable) { foreach ($encodingTables as $enctable) {
// get only specified Platform ID and Encoding ID // get only specified Platform ID and Encoding ID
if (($enctable['platformID'] == $platid) AND ($enctable['encodingID'] == $encid)) { if (($enctable['platformID'] == $platid) AND ($enctable['encodingID'] == $encid)) {
@ -956,6 +957,7 @@ class TCPDF_FONTS {
// sfnt version must be 0x00010000 for TrueType version 1.0. // sfnt version must be 0x00010000 for TrueType version 1.0.
return $font; return $font;
} }
$c = 0;
$offset += 4; $offset += 4;
// get number of tables // get number of tables
$numTables = TCPDF_STATIC::_getUSHORT($font, $offset); $numTables = TCPDF_STATIC::_getUSHORT($font, $offset);
@ -1883,7 +1885,7 @@ class TCPDF_FONTS {
* Converts UTF-8 character to integer value.<br> * Converts UTF-8 character to integer value.<br>
* Uses the getUniord() method if the value is not cached. * Uses the getUniord() method if the value is not cached.
* @param $uch (string) character string to process. * @param $uch (string) character string to process.
* @return integer Unicode value * @return int Unicode value
* @public static * @public static
*/ */
public static function uniord($uch) { public static function uniord($uch) {
@ -1922,7 +1924,7 @@ class TCPDF_FONTS {
* --------------------------------------------------------------------- * ---------------------------------------------------------------------
* </pre> * </pre>
* @param $uch (string) character string to process. * @param $uch (string) character string to process.
* @return integer Unicode value * @return int Unicode value
* @author Nicola Asuni * @author Nicola Asuni
* @public static * @public static
*/ */
@ -1995,7 +1997,7 @@ class TCPDF_FONTS {
* @author Nicola Asuni * @author Nicola Asuni
* @public static * @public static
*/ */
public static function UTF8StringToArray($str, $isunicode=true, &$currentfont) { public static function UTF8StringToArray($str, $isunicode, &$currentfont) {
if ($isunicode) { if ($isunicode) {
// requires PCRE unicode support turned on // requires PCRE unicode support turned on
$chars = TCPDF_STATIC::pregSplit('//','u', $str, -1, PREG_SPLIT_NO_EMPTY); $chars = TCPDF_STATIC::pregSplit('//','u', $str, -1, PREG_SPLIT_NO_EMPTY);
@ -2021,7 +2023,7 @@ class TCPDF_FONTS {
* @since 3.2.000 (2008-06-23) * @since 3.2.000 (2008-06-23)
* @public static * @public static
*/ */
public static function UTF8ToLatin1($str, $isunicode=true, &$currentfont) { public static function UTF8ToLatin1($str, $isunicode, &$currentfont) {
$unicode = self::UTF8StringToArray($str, $isunicode, $currentfont); // array containing UTF-8 unicode values $unicode = self::UTF8StringToArray($str, $isunicode, $currentfont); // array containing UTF-8 unicode values
return self::UTF8ArrToLatin1($unicode); return self::UTF8ArrToLatin1($unicode);
} }
@ -2037,7 +2039,7 @@ class TCPDF_FONTS {
* @since 1.53.0.TC005 (2005-01-05) * @since 1.53.0.TC005 (2005-01-05)
* @public static * @public static
*/ */
public static function UTF8ToUTF16BE($str, $setbom=false, $isunicode=true, &$currentfont) { public static function UTF8ToUTF16BE($str, $setbom, $isunicode, &$currentfont) {
if (!$isunicode) { if (!$isunicode) {
return $str; // string is not in unicode return $str; // string is not in unicode
} }
@ -2057,7 +2059,7 @@ class TCPDF_FONTS {
* @since 2.1.000 (2008-01-08) * @since 2.1.000 (2008-01-08)
* @public static * @public static
*/ */
public static function utf8StrRev($str, $setbom=false, $forcertl=false, $isunicode=true, &$currentfont) { public static function utf8StrRev($str, $setbom, $forcertl, $isunicode, &$currentfont) {
return self::utf8StrArrRev(self::UTF8StringToArray($str, $isunicode, $currentfont), $str, $setbom, $forcertl, $isunicode, $currentfont); return self::utf8StrArrRev(self::UTF8StringToArray($str, $isunicode, $currentfont), $str, $setbom, $forcertl, $isunicode, $currentfont);
} }
@ -2074,7 +2076,7 @@ class TCPDF_FONTS {
* @since 4.9.000 (2010-03-27) * @since 4.9.000 (2010-03-27)
* @public static * @public static
*/ */
public static function utf8StrArrRev($arr, $str='', $setbom=false, $forcertl=false, $isunicode=true, &$currentfont) { public static function utf8StrArrRev($arr, $str, $setbom, $forcertl, $isunicode, &$currentfont) {
return self::arrUTF8ToUTF16BE(self::utf8Bidi($arr, $str, $forcertl, $isunicode, $currentfont), $setbom); return self::arrUTF8ToUTF16BE(self::utf8Bidi($arr, $str, $forcertl, $isunicode, $currentfont), $setbom);
} }
@ -2090,7 +2092,7 @@ class TCPDF_FONTS {
* @since 2.4.000 (2008-03-06) * @since 2.4.000 (2008-03-06)
* @public static * @public static
*/ */
public static function utf8Bidi($ta, $str='', $forcertl=false, $isunicode=true, &$currentfont) { public static function utf8Bidi($ta, $str, $forcertl, $isunicode, &$currentfont) {
// paragraph embedding level // paragraph embedding level
$pel = 0; $pel = 0;
// max level // max level

View File

@ -77,10 +77,7 @@ class TCPDF_IMAGES {
} }
} }
if (empty($type)) { if (empty($type)) {
$fileinfo = pathinfo($imgfile); $type = strtolower(trim(pathinfo(parse_url($imgfile, PHP_URL_PATH), PATHINFO_EXTENSION)));
if (isset($fileinfo['extension']) AND (!TCPDF_STATIC::empty_string($fileinfo['extension']))) {
$type = strtolower(trim($fileinfo['extension']));
}
} }
if ($type == 'jpg') { if ($type == 'jpg') {
$type = 'jpeg'; $type = 'jpeg';

View File

@ -276,7 +276,7 @@ class TCPDF_STATIC {
/** /**
* Determine whether a string is empty. * Determine whether a string is empty.
* @param $str (string) string to be checked * @param $str (string) string to be checked
* @return boolean true if string is empty * @return bool true if string is empty
* @since 4.5.044 (2009-04-16) * @since 4.5.044 (2009-04-16)
* @public static * @public static
*/ */
@ -1136,7 +1136,7 @@ class TCPDF_STATIC {
* @see setHtmlVSpace() * @see setHtmlVSpace()
* @public static * @public static
*/ */
public static function fixHTMLCode($html, $default_css='', $tagvs='', $tidy_options='', &$tagvspaces) { public static function fixHTMLCode($html, $default_css, $tagvs, $tidy_options, &$tagvspaces) {
// configure parameters for HTML Tidy // configure parameters for HTML Tidy
if ($tidy_options === '') { if ($tidy_options === '') {
$tidy_options = array ( $tidy_options = array (
@ -1440,6 +1440,10 @@ class TCPDF_STATIC {
*/ */
public static function intToRoman($number) { public static function intToRoman($number) {
$roman = ''; $roman = '';
if ($number >= 4000) {
// do not represent numbers above 4000 in Roman numerals
return strval($number);
}
while ($number >= 1000) { while ($number >= 1000) {
$roman .= 'M'; $roman .= 'M';
$number -= 1000; $number -= 1000;
@ -1842,6 +1846,10 @@ class TCPDF_STATIC {
curl_setopt($crs, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($crs, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($crs, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($crs, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($crs, CURLOPT_USERAGENT, 'tc-lib-file'); curl_setopt($crs, CURLOPT_USERAGENT, 'tc-lib-file');
curl_setopt($crs, CURLOPT_MAXREDIRS, 5);
if (defined('CURLOPT_PROTOCOLS')) {
curl_setopt($crs, CURLOPT_PROTOCOLS, CURLPROTO_HTTPS | CURLPROTO_HTTP | CURLPROTO_FTP | CURLPROTO_FTPS);
}
curl_exec($crs); curl_exec($crs);
$code = curl_getinfo($crs, CURLINFO_HTTP_CODE); $code = curl_getinfo($crs, CURLINFO_HTTP_CODE);
curl_close($crs); curl_close($crs);
@ -1859,7 +1867,7 @@ class TCPDF_STATIC {
public static function encodeUrlQuery($url) { public static function encodeUrlQuery($url) {
$urlData = parse_url($url); $urlData = parse_url($url);
if (isset($urlData['query']) && $urlData['query']) { if (isset($urlData['query']) && $urlData['query']) {
$urlQueryData = []; $urlQueryData = array();
parse_str(urldecode($urlData['query']), $urlQueryData); parse_str(urldecode($urlData['query']), $urlQueryData);
$updatedUrl = $urlData['scheme'] . '://' . $urlData['host'] . $urlData['path'] . '?' . http_build_query($urlQueryData); $updatedUrl = $urlData['scheme'] . '://' . $urlData['host'] . $urlData['path'] . '?' . http_build_query($urlQueryData);
} else { } else {
@ -1973,6 +1981,10 @@ class TCPDF_STATIC {
curl_setopt($crs, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($crs, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($crs, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($crs, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($crs, CURLOPT_USERAGENT, 'tc-lib-file'); curl_setopt($crs, CURLOPT_USERAGENT, 'tc-lib-file');
curl_setopt($crs, CURLOPT_MAXREDIRS, 5);
if (defined('CURLOPT_PROTOCOLS')) {
curl_setopt($crs, CURLOPT_PROTOCOLS, CURLPROTO_HTTPS | CURLPROTO_HTTP | CURLPROTO_FTP | CURLPROTO_FTPS);
}
$ret = curl_exec($crs); $ret = curl_exec($crs);
curl_close($crs); curl_close($crs);
if ($ret !== false) { if ($ret !== false) {
@ -2507,7 +2519,7 @@ class TCPDF_STATIC {
* @since 5.0.010 (2010-05-17) * @since 5.0.010 (2010-05-17)
* @public static * @public static
*/ */
public static function setPageBoxes($page, $type, $llx, $lly, $urx, $ury, $points=false, $k, $pagedim=array()) { public static function setPageBoxes($page, $type, $llx, $lly, $urx, $ury, $points, $k, $pagedim=array()) {
if (!isset($pagedim[$page])) { if (!isset($pagedim[$page])) {
// initialize array // initialize array
$pagedim[$page] = array(); $pagedim[$page] = array();

230
tcpdf.php
View File

@ -773,13 +773,6 @@ class TCPDF {
*/ */
protected $encoding = 'UTF-8'; protected $encoding = 'UTF-8';
/**
* PHP internal encoding.
* @protected
* @since 1.53.0.TC016
*/
protected $internal_encoding;
/** /**
* Boolean flag to indicate if the document language is Right-To-Left. * Boolean flag to indicate if the document language is Right-To-Left.
* @protected * @protected
@ -1832,6 +1825,23 @@ class TCPDF {
*/ */
protected $gdgammacache = array(); protected $gdgammacache = array();
/**
* Cache array for file content
* @protected
* @var array
* @sinde 6.3.5 (2020-09-28)
*/
protected $fileContentCache = array();
/**
* Whether to allow local file path in image html tags, when prefixed with file://
*
* @var bool
* @protected
* @since 6.4 (2020-07-23)
*/
protected $allowLocalFiles = false;
//------------------------------------------------------------ //------------------------------------------------------------
// METHODS // METHODS
//------------------------------------------------------------ //------------------------------------------------------------
@ -1840,8 +1850,6 @@ class TCPDF {
* This is the class constructor. * This is the class constructor.
* It allows to set up the page format, the orientation and the measure unit used in all the methods (except for the font sizes). * It allows to set up the page format, the orientation and the measure unit used in all the methods (except for the font sizes).
* *
* IMPORTANT: Please note that this method sets the mb_internal_encoding to ASCII, so if you are using the mbstring module functions with TCPDF you need to correctly set/unset the mb_internal_encoding when needed.
*
* @param $orientation (string) page orientation. Possible values are (case insensitive):<ul><li>P or Portrait (default)</li><li>L or Landscape</li><li>'' (empty string) for automatic orientation</li></ul> * @param $orientation (string) page orientation. Possible values are (case insensitive):<ul><li>P or Portrait (default)</li><li>L or Landscape</li><li>'' (empty string) for automatic orientation</li></ul>
* @param $unit (string) User measure unit. Possible values are:<ul><li>pt: point</li><li>mm: millimeter (default)</li><li>cm: centimeter</li><li>in: inch</li></ul><br />A point equals 1/72 of inch, that is to say about 0.35 mm (an inch being 2.54 cm). This is a very common unit in typography; font sizes are expressed in that unit. * @param $unit (string) User measure unit. Possible values are:<ul><li>pt: point</li><li>mm: millimeter (default)</li><li>cm: centimeter</li><li>in: inch</li></ul><br />A point equals 1/72 of inch, that is to say about 0.35 mm (an inch being 2.54 cm). This is a very common unit in typography; font sizes are expressed in that unit.
* @param $format (mixed) The format used for pages. It can be either: one of the string values specified at getPageSizeFromFormat() or an array of parameters specified at setPageFormat(). * @param $format (mixed) The format used for pages. It can be either: one of the string values specified at getPageSizeFromFormat() or an array of parameters specified at setPageFormat().
@ -1853,11 +1861,6 @@ class TCPDF {
* @see getPageSizeFromFormat(), setPageFormat() * @see getPageSizeFromFormat(), setPageFormat()
*/ */
public function __construct($orientation='P', $unit='mm', $format='A4', $unicode=true, $encoding='UTF-8', $diskcache=false, $pdfa=false) { public function __construct($orientation='P', $unit='mm', $format='A4', $unicode=true, $encoding='UTF-8', $diskcache=false, $pdfa=false) {
/* Set internal character encoding to ASCII */
if (function_exists('mb_internal_encoding') AND mb_internal_encoding()) {
$this->internal_encoding = mb_internal_encoding();
mb_internal_encoding('ASCII');
}
// set file ID for trailer // set file ID for trailer
$serformat = (is_array($format) ? json_encode($format) : $format); $serformat = (is_array($format) ? json_encode($format) : $format);
$this->file_id = md5(TCPDF_STATIC::getRandomSeed('TCPDF'.$orientation.$unit.$serformat.$encoding)); $this->file_id = md5(TCPDF_STATIC::getRandomSeed('TCPDF'.$orientation.$unit.$serformat.$encoding));
@ -2728,7 +2731,7 @@ class TCPDF {
/** /**
* Adjust the internal Cell padding array to take account of the line width. * Adjust the internal Cell padding array to take account of the line width.
* @param $brd (mixed) 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 $brd (mixed) 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)))
* @return array of adjustments * @return void|array of adjustments
* @public * @public
* @since 5.9.000 (2010-10-03) * @since 5.9.000 (2010-10-03)
*/ */
@ -2744,7 +2747,11 @@ class TCPDF {
$newbrd[$brd[$i]] = true; $newbrd[$brd[$i]] = true;
} }
$brd = $newbrd; $brd = $newbrd;
} elseif (($brd === 1) OR ($brd === true) OR (is_numeric($brd) AND (intval($brd) > 0))) { } elseif (
($brd === 1)
|| ($brd === true)
|| (is_numeric($brd) && ((int)$brd > 0))
) {
$brd = array('LRTB' => true); $brd = array('LRTB' => true);
} }
if (!is_array($brd)) { if (!is_array($brd)) {
@ -2762,7 +2769,7 @@ class TCPDF {
// process borders // process borders
foreach ($brd as $border => $style) { foreach ($brd as $border => $style) {
$line_width = $this->LineWidth; $line_width = $this->LineWidth;
if (is_array($style) AND isset($style['width'])) { if (is_array($style) && isset($style['width'])) {
// get border width // get border width
$line_width = $style['width']; $line_width = $style['width'];
} }
@ -2783,20 +2790,43 @@ class TCPDF {
} }
} }
// correct internal cell padding if required to avoid overlap between text and lines // correct internal cell padding if required to avoid overlap between text and lines
if ((strpos($border,'T') !== false) AND ($this->cell_padding['T'] < $adj)) { if (
is_numeric($this->cell_padding['T'])
&& ($this->cell_padding['T'] < $adj)
&& (strpos($border, 'T') !== false)
) {
$this->cell_padding['T'] = $adj; $this->cell_padding['T'] = $adj;
} }
if ((strpos($border,'R') !== false) AND ($this->cell_padding['R'] < $adj)) { if (
is_numeric($this->cell_padding['R'])
&& ($this->cell_padding['R'] < $adj)
&& (strpos($border, 'R') !== false)
) {
$this->cell_padding['R'] = $adj; $this->cell_padding['R'] = $adj;
} }
if ((strpos($border,'B') !== false) AND ($this->cell_padding['B'] < $adj)) { if (
is_numeric($this->cell_padding['B'])
&& ($this->cell_padding['B'] < $adj)
&& (strpos($border, 'B') !== false)
) {
$this->cell_padding['B'] = $adj; $this->cell_padding['B'] = $adj;
} }
if ((strpos($border,'L') !== false) AND ($this->cell_padding['L'] < $adj)) { if (
is_numeric($this->cell_padding['L'])
&& ($this->cell_padding['L'] < $adj)
&& (strpos($border, 'L') !== false)
) {
$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']));
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']),
);
} }
/** /**
@ -2935,6 +2965,18 @@ class TCPDF {
$this->creator = $creator; $this->creator = $creator;
} }
/**
* Whether to allow local file path in image html tags, when prefixed with file://
*
* @param $allowLocalFiles bool true, when local files should be allowed. Otherwise false.
* @public
* @since 6.4
*/
public function SetAllowLocalFiles($allowLocalFiles) {
$this->allowLocalFiles = (bool) $allowLocalFiles;
}
/** /**
* Throw an exception or print an error message and die if the K_TCPDF_PARSER_THROW_EXCEPTION_ERROR constant is set to true. * Throw an exception or print an error message and die if the K_TCPDF_PARSER_THROW_EXCEPTION_ERROR constant is set to true.
* @param $msg (string) The error message * @param $msg (string) The error message
@ -4863,7 +4905,7 @@ class TCPDF {
} }
reset($this->embeddedfiles); reset($this->embeddedfiles);
foreach ($this->embeddedfiles as $filename => $filedata) { foreach ($this->embeddedfiles as $filename => $filedata) {
$data = TCPDF_STATIC::fileGetContents($filedata['file']); $data = $this->getCachedFileContents($filedata['file']);
if ($data !== FALSE) { if ($data !== FALSE) {
$rawsize = strlen($data); $rawsize = strlen($data);
if ($rawsize > 0) { if ($rawsize > 0) {
@ -6489,7 +6531,7 @@ class TCPDF {
// *** very slow *** // *** very slow ***
$l = $this->GetArrStringWidth(TCPDF_FONTS::utf8Bidi(array_slice($chars, $j, ($i - $j)), '', $this->tmprtl, $this->isunicode, $this->CurrentFont)); $l = $this->GetArrStringWidth(TCPDF_FONTS::utf8Bidi(array_slice($chars, $j, ($i - $j)), '', $this->tmprtl, $this->isunicode, $this->CurrentFont));
} else { } else {
$l += $this->GetCharWidth($c); $l += $this->GetCharWidth($c, ($i+1 < $nb));
} }
if (($l > $wmax) OR (($c == 173) AND (($l + $tmp_shy_replacement_width) >= $wmax))) { if (($l > $wmax) OR (($c == 173) AND (($l + $tmp_shy_replacement_width) >= $wmax))) {
if (($c == 173) AND (($l + $tmp_shy_replacement_width) > $wmax)) { if (($c == 173) AND (($l + $tmp_shy_replacement_width) > $wmax)) {
@ -6866,6 +6908,12 @@ class TCPDF {
list($x, $y) = $this->checkPageRegions($h, $x, $y); list($x, $y) = $this->checkPageRegions($h, $x, $y);
$exurl = ''; // external streams $exurl = ''; // external streams
$imsize = FALSE; $imsize = FALSE;
// Make sure the file variable is not empty or null because accessing $file[0] later
// results in error when running PHP 7.4
if (empty($file)) {
return false;
}
// check if we are passing an image as file or string // check if we are passing an image as file or string
if ($file[0] === '@') { if ($file[0] === '@') {
// image from string // image from string
@ -6877,17 +6925,13 @@ class TCPDF {
$exurl = $file; $exurl = $file;
} }
// check if file exist and it is valid // check if file exist and it is valid
if (!@TCPDF_STATIC::file_exists($file)) { if (!@$this->fileExists($file)) {
return false; return false;
} }
if (($imsize = @getimagesize($file)) === FALSE) { if (false !== $info = $this->getImageBuffer($file)) {
if (in_array($file, $this->imagekeys)) {
// get existing image data
$info = $this->getImageBuffer($file);
$imsize = array($info['w'], $info['h']); $imsize = array($info['w'], $info['h']);
} elseif (strpos($file, '__tcpdf_'.$this->file_id.'_img') === FALSE) { } elseif (($imsize = @getimagesize($file)) === FALSE && strpos($file, '__tcpdf_'.$this->file_id.'_img') === FALSE){
$imgdata = TCPDF_STATIC::fileGetContents($file); $imgdata = $this->getCachedFileContents($file);
}
} }
} }
if (!empty($imgdata)) { if (!empty($imgdata)) {
@ -7093,7 +7137,7 @@ class TCPDF {
$svgimg = substr($file, 1); $svgimg = substr($file, 1);
} else { } else {
// get SVG file content // get SVG file content
$svgimg = TCPDF_STATIC::fileGetContents($file); $svgimg = $this->getCachedFileContents($file);
} }
if ($svgimg !== FALSE) { if ($svgimg !== FALSE) {
// get width and height // get width and height
@ -7767,14 +7811,10 @@ class TCPDF {
* @since 4.5.016 (2009-02-24) * @since 4.5.016 (2009-02-24)
*/ */
public function _destroy($destroyall=false, $preserve_objcopy=false) { public function _destroy($destroyall=false, $preserve_objcopy=false) {
// restore internal encoding
if (isset($this->internal_encoding) AND !empty($this->internal_encoding)) {
mb_internal_encoding($this->internal_encoding);
}
if (isset(self::$cleaned_ids[$this->file_id])) { if (isset(self::$cleaned_ids[$this->file_id])) {
$destroyall = false; $destroyall = false;
} }
if ($destroyall AND !$preserve_objcopy) { if ($destroyall AND !$preserve_objcopy && isset($this->file_id)) {
self::$cleaned_ids[$this->file_id] = true; self::$cleaned_ids[$this->file_id] = true;
// remove all temporary files // remove all temporary files
if ($handle = @opendir(K_PATH_CACHE)) { if ($handle = @opendir(K_PATH_CACHE)) {
@ -7787,7 +7827,7 @@ class TCPDF {
} }
if (isset($this->imagekeys)) { if (isset($this->imagekeys)) {
foreach($this->imagekeys as $file) { foreach($this->imagekeys as $file) {
if (strpos($file, K_PATH_CACHE) === 0) { if (strpos($file, K_PATH_CACHE) === 0 && TCPDF_STATIC::file_exists($file)) {
@unlink($file); @unlink($file);
} }
} }
@ -7795,7 +7835,6 @@ class TCPDF {
} }
$preserve = array( $preserve = array(
'file_id', 'file_id',
'internal_encoding',
'state', 'state',
'bufferlen', 'bufferlen',
'buffer', 'buffer',
@ -14909,7 +14948,7 @@ class TCPDF {
if ($file[0] === '@') { // image from string if ($file[0] === '@') { // image from string
$data = substr($file, 1); $data = substr($file, 1);
} else { // EPS/AI file } else { // EPS/AI file
$data = TCPDF_STATIC::fileGetContents($file); $data = $this->getCachedFileContents($file);
} }
if ($data === FALSE) { if ($data === FALSE) {
$this->Error('EPS file not found: '.$file); $this->Error('EPS file not found: '.$file);
@ -15511,7 +15550,7 @@ class TCPDF {
$this->y = $y + $vpadding + $barh; $this->y = $y + $vpadding + $barh;
$cellpadding = $this->cell_padding; $cellpadding = $this->cell_padding;
$this->SetCellPadding(0); $this->SetCellPadding(0);
$this->Cell($txtwidth, '', $label, 0, 0, 'C', false, '', $style['stretchtext'], false, 'T', 'T'); $this->Cell($txtwidth, 0, $label, 0, 0, 'C', false, '', $style['stretchtext'], false, 'T', 'T');
$this->cell_padding = $cellpadding; $this->cell_padding = $cellpadding;
} }
// restore original direction // restore original direction
@ -16328,7 +16367,7 @@ class TCPDF {
$type = array(); $type = array();
if (preg_match('/href[\s]*=[\s]*"([^"]*)"/', $link, $type) > 0) { if (preg_match('/href[\s]*=[\s]*"([^"]*)"/', $link, $type) > 0) {
// read CSS data file // read CSS data file
$cssdata = TCPDF_STATIC::fileGetContents(trim($type[1])); $cssdata = $this->getCachedFileContents(trim($type[1]));
if (($cssdata !== FALSE) AND (strlen($cssdata) > 0)) { if (($cssdata !== FALSE) AND (strlen($cssdata) > 0)) {
$css = array_merge($css, TCPDF_STATIC::extractCSSproperties($cssdata)); $css = array_merge($css, TCPDF_STATIC::extractCSSproperties($cssdata));
} }
@ -16354,7 +16393,7 @@ class TCPDF {
// create a special tag to contain the CSS array (used for table content) // create a special tag to contain the CSS array (used for table content)
$csstagarray = '<cssarray>'.htmlentities(json_encode($css)).'</cssarray>'; $csstagarray = '<cssarray>'.htmlentities(json_encode($css)).'</cssarray>';
// remove head and style blocks // remove head and style blocks
$html = preg_replace('/<head([^\>]*)>(.*?)<\/head>/siU', '', $html); $html = preg_replace('/<head([^\>]*)>(.*)?<\/head>/siU', '', $html);
$html = preg_replace('/<style([^\>]*)>([^\<]*)<\/style>/isU', '', $html); $html = preg_replace('/<style([^\>]*)>([^\<]*)<\/style>/isU', '', $html);
// define block tags // define block tags
$blocktags = array('blockquote','br','dd','dl','div','dt','h1','h2','h3','h4','h5','h6','hr','li','ol','p','pre','ul','tcpdf','table','tr','td'); $blocktags = array('blockquote','br','dd','dl','div','dt','h1','h2','h3','h4','h5','h6','hr','li','ol','p','pre','ul','tcpdf','table','tr','td');
@ -16549,7 +16588,11 @@ class TCPDF {
$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']);
} }
// store header rows on a new table // store header rows on a new table
if (($dom[$key]['value'] == 'tr') AND ($dom[($dom[$key]['parent'])]['thead'] === true)) { if (
($dom[$key]['value'] === 'tr')
&& !empty($dom[($dom[$key]['parent'])]['thead'])
&& ($dom[($dom[$key]['parent'])]['thead'] === true)
) {
if (TCPDF_STATIC::empty_string($dom[($dom[($dom[$key]['parent'])]['parent'])]['thead'])) { 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']]; $dom[($dom[($dom[$key]['parent'])]['parent'])]['thead'] = $csstagarray.$a[$dom[($dom[($dom[$key]['parent'])]['parent'])]['elkey']];
} }
@ -16979,10 +17022,20 @@ class TCPDF {
// rows on thead block are printed as a separate table // rows on thead block are printed as a separate table
} else { } else {
$dom[$key]['thead'] = false; $dom[$key]['thead'] = false;
$parent = $dom[$key]['parent'];
if (!isset($dom[$parent]['rows'])) {
$dom[$parent]['rows'] = 0;
}
// store the number of rows on table element // store the number of rows on table element
++$dom[($dom[$key]['parent'])]['rows']; ++$dom[$parent]['rows'];
if (!isset($dom[$parent]['trids'])) {
$dom[$parent]['trids'] = array();
}
// store the TR elements IDs on table element // store the TR elements IDs on table element
array_push($dom[($dom[$key]['parent'])]['trids'], $key); array_push($dom[$parent]['trids'], $key);
} }
} }
if (($dom[$key]['value'] == 'th') OR ($dom[$key]['value'] == 'td')) { if (($dom[$key]['value'] == 'th') OR ($dom[$key]['value'] == 'td')) {
@ -18865,7 +18918,18 @@ Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value:
} }
$prevlinewidth = $this->GetLineWidth(); $prevlinewidth = $this->GetLineWidth();
$this->SetLineWidth($hrHeight); $this->SetLineWidth($hrHeight);
$this->Line($x, $y, $x + $hrWidth, $y);
$lineStyle = array(
'color' => $tag['fgcolor'],
'cap' => $tag['style']['cap'],
'join' => $tag['style']['join'],
'dash' => $tag['style']['dash'],
'phase' => $tag['style']['phase'],
);
$lineStyle = array_filter($lineStyle);
$this->Line($x, $y, $x + $hrWidth, $y, $lineStyle);
$this->SetLineWidth($prevlinewidth); $this->SetLineWidth($prevlinewidth);
$this->addHTMLVertSpace(max($hbc, ($hrHeight / 2)), 0, $cell, !isset($dom[($key + 1)])); $this->addHTMLVertSpace(max($hbc, ($hrHeight / 2)), 0, $cell, !isset($dom[($key + 1)]));
break; break;
@ -18885,6 +18949,10 @@ Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value:
// data stream // data stream
$imgsrc = '@'.base64_decode(substr($imgsrc, 1)); $imgsrc = '@'.base64_decode(substr($imgsrc, 1));
$type = ''; $type = '';
} elseif ( $this->allowLocalFiles && substr($imgsrc, 0, 7) === 'file://') {
// get image type from a local file path
$imgsrc = substr($imgsrc, 7);
$type = TCPDF_IMAGES::getImageFileType($imgsrc);
} else { } else {
if (($imgsrc[0] === '/') AND !empty($_SERVER['DOCUMENT_ROOT']) AND ($_SERVER['DOCUMENT_ROOT'] != '/')) { if (($imgsrc[0] === '/') AND !empty($_SERVER['DOCUMENT_ROOT']) AND ($_SERVER['DOCUMENT_ROOT'] != '/')) {
// fix image path // fix image path
@ -19807,7 +19875,7 @@ Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value:
} }
} }
if (!$in_table_head) { // we are not inside a thead section if (!$in_table_head) { // we are not inside a thead section
$this->cell_padding = $table_el['old_cell_padding']; $this->cell_padding = isset($table_el['old_cell_padding']) ? $table_el['old_cell_padding'] : null;
// reset row height // reset row height
$this->resetLastH(); $this->resetLastH();
if (($this->page == ($this->numpages - 1)) AND ($this->pageopen[$this->numpages])) { if (($this->page == ($this->numpages - 1)) AND ($this->pageopen[$this->numpages])) {
@ -21717,6 +21785,8 @@ Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value:
public function commitTransaction() { public function commitTransaction() {
if (isset($this->objcopy)) { if (isset($this->objcopy)) {
$this->objcopy->_destroy(true, true); $this->objcopy->_destroy(true, true);
/* The unique file_id should not be used during cleanup again */
$this->objcopy->file_id = NULL;
unset($this->objcopy); unset($this->objcopy);
} }
} }
@ -21730,14 +21800,22 @@ Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value:
*/ */
public function rollbackTransaction($self=false) { public function rollbackTransaction($self=false) {
if (isset($this->objcopy)) { if (isset($this->objcopy)) {
$objcopy = $this->objcopy;
$this->_destroy(true, true); $this->_destroy(true, true);
if ($self) { if ($self) {
$objvars = get_object_vars($this->objcopy); $objvars = get_object_vars($objcopy);
foreach ($objvars as $key => $value) { foreach ($objvars as $key => $value) {
$this->$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;
} }
return $this->objcopy; /* The unique file_id should not be used during cleanup again */
$this->file_id = NULL;
return $objcopy;
} }
return $this; return $this;
} }
@ -22776,7 +22854,7 @@ Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value:
$svgdata = substr($file, 1); $svgdata = substr($file, 1);
} else { // SVG file } else { // SVG file
$this->svgdir = dirname($file); $this->svgdir = dirname($file);
$svgdata = TCPDF_STATIC::fileGetContents($file); $svgdata = $this->getCachedFileContents($file);
} }
if ($svgdata === FALSE) { if ($svgdata === FALSE) {
$this->Error('SVG file not found: '.$file); $this->Error('SVG file not found: '.$file);
@ -22986,22 +23064,26 @@ Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value:
$f = ($this->h - $oy) * $this->k * (1 - $svgscale_y); $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->_out(sprintf('%F %F %F %F %F %F cm', $svgscale_x, 0, 0, $svgscale_y, ($e + $svgoffset_x), ($f + $svgoffset_y)));
// creates a new XML parser to be used by the other XML functions // creates a new XML parser to be used by the other XML functions
$this->parser = xml_parser_create('UTF-8'); $parser = xml_parser_create('UTF-8');
// the following function allows to use parser inside object // the following function allows to use parser inside object
xml_set_object($this->parser, $this); xml_set_object($parser, $this);
// disable case-folding for this XML parser // disable case-folding for this XML parser
xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0); xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
// sets the element handler functions for the XML parser // sets the element handler functions for the XML parser
xml_set_element_handler($this->parser, 'startSVGElementHandler', 'endSVGElementHandler'); xml_set_element_handler($parser, 'startSVGElementHandler', 'endSVGElementHandler');
// sets the character data handler function for the XML parser // sets the character data handler function for the XML parser
xml_set_character_data_handler($this->parser, 'segSVGContentHandler'); xml_set_character_data_handler($parser, 'segSVGContentHandler');
// start parsing an XML document // start parsing an XML document
if (!xml_parse($this->parser, $svgdata)) { if (!xml_parse($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)); $error_message = sprintf('SVG Error: %s at line %d', xml_error_string(xml_get_error_code($parser)), xml_get_current_line_number($parser));
$this->Error($error_message); $this->Error($error_message);
} }
// free this XML parser // free this XML parser
xml_parser_free($this->parser); xml_parser_free($parser);
// >= PHP 7.0.0 "explicitly unset the reference to parser to avoid memory leaks"
unset($parser);
// restore previous graphic state // restore previous graphic state
$this->_out($this->epsmarker.'Q'); $this->_out($this->epsmarker.'Q');
// restore graphic vars // restore graphic vars
@ -23418,6 +23500,7 @@ Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value:
} }
$paths = array(); $paths = array();
$d = preg_replace('/([0-9ACHLMQSTVZ])([\-\+])/si', '\\1 \\2', $d); $d = preg_replace('/([0-9ACHLMQSTVZ])([\-\+])/si', '\\1 \\2', $d);
$d = preg_replace('/(\.[0-9]+)(\.)/s', '\\1 \\2', $d);
preg_match_all('/([ACHLMQSTVZ])[\s]*([^ACHLMQSTVZ\"]*)/si', $d, $paths, PREG_SET_ORDER); preg_match_all('/([ACHLMQSTVZ])[\s]*([^ACHLMQSTVZ\"]*)/si', $d, $paths, PREG_SET_ORDER);
$x = 0; $x = 0;
$y = 0; $y = 0;
@ -24571,6 +24654,33 @@ Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value:
// --- END SVG METHODS ----------------------------------------------------- // --- END SVG METHODS -----------------------------------------------------
/**
* Keeps files in memory, so it doesn't need to downloaded everytime in a loop
* @param string $file
* @return string
*/
protected function getCachedFileContents($file)
{
if (!isset($this->fileContentCache[$file])) {
$this->fileContentCache[$file] = TCPDF_STATIC::fileGetContents($file);
}
return $this->fileContentCache[$file];
}
/**
* Avoid multiple calls to an external server to see if a file exists
* @param string $file
* @return bool
*/
protected function fileExists($file)
{
if (isset($this->fileContentCache[$file]) || false !== $this->getImageBuffer($file)) {
return true;
}
return TCPDF_STATIC::file_exists($file);
}
} // END OF TCPDF CLASS } // END OF TCPDF CLASS
//============================================================+ //============================================================+

View File

@ -8,7 +8,7 @@
<license>http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL</license> <license>http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL</license>
<authorEmail>info@tecnick.com</authorEmail> <authorEmail>info@tecnick.com</authorEmail>
<authorUrl>www.tecnick.com</authorUrl> <authorUrl>www.tecnick.com</authorUrl>
<version>6.3.5</version> <version>6.4.1</version>
<description>This is a PHP class for generating PDF documents without requiring external extensions.</description> <description>This is a PHP class for generating PDF documents without requiring external extensions.</description>
<files> <files>

View File

@ -938,7 +938,7 @@ class TCPDFBarcode {
} else { } else {
$t = false; // space $t = false; // space
} }
$w = $seq[$j]; $w = (float)$seq[$j];
$bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0); $bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0);
$bararray['maxw'] += $w; $bararray['maxw'] += $w;
++$k; ++$k;
@ -1271,7 +1271,7 @@ class TCPDFBarcode {
} else { } else {
$t = false; // space $t = false; // space
} }
$w = $seq[$j]; $w = (float)$seq[$j];
$bararray['bcode'][] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0); $bararray['bcode'][] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0);
$bararray['maxw'] += $w; $bararray['maxw'] += $w;
} }
@ -1856,7 +1856,7 @@ class TCPDFBarcode {
} else { } else {
$t = false; // space $t = false; // space
} }
$w = $seq[$j]; $w = (float)$seq[$j];
$bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0); $bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0);
$bararray['maxw'] += $w; $bararray['maxw'] += $w;
++$k; ++$k;
@ -1947,7 +1947,7 @@ class TCPDFBarcode {
} else { } else {
$t = false; // space $t = false; // space
} }
$w = $seq[$j]; $w = (float)$seq[$j];
$bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0); $bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0);
$bararray['maxw'] += $w; $bararray['maxw'] += $w;
++$k; ++$k;

View File

@ -47,5 +47,21 @@
<maintainerurl>https://github.com/llewellynvdm</maintainerurl> <maintainerurl>https://github.com/llewellynvdm</maintainerurl>
<targetplatform name="joomla" version="3.*"/> <targetplatform name="joomla" version="3.*"/>
</update> </update>
<update>
<name>TCPDF</name>
<description>This is a PHP class for generating PDF documents without requiring external extensions.</description>
<element>tcpdf</element>
<type>library</type>
<client>site</client>
<folder></folder>
<version>6.4.1</version>
<infourl title="TCPDF for Joomla!">https://github.com/vdm-io/tcpdf</infourl>
<downloads>
<downloadurl type="full" format="zip">https://github.com/vdm-io/tcpdf/archive/v6.4.1.zip</downloadurl>
</downloads>
<maintainer>Llewellyn van der Merwe</maintainer>
<maintainerurl>https://github.com/llewellynvdm</maintainerurl>
<targetplatform name="joomla" version="3.*"/>
</update>
</updates> </updates>