From 5c8bddfa69be40aec70ec496f13b271042b3b796 Mon Sep 17 00:00:00 2001 From: nicolaasuni Date: Fri, 23 Mar 2012 17:04:30 +0000 Subject: [PATCH] 5.9.152 --- CHANGELOG.TXT | 9 ++ README.TXT | 4 +- tcpdf.php | 380 ++++++++++++++++++++++++++++++++++++++++++-------- 3 files changed, 330 insertions(+), 63 deletions(-) diff --git a/CHANGELOG.TXT b/CHANGELOG.TXT index 8d2c83c..fbbaf14 100755 --- a/CHANGELOG.TXT +++ b/CHANGELOG.TXT @@ -1,3 +1,12 @@ +5.9.152 (2012-03-23) + - The following overprint methods were added: setOverprint(), getOverprint(). + - Signature of setAlpha() method was changed and method getAlpha() was added. + - stroke-opacity support was added on SVG. + - The following date methods were added: setDocCreationTimestamp(), setDocModificationTimestamp(), getDocCreationTimestamp(), getDocModificationTimestamp(), getFormattedDate(), getTimestamp(). + - Signature of _datestring() method was changed. + - Method getFontBBox() was added. + - Method setPageBoxTypes() was aded. + 5.9.151 (2012-03-22) - Bug item #3509889 "Transform() distorts PDF" was fixed. - Precision of real number were extended. diff --git a/README.TXT b/README.TXT index 68b47d5..9b7c70c 100755 --- a/README.TXT +++ b/README.TXT @@ -8,8 +8,8 @@ http://sourceforge.net/donate/index.php?group_id=128076 ------------------------------------------------------------ Name: TCPDF -Version: 5.9.151 -Release date: 2012-03-22 +Version: 5.9.152 +Release date: 2012-03-23 Author: Nicola Asuni Copyright (c) 2002-2012: diff --git a/tcpdf.php b/tcpdf.php index fd0aa71..bef3acf 100755 --- a/tcpdf.php +++ b/tcpdf.php @@ -1,9 +1,9 @@ * @package com.tecnick.tcpdf * @author Nicola Asuni - * @version 5.9.151 + * @version 5.9.152 */ // Main configuration file. Define the K_TCPDF_EXTERNAL_CONFIG constant to skip this file. @@ -149,7 +149,7 @@ require_once(dirname(__FILE__).'/config/tcpdf_config.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.
* @package com.tecnick.tcpdf * @brief PHP class for generating PDF documents without requiring external extensions. - * @version 5.9.151 + * @version 5.9.152 * @author Nicola Asuni - info@tecnick.com */ class TCPDF { @@ -160,7 +160,7 @@ class TCPDF { * Current TCPDF version. * @private */ - private $tcpdf_version = '5.9.151'; + private $tcpdf_version = '5.9.152'; // Protected properties @@ -1816,11 +1816,18 @@ class TCPDF { protected $pdfa_mode = false; /** - * Document creation date + * Document creation date-time * @protected - * @since 5.9.121 (2011-09-28) + * @since 5.9.152 (2012-03-22) */ - protected $doc_date; + protected $doc_creation_timestamp; + + /** + * Document modification date-time + * @protected + * @since 5.9.152 (2012-03-22) + */ + protected $doc_modification_timestamp; /** * Custom XMP data. @@ -1829,6 +1836,43 @@ class TCPDF { */ protected $custom_xmp = ''; + /** + * Overprint mode array. + * (Check the "Entries in a Graphics State Parameter Dictionary" on PDF 32000-1:2008). + * @protected + * @since 5.9.152 (2012-03-23) + */ + protected $overprint = array('OP' => false, 'op' => false, 'OPM' => 0); + + /** + * Alpha mode array. + * (Check the "Entries in a Graphics State Parameter Dictionary" on PDF 32000-1:2008). + * @protected + * @since 5.9.152 (2012-03-23) + */ + protected $alpha = array('CA' => 1, 'ca' => 1, 'BM' => '/Normal', 'AIS' => false); + + /** + * Define the page boundaries boxes to be set on document. + * @protected + * @since 5.9.152 (2012-03-23) + */ + protected $page_boxes = array('MediaBox', 'CropBox', 'BleedBox', 'TrimBox', 'ArtBox'); + + /** + * Set the document producer metadata. + * @protected + * @since 5.9.152 (2012-03-23) + */ + protected $pdfproducer; + + /** + * If true print TCPDF meta link. + * @protected + * @since 5.9.152 (2012-03-23) + */ + protected $tcpdflink = true; + //------------------------------------------------------------ // METHODS //------------------------------------------------------------ @@ -1953,6 +1997,8 @@ class TCPDF { $this->SetCompression(); // set default PDF version number $this->setPDFVersion(); + $this->pdfproducer = "\x54\x43\x50\x44\x46\x20".$this->tcpdf_version."\x20\x28\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x74\x63\x70\x64\x66\x2e\x6f\x72\x67\x29"; + $this->tcpdflink = true; $this->encoding = $encoding; $this->HREF = array(); $this->getFontsList(); @@ -1992,8 +2038,9 @@ class TCPDF { $this->default_form_prop = array('lineWidth'=>1, 'borderStyle'=>'solid', 'fillColor'=>array(255, 255, 255), 'strokeColor'=>array(128, 128, 128)); // set file ID for trailer $this->file_id = md5($this->getRandomSeed('TCPDF'.$orientation.$unit.$format.$encoding)); - // set document date - $this->doc_date = substr_replace(date('YmdHisO'), '\'', (0 - 2), 0).'\''; + // set document creation and modification timestamp + $this->doc_creation_timestamp = time(); + $this->doc_modification_timestamp = $this->doc_creation_timestamp; // get default graphic vars $this->default_graphic_vars = $this->getGraphicVars(); $this->header_xobj_autoreset = false; @@ -3742,24 +3789,26 @@ class TCPDF { $this->AddPage(); } $this->endLayer(); - // save current graphic settings - $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->_out('q'); - $font = defined('PDF_FONT_NAME_MAIN')?PDF_FONT_NAME_MAIN:'helvetica'; - $this->SetFont($font, '', 1); - $this->setTextRenderingMode(0, false, false); - $msg = "\x50\x6f\x77\x65\x72\x65\x64\x20\x62\x79\x20\x54\x43\x50\x44\x46\x20\x28\x77\x77\x77\x2e\x74\x63\x70\x64\x66\x2e\x6f\x72\x67\x29"; - $lnk = "\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x74\x63\x70\x64\x66\x2e\x6f\x72\x67"; - $this->Cell(0, 0, $msg, 0, 0, 'L', 0, $lnk, 0, false, 'D', 'B'); - $this->_out('Q'); - // restore graphic settings - $this->setGraphicVars($gvars); + if ($this->tcpdflink) { + // save current graphic settings + $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->_out('q'); + $font = defined('PDF_FONT_NAME_MAIN')?PDF_FONT_NAME_MAIN:'helvetica'; + $this->SetFont($font, '', 1); + $this->setTextRenderingMode(0, false, false); + $msg = "\x50\x6f\x77\x65\x72\x65\x64\x20\x62\x79\x20\x54\x43\x50\x44\x46\x20\x28\x77\x77\x77\x2e\x74\x63\x70\x64\x66\x2e\x6f\x72\x67\x29"; + $lnk = "\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x74\x63\x70\x64\x66\x2e\x6f\x72\x67"; + $this->Cell(0, 0, $msg, 0, 0, 'L', 0, $lnk, 0, false, 'D', 'B'); + $this->_out('Q'); + // restore graphic settings + $this->setGraphicVars($gvars); + } // close page $this->endPage(); // close document @@ -5232,9 +5281,12 @@ class TCPDF { */ public function SetFont($family, $style='', $size=0, $fontfile='', $subset='default', $out=true) { //Select a font; size given in points - if ($size == 0) { + if ($size === null) { $size = $this->FontSizePt; } + if ($size < 0) { + $size = 0; + } // try to add font (if not already added) $fontdata = $this->AddFont($family, $style, $fontfile, $subset); $this->FontFamily = $fontdata['family']; @@ -5285,6 +5337,47 @@ class TCPDF { } } + /** + * Returns the bounding box of the current font in user units. + * @return array + * @public + * @since 5.9.152 (2012-03-23) + */ + public function getFontBBox() { + $result = array(); + if (isset($this->CurrentFont['desc']['FontBBox'])) { + $bbox = explode(' ', substr($this->CurrentFont['desc']['FontBBox'], 1, -1)); + foreach ($bbox as $v) { + $result[] = (intval($v) * $this->FontSize / 1000); + } + } else { + // Find max width + if (isset($this->CurrentFont['desc']['MaxWidth'])) { + $maxw = (intval($this->CurrentFont['desc']['MaxWidth']) * $this->FontSize / 1000); + } 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 = ($maxw * $this->FontSize / 1000); + } + $result = array(0, -$this->FontDescent, $maxw, $this->FontAscent); + } + return $result; + } + /** * Return the font descent value * @param $font (string) font name @@ -8842,6 +8935,21 @@ class TCPDF { return $page; } + /** + * Set page boxes to be included on page descriptions. + * @param $boxes (array) Array of page boxes to set on document: ('MediaBox', 'CropBox', 'BleedBox', 'TrimBox', 'ArtBox'). + * @protected + */ + protected function setPageBoxTypes($boxes) { + $validboxes = array('MediaBox', 'CropBox', 'BleedBox', 'TrimBox', 'ArtBox'); + $this->page_boxes = array(); + foreach ($boxes as $box) { + if (in_array($box, $validboxes)) { + $this->page_boxes[] = $box; + } + } + } + /** * Output pages (and replace page number aliases). * @protected @@ -8904,22 +9012,21 @@ class TCPDF { $out = '<<'; $out .= ' /Type /Page'; $out .= ' /Parent 1 0 R'; - $out .= ' /LastModified '.$this->_datestring(); + $out .= ' /LastModified '.$this->_datestring(0, $this->doc_modification_timestamp); $out .= ' /Resources 2 0 R'; - $boxes = array('MediaBox', 'CropBox', 'BleedBox', 'TrimBox', 'ArtBox'); - foreach ($boxes as $box) { + 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 ($boxes as $box) { + 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 .= sprintf(' %F %F %F', ($color[0] / 255), ($color[1] / 255), ($color[2] / 255)); $out .= ' ]'; } if (isset($this->pagedim[$n]['BoxColorInfo'][$box]['W'])) { @@ -9129,7 +9236,7 @@ class TCPDF { $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); + $annots .= ' /M '.$this->_datestring($annot_obj_id, $this->doc_modification_timestamp); if (isset($pl['opt']['f'])) { $fval = 0; if (is_array($pl['opt']['f'])) { @@ -9287,7 +9394,7 @@ class TCPDF { if (isset($pl['opt']['rc'])) { $annots .= ' /RC '.$this->_textstring($pl['opt']['rc'], $annot_obj_id); } - $annots .= ' /CreationDate '.$this->_datestring($annot_obj_id); + $annots .= ' /CreationDate '.$this->_datestring($annot_obj_id, $this->doc_creation_timestamp); //$annots .= ' /IRT '; if (isset($pl['opt']['subj'])) { $annots .= ' /Subj '.$this->_textstring($pl['opt']['subj'], $annot_obj_id); @@ -12217,11 +12324,11 @@ class TCPDF { // restore previous isunicode value $this->isunicode = $prev_isunicode; // default producer - $out .= ' /Producer '.$this->_textstring("\x54\x43\x50\x44\x46\x20".$this->tcpdf_version."\x20\x28\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x74\x63\x70\x64\x66\x2e\x6f\x72\x67\x29", $oid); + $out .= ' /Producer '.$this->_textstring($this->pdfproducer, $oid); // The date and time the document was created, in human-readable form - $out .= ' /CreationDate '.$this->_datestring(); + $out .= ' /CreationDate '.$this->_datestring(0, $this->doc_creation_timestamp); // The date and time the document was most recently modified, in human-readable form - $out .= ' /ModDate '.$this->_datestring(); + $out .= ' /ModDate '.$this->_datestring(0, $this->doc_modification_timestamp); // A name object indicating whether the document has been modified to include trapping information $out .= ' /Trapped /False'; $out .= ' >>'; @@ -12281,20 +12388,27 @@ class TCPDF { $xmp .= "\t\t\t\t".''."\n"; $xmp .= "\t\t\t".''."\n"; $xmp .= "\t\t".''."\n"; - // convert date format - $docdate = substr($this->doc_date, 0, 4).'-'.substr($this->doc_date, 4, 2).'-'.substr($this->doc_date, 6, 2); - $docdate .= 'T'.substr($this->doc_date, 8, 2).':'.substr($this->doc_date, 10, 2).':'.substr($this->doc_date, 12, 2); - $docdate .= '+'.substr($this->doc_date, 15, 2).':'.substr($this->doc_date, 18, 2); - $docdate = $this->_escapeXML($docdate); + // convert doc creation date format + $dcdate = $this->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, 15, 2).':'.substr($dcdate, 18, 2); + $doccreationdate = $this->_escapeXML($doccreationdate); + // convert doc modification date format + $dmdate = $this->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, 15, 2).':'.substr($dmdate, 18, 2); + $docmoddate = $this->_escapeXML($docmoddate); $xmp .= "\t\t".''."\n"; - $xmp .= "\t\t\t".''.$docdate.''."\n"; + $xmp .= "\t\t\t".''.$doccreationdate.''."\n"; $xmp .= "\t\t\t".''.$this->creator.''."\n"; - $xmp .= "\t\t\t".''.$docdate.''."\n"; - $xmp .= "\t\t\t".''.$docdate.''."\n"; + $xmp .= "\t\t\t".''.$docmoddate.''."\n"; + $xmp .= "\t\t\t".''.$doccreationdate.''."\n"; $xmp .= "\t\t".''."\n"; $xmp .= "\t\t".''."\n"; $xmp .= "\t\t\t".''.$this->_escapeXML($this->keywords).' TCPDF'."\n"; - $xmp .= "\t\t\t".''.$this->_escapeXML("\x54\x43\x50\x44\x46\x20".$this->tcpdf_version."\x20\x28\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x74\x63\x70\x64\x66\x2e\x6f\x72\x67\x29").''."\n"; + $xmp .= "\t\t\t".''.$this->_escapeXML($this->pdfproducer).''."\n"; $xmp .= "\t\t".''."\n"; $xmp .= "\t\t".''."\n"; $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); @@ -12914,15 +13028,91 @@ class TCPDF { return '('. $this->_escape($s).')'; } + /** + * Set the document creation timestamp + * @param $time (mixed) Document creation timestamp in seconds or date-time string. + * @public + * @since 5.9.152 (2012-03-23) + */ + public function setDocCreationTimestamp($time) { + if (is_string($time)) { + $time = getTimestamp($time); + } + $this->doc_creation_timestamp = intval($time); + } + + /** + * Set the document modification timestamp + * @param $time (mixed) Document modification timestamp in seconds or date-time string. + * @public + * @since 5.9.152 (2012-03-23) + */ + public function setDocModificationTimestamp($time) { + if (is_string($time)) { + $time = getTimestamp($time); + } + $this->doc_modification_timestamp = intval($time); + } + + /** + * Returns document creation timestamp in seconds. + * @return (int) Creation timestamp in seconds. + * @public + * @since 5.9.152 (2012-03-23) + */ + public function getDocCreationTimestamp() { + return $this->doc_creation_timestamp; + } + + /** + * Returns document modification timestamp in seconds. + * @return (int) Modfication timestamp in seconds. + * @public + * @since 5.9.152 (2012-03-23) + */ + public function getDocModificationTimestamp() { + return $this->doc_modification_timestamp; + } + + /** + * Returns timestamp in seconds from formatted date-time. + * @param $date (string) Formatted date-time. + * @return int seconds. + * @public + * @since 5.9.152 (2012-03-23) + */ + public function getTimestamp($date) { + if (($date[0] == 'D') AND ($date[1] == ':')) { + // remove date prefix if present + $date = substr($date, 2); + } + return strtotime($date); + } + + /** + * Returns a formatted date-time. + * @param $time (int) Time in seconds. + * @return string escaped date string. + * @public + * @since 5.9.152 (2012-03-23) + */ + public function getFormattedDate($time) { + return substr_replace(date('YmdHisO', intval($time)), '\'', (0 - 2), 0).'\''; + } + /** * Returns a formatted date for meta information - * @param $n (int) object ID + * @param $n (int) Object ID. + * @param $timestamp (int) Timestamp to convert. * @return string escaped date string. * @protected * @since 4.6.028 (2009-08-25) */ - protected function _datestring($n=0) { - return $this->_datastring('D:'.$this->doc_date, $n); + protected function _datestring($n=0, $timestamp=0) { + if ((empty($timestamp)) OR ($timestamp < 0)) { + $timestamp = $this->doc_creation_timestamp; + } + return $this->_datastring('D:'.$this->getFormattedDate($timestamp), $n); } /** @@ -17608,7 +17798,7 @@ class TCPDF { if (isset($this->signature_data['info']['ContactInfo']) AND !$this->empty_string($this->signature_data['info']['ContactInfo'])) { $out .= ' /ContactInfo '.$this->_textstring($this->signature_data['info']['ContactInfo'], $sigobjid); } - $out .= ' /M '.$this->_datestring($sigobjid); + $out .= ' /M '.$this->_datestring($sigobjid, $this->doc_modification_timestamp); $out .= ' >>'; $out .= "\n".'endobj'; $this->_out($out); @@ -18063,16 +18253,16 @@ class TCPDF { * @since 3.0.000 (2008-03-27) */ protected function _putextgstates() { - if ($this->pdfa_mode) { - // transparencies are not allowed in PDF/A mode - return; - } 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; } @@ -18082,22 +18272,87 @@ class TCPDF { } } + /** + * Set overprint mode for stroking (OP) and non-stroking (op) painting operations. + * (Check the "Entries in a Graphics State Parameter Dictionary" on PDF 32000-1:2008). + * @param $stroking (boolean) If true apply overprint for stroking operations. + * @param $nonstroking (boolean) If true apply overprint for painting operations other than stroking. + * @param $mode (integer) Overprint mode: (0 = each source colour component value replaces the value previously painted for the corresponding device colorant; 1 = a tint value of 0.0 for a source colour component shall leave the corresponding component of the previously painted colour unchanged). + * @public + * @since 5.9.152 (2012-03-23) + */ + public function setOverprint($stroking=true, $nonstroking='', $mode=0) { + $stroking = $stroking ? true : false; + if ($this->empty_string($nonstroking)) { + // default value if not set + $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); + } + + /** + * Get the overprint mode array (OP, op, OPM). + * (Check the "Entries in a Graphics State Parameter Dictionary" on PDF 32000-1:2008). + * @return array. + * @public + * @since 5.9.152 (2012-03-23) + */ + public function getOverprint() { + return $this->overprint; + } + /** * Set alpha for stroking (CA) and non-stroking (ca) operations. - * @param $alpha (float) real value from 0 (transparent) to 1 (opaque) + * @param $stroking (float) Alpha value for stroking operations: real value from 0 (transparent) to 1 (opaque). * @param $bm (string) blend mode, one of the following: Normal, Multiply, Screen, Overlay, Darken, Lighten, ColorDodge, ColorBurn, HardLight, SoftLight, Difference, Exclusion, Hue, Saturation, Color, Luminosity + * @param $nonstroking (float) Alpha value for non-stroking operations: real value from 0 (transparent) to 1 (opaque). + * @param $ais (boolean) * @public * @since 3.0.000 (2008-03-27) */ - public function setAlpha($alpha, $bm='Normal') { + public function setAlpha($stroking=1, $bm='Normal', $nonstroking='', $ais=false) { if ($this->pdfa_mode) { // transparency is not allowed in PDF/A mode return; } - $gs = $this->addExtGState(array('ca' => $alpha, 'CA' => $alpha, 'BM' => '/'.$bm, 'AIS' => 'false')); + $stroking = floatval($stroking); + if ($this->empty_string($nonstroking)) { + // default value if not set + $nonstroking = $stroking; + } else { + $nonstroking = floatval($nonstroking); + } + if ($bm[0] == '/') { + // remove trailing slash + $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); } + /** + * Get the alpha mode array (CA, ca, BM, AIS). + * (Check the "Entries in a Graphics State Parameter Dictionary" on PDF 32000-1:2008). + * @return array. + * @public + * @since 5.9.152 (2012-03-23) + */ + public function getAlpha() { + return $this->alpha; + } + /** * Set the default JPEG compression quality (1-100) * @param $quality (int) JPEG quality, integer between 1 and 100 @@ -27638,7 +27893,7 @@ Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value: } // opacity if ($svgstyle['opacity'] != 1) { - $this->SetAlpha($svgstyle['opacity']); + $this->setAlpha($svgstyle['opacity'], 'Normal', $svgstyle['opacity'], false); } // color $fill_color = $this->convertHTMLColorToDec($svgstyle['color']); @@ -27769,7 +28024,7 @@ Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value: } elseif ($svgstyle['fill'] != 'none') { $fill_color = $this->convertHTMLColorToDec($svgstyle['fill']); if ($svgstyle['fill-opacity'] != 1) { - $this->SetAlpha($svgstyle['fill-opacity']); + $this->setAlpha($this->alpha['CA'], 'Normal', $svgstyle['fill-opacity'], false); } $this->SetFillColorArray($fill_color); if ($svgstyle['fill-rule'] == 'evenodd') { @@ -27780,6 +28035,9 @@ Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value: } // stroke if ($svgstyle['stroke'] != 'none') { + if ($svgstyle['stroke-opacity'] != 1) { + $this->setAlpha($svgstyle['stroke-opacity'], 'Normal', $this->alpha['ca'], false); + } $stroke_style = array( 'color' => $this->convertHTMLColorToDec($svgstyle['stroke']), 'width' => $this->getHTMLUnitToUnits($svgstyle['stroke-width'], 0, $this->svgunit, false),