[0005498] Items/Fixed Assets: Fixed item image adding/update.
[fa-stable.git] / reporting / includes / tcpdf.php
index ba54e66a3ea08b8a96f70a25d25fb50be43c1516..0d3d210844778657df5a846ceb3617f2b86d11b6 100644 (file)
   *    and
   *    if (!defined("K_RE_PATTERN_ARABIC"))
   * 4. Parameter $unicode in constructor renamed to $uni.
-  * 4. Header function renamed to Header1 (due to conflict with FrontReport Header)
+  * 5. Header function renamed to Header1 (due to conflict with FrontReport Header)
+  * 6. Line 6190, SetLineWidth (cast of values to avoid problem in PHP 5.2.6
+  * 7. Line 6261. ereg replaced by preg_match (with start and end delimiter)
+  * 8. Lines 8642,9256 and 9348. split replaced by preg_split.
   * -------------------------------------------------------------------------------
   */
 if (!defined("K_PATH_FONTS"))
-       define ("K_PATH_FONTS", '../reporting/fonts/');
-define ("K_PATH_CACHE", '../reporting/fonts/');
+       define ("K_PATH_FONTS", dirname(__FILE__)."/../fonts/");
+define ("K_PATH_CACHE", dirname(__FILE__)."/../fonts/");
 define("K_CELL_HEIGHT_RATIO", 1.25);
 
 //require_once(dirname(__FILE__).'/config/tcpdf_config.php');
@@ -174,6 +177,17 @@ require_once(dirname(__FILE__)."/barcodes.php");
  */
 require_once(dirname(__FILE__)."/html_entity_decode_php4.php");
 
+//
+// Check image file format against specific TCPDF engine requirements.
+//
+function check_image_file($filename)
+{
+       $test = new TCPDF();
+       if ( !$test->Image($filename, 0, 0) )
+               return _('Unsupported image file format.');
+       return '';
+}
+
 if (!class_exists('TCPDF')) {
        /**
         * define default PDF document producer
@@ -610,7 +624,7 @@ if (!class_exists('TCPDF')) {
                 * @var Header font.
                 * @access protected
                 */
-               var $header_font;
+               var $header_font = array('helvetica', '', 12);
 
                /**
                 * @var Footer font.
@@ -1109,7 +1123,7 @@ if (!class_exists('TCPDF')) {
                 * @param boolean $unicode TRUE means that the input text is unicode (default = true)
                 * @param String $encoding charset encoding; default is UTF-8
                 */
-               function TCPDF($orientation='P', $unit='mm', $format='A4', $uni=true, $encoding="UTF-8") {
+               function __construct($orientation='P', $unit='mm', $format='A4', $uni=true, $encoding="UTF-8") {
                        if ($uni) // Fix for FrontAccounting
                        {
                                global $unicode, $unicode_mirror, $unicode_arlet, $laa_array, $diacritics;
@@ -1121,7 +1135,8 @@ if (!class_exists('TCPDF')) {
                                mb_internal_encoding("ASCII");
                        }
                        // set language direction
-                       $this->rtl = $this->l['a_meta_dir']=='rtl' ? true : false;
+
+                       $this->rtl = @$this->l['a_meta_dir']=='rtl' ? true : false;
                        $this->tmprtl = false;
                        //Some checks
                        $this->_dochecks();
@@ -3517,6 +3532,8 @@ if (!class_exists('TCPDF')) {
                function unichr($c) {
                        if (!$this->isunicode) {
                                return chr($c);
+                       } elseif ($c == '') {
+                               return '';
                        } elseif ($c <= 0x7F) {
                                // one byte
                                return chr($c);
@@ -3594,8 +3611,8 @@ if (!class_exists('TCPDF')) {
                                if ($type == "jpg") {
                                        $type = "jpeg";
                                }
-                               $mqr = get_magic_quotes_runtime();
-                               set_magic_quotes_runtime(0);
+                               $mqr = ini_get('magic_quotes_runtime');
+                               ini_set('magic_quotes_runtime', 0);
                                // Specific image handlers
                                $mtd = '_parse'.$type;
                                // GD image handler function
@@ -3622,7 +3639,7 @@ if (!class_exists('TCPDF')) {
                                        //If false, we cannot process image
                                        return;
                                }
-                               set_magic_quotes_runtime($mqr);
+                               ini_set('magic_quotes_runtime', $mqr);
                                $info['i'] = count($this->images) + 1;
                                // add image to document
                                $this->images[$file] = $info;
@@ -3701,6 +3718,7 @@ if (!class_exists('TCPDF')) {
                                }
                        }
                        $this->endlinex = $this->img_rb_x;
+                       return $info;
                }
 
                /**
@@ -4502,8 +4520,8 @@ if (!class_exists('TCPDF')) {
                                $this->_out('<</Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences ['.$diff.']>>');
                                $this->_out('endobj');
                        }
-                       $mqr = get_magic_quotes_runtime();
-                       set_magic_quotes_runtime(0);
+                       $mqr = ini_get('magic_quotes_runtime');
+                       ini_set('magic_quotes_runtime', 0);
                        foreach($this->FontFiles as $file => $info) {
                                //Font file embedding
                                $this->_newobj();
@@ -4511,12 +4529,12 @@ if (!class_exists('TCPDF')) {
                                $font = file_get_contents($this->_getfontpath().strtolower($file));
                                $compressed = (substr($file,-2)=='.z');
                                if ((!$compressed) AND (isset($info['length2']))) {
-                                       $header = (ord($font{0}) == 128);
+                                       $header = (ord($font[0]) == 128);
                                        if ($header) {
                                                //Strip first binary header
                                                $font = substr($font,6);
                                        }
-                                       if ($header AND (ord($font{$info['length1']}) == 128)) {
+                                       if ($header AND (ord($font[$info['length1']]) == 128)) {
                                                //Strip second binary header
                                                $font = substr($font, 0, $info['length1']).substr($font, $info['length1']+6);
                                        }
@@ -4533,7 +4551,7 @@ if (!class_exists('TCPDF')) {
                                $this->_putstream($font);
                                $this->_out('endobj');
                        }
-                       set_magic_quotes_runtime($mqr);
+                       ini_set('magic_quotes_runtime', $mqr);
                        foreach($this->fonts as $k => $font) {
                                //Font objects
                                $this->fonts[$k]['n'] = $this->n + 1;
@@ -4687,7 +4705,7 @@ if (!class_exists('TCPDF')) {
                function _putimages() {
                        $filter = ($this->compress) ? '/Filter /FlateDecode ' : '';
                        reset($this->images);
-                       while (list($file, $info) = each($this->images)) {
+                       foreach ($this->images as $file => $info) {
                                $this->_newobj();
                                $this->images[$file]['n'] = $this->n;
                                $this->_out('<</Type /XObject');
@@ -5392,7 +5410,7 @@ if (!class_exists('TCPDF')) {
                                $strarr = array();
                                $strlen = strlen($str);
                                for($i=0; $i < $strlen; $i++) {
-                                       $strarr[] = ord($str{$i});
+                                       $strarr[] = ord($str[$i]);
                                }
                                return $strarr;
                        }
@@ -5402,7 +5420,7 @@ if (!class_exists('TCPDF')) {
                        $str .= ""; // force $str to be a string
                        $length = strlen($str);
                        for($i = 0; $i < $length; $i++) {
-                               $char = ord($str{$i}); // get one string character at time
+                               $char = ord($str[$i]); // get one string character at time
                                if (count($bytes) == 0) { // get starting octect
                                        if ($char <= 0x7F) {
                                                $unicode[] = $char; // use the character "as is" because is ASCII
@@ -5728,10 +5746,7 @@ if (!class_exists('TCPDF')) {
                 * @return string converted
                 */
                function unhtmlentities($text_to_convert) {
-                       if (!$this->isunicode) {
-                               return html_entity_decode($text_to_convert, ENT_QUOTES);
-                       }
-                       return html_entity_decode_php4($text_to_convert);
+                       return html_entity_decode($text_to_convert, ENT_QUOTES, $this->encoding);
                }
 
                // ENCRYPTION METHODS ----------------------------------
@@ -5774,7 +5789,7 @@ if (!class_exists('TCPDF')) {
                                $j = 0;
                                for ($i=0; $i < 256; $i++) {
                                        $t = $rc4[$i];
-                                       $j = ($j + $t + ord($k{$i})) % 256;
+                                       $j = ($j + $t + ord($k[$i])) % 256;
                                        $rc4[$i] = $rc4[$j];
                                        $rc4[$j] = $t;
                                }
@@ -5794,7 +5809,7 @@ if (!class_exists('TCPDF')) {
                                $rc4[$a] = $rc4[$b];
                                $rc4[$b] = $t;
                                $k = $rc4[($rc4[$a] + $rc4[$b]) % 256];
-                               $out .= chr(ord($text{$i}) ^ $k);
+                               $out .= chr(ord($text[$i]) ^ $k);
                        }
                        return $out;
                }
@@ -6190,7 +6205,15 @@ if (!class_exists('TCPDF')) {
                function SetLineWidth($width) {
                        //Set line width
                        $this->LineWidth = $width;
-                       $this->linestyleWidth = sprintf('%.2f w', ($width * $this->k));
+                       //$this->linestyleWidth = sprintf('%.2f w', ($width * $this->k));
+                       // FrontAccounting fix
+                       // My PHP 5.2.6 environment gave an "Unsupported operand types"
+                       // error for the multiplication on the next line some of the
+                       // time when this method is called - I debugged and sometimes
+                       // the $width parameter is some sort of weird array.  I don't
+                       // understand what's going on, but casting it to a (float) seems
+                       // to "fix" the problem.  -Jason Maas, 2009/09/25
+                       $this->linestyleWidth = sprintf('%.2f w', ((float) $width * (float) $this->k));
                        $this->_out($this->linestyleWidth);
                }
 
@@ -6249,7 +6272,7 @@ if (!class_exists('TCPDF')) {
                        if (isset($dash)) {
                                $dash_string = "";
                                if ($dash) {
-                                       if (ereg("^.+,", $dash)) {
+                                       if (preg_match("/^.+,/", $dash)) {
                                                $tab = explode(",", $dash);
                                        } else {
                                                $tab = array($dash);
@@ -7754,7 +7777,7 @@ if (!class_exists('TCPDF')) {
                        $k = $this->k;
                        $this->javascript .= sprintf("f".$name."=this.addField('%s','%s',%d,[%.2f,%.2f,%.2f,%.2f]);", $name, $type, $this->PageNo()-1, $x*$k, ($this->h-$y)*$k+1, ($x+$w)*$k, ($this->h-$y-$h)*$k+1)."\n";
                        $this->javascript .= "f".$name.".textSize=".$this->FontSizePt.";\n";
-                       while (list($key, $val) = each($prop)) {
+                       foreach ($prop as $key => $val) {
                                if (strcmp(substr($key,-5),"Color") == 0) {
                                        $val = $this->_JScolor($val);
                                } else {
@@ -8629,12 +8652,12 @@ if (!class_exists('TCPDF')) {
                                $this->_out(sprintf('%.3F %.3F %.3F %.3F %.3F %.3F cm', $scale_x, 0, 0, $scale_y, $x1*(1-$scale_x), $y2*(1-$scale_y)));
                        }
                        // handle pc/unix/mac line endings
-                       $lines = split("\r\n|[\r\n]", $data);
+                       $lines = preg_split("/\r\n|[\r\n]/", $data);
                        $u=0;
                        $cnt = count($lines);
                        for ($i=0; $i < $cnt; $i++) {
                                $line = $lines[$i];
-                               if (($line == '') OR ($line{0} == '%')) {
+                               if (($line == '') OR ($line[0] == '%')) {
                                        continue;
                                }
                                $len = strlen($line);
@@ -8685,7 +8708,7 @@ if (!class_exists('TCPDF')) {
                                        case 'V':
                                        case 'L':
                                        case 'C': {
-                                               $line{$len-1} = strtolower($cmd);
+                                               $line[$len-1] = strtolower($cmd);
                                                $this->_out($line);
                                                break;
                                        }
@@ -9183,7 +9206,7 @@ if (!class_exists('TCPDF')) {
                                        // get tag name
                                        preg_match('/[\/]?([a-zA-Z0-9]*)/', $element, $tag);
                                        $dom[$key]['value'] = strtolower($tag[1]);
-                                       if ($element{0} == '/') {
+                                       if ($element[0] == '/') {
                                                // closing html tag
                                                $dom[$key]['opening'] = false;
                                                $dom[$key]['parent'] = end($level);
@@ -9228,7 +9251,7 @@ if (!class_exists('TCPDF')) {
                                                // get attributes
                                                preg_match_all('/([^=\s]*)=["\']?([^"\']*)["\']?/', $element, $attr_array, PREG_PATTERN_ORDER);
                                                $dom[$key]['attribute'] = array(); // reset attribute array
-                                               while (list($id, $name) = each($attr_array[1])) {
+                                               foreach ($attr_array[1] as $id => $name) {
                                                        $dom[$key]['attribute'][strtolower($name)] = $attr_array[2][$id];
                                                }
                                                // split style attributes
@@ -9236,14 +9259,14 @@ if (!class_exists('TCPDF')) {
                                                        // get style attributes
                                                        preg_match_all('/([^:\s]*):([^;]*)/', $dom[$key]['attribute']['style'], $style_array, PREG_PATTERN_ORDER);
                                                        $dom[$key]['style'] = array(); // reset style attribute array
-                                                       while (list($id, $name) = each($style_array[1])) {
+                                                       foreach ($style_array[1] as $id => $name) {
                                                                $dom[$key]['style'][strtolower($name)] = trim($style_array[2][$id]);
                                                        }
                                                        // --- get some style attributes ---
                                                        if (isset($dom[$key]['style']['font-family'])) {
                                                                // font family
                                                                if (isset($dom[$key]['style']['font-family'])) {
-                                                                       $fontslist = split(",", strtolower($dom[$key]['style']['font-family']));
+                                                                       $fontslist = preg_split("/,/", strtolower($dom[$key]['style']['font-family']));
                                                                        foreach($fontslist as $font) {
                                                                                $font = trim(strtolower($font));
                                                                                if (in_array($font, $this->fontlist)){
@@ -9292,10 +9315,10 @@ if (!class_exists('TCPDF')) {
                                                        }
                                                        // font style
                                                        $dom[$key]['fontstyle'] = "";
-                                                       if (isset($dom[$key]['style']['font-weight']) AND (strtolower($dom[$key]['style']['font-weight']{0}) == "b")) {
+                                                       if (isset($dom[$key]['style']['font-weight']) AND (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")) {
+                                                       if (isset($dom[$key]['style']['font-style']) AND (strtolower($dom[$key]['style']['font-style'][0]) == "i")) {
                                                                $dom[$key]['fontstyle'] .= "I";
                                                        }
                                                        // font color
@@ -9311,9 +9334,9 @@ if (!class_exists('TCPDF')) {
                                                                $decors = explode(" ", strtolower($dom[$key]['style']['text-decoration']));
                                                                foreach ($decors as $dec) {
                                                                        $dec = trim($dec);
-                                                                       if ($dec{0} == "u") {
+                                                                       if ($dec[0] == "u") {
                                                                                $dom[$key]['fontstyle'] .= "U";
-                                                                       } elseif ($dec{0} == "l") {
+                                                                       } elseif ($dec[0] == "l") {
                                                                                $dom[$key]['fontstyle'] .= "D";
                                                                        }
                                                                }
@@ -9328,14 +9351,14 @@ if (!class_exists('TCPDF')) {
                                                        }
                                                        // check for text alignment
                                                        if (isset($dom[$key]['style']['text-align'])) {
-                                                               $dom[$key]['align'] = strtoupper($dom[$key]['style']['text-align']{0});
+                                                               $dom[$key]['align'] = strtoupper($dom[$key]['style']['text-align'][0]);
                                                        }
                                                }
                                                // check for font tag
                                                if ($dom[$key]['value'] == "font") {
                                                        // font family
                                                        if (isset($dom[$key]['attribute']['face'])) {
-                                                               $fontslist = split(",", strtolower($dom[$key]['attribute']['face']));
+                                                               $fontslist = preg_split("/,/", strtolower($dom[$key]['attribute']['face']));
                                                                foreach($fontslist as $font) {
                                                                        $font = trim(strtolower($font));
                                                                        if (in_array($font, $this->fontlist)){
@@ -9347,9 +9370,9 @@ if (!class_exists('TCPDF')) {
                                                        // font size
                                                        if (isset($dom[$key]['attribute']['size'])) {
                                                                if ($key > 0) {
-                                                                       if ($dom[$key]['attribute']['size']{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} == "-") {
+                                                                       } 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']);
@@ -9376,8 +9399,8 @@ if (!class_exists('TCPDF')) {
                                                if (($dom[$key]['value'] == "em") OR ($dom[$key]['value'] == "i")) {
                                                        $dom[$key]['fontstyle'] .= "I";
                                                }
-                                               if (($dom[$key]['value']{0} == "h") AND (intval($dom[$key]['value']{1}) > 0) AND (intval($dom[$key]['value']{1}) < 7)) {
-                                                       $headsize = (4 - intval($dom[$key]['value']{1})) * 2;
+                                               if (($dom[$key]['value'][0] == "h") AND (intval($dom[$key]['value'][1]) > 0) AND (intval($dom[$key]['value'][1]) < 7)) {
+                                                       $headsize = (4 - intval($dom[$key]['value'][1])) * 2;
                                                        $dom[$key]['fontsize'] = $dom[0]['fontsize'] + $headsize;
                                                        $dom[$key]['fontstyle'] .= "B";
                                                }
@@ -9419,7 +9442,7 @@ if (!class_exists('TCPDF')) {
                                                }
                                                // check for text alignment
                                                if (isset($dom[$key]['attribute']['align']) AND (!empty($dom[$key]['attribute']['align'])) AND ($dom[$key]['value'] !== 'img')) {
-                                                       $dom[$key]['align'] = strtoupper($dom[$key]['attribute']['align']{0});
+                                                       $dom[$key]['align'] = strtoupper($dom[$key]['attribute']['align'][0]);
                                                }
                                        } // end opening tag
                                } else {
@@ -10419,4 +10442,3 @@ if (!class_exists('TCPDF')) {
 //============================================================+
 // END OF FILE
 //============================================================+
-?>