diff --git a/htdocs/expedition/mods/methode_expedition.modules.php b/htdocs/expedition/mods/methode_expedition.modules.php index 186f1089a8b..25ba71f5c60 100644 --- a/htdocs/expedition/mods/methode_expedition.modules.php +++ b/htdocs/expedition/mods/methode_expedition.modules.php @@ -1,5 +1,6 @@ + * Copyright (C) 2007 Laurent Destailleur * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,11 +19,22 @@ * * $Id$ * $Source$ - * */ -require_once(FPDF_PATH.'fpdi_protection.php'); +/** + \file htdocs/expedition/mods/methode_expedition.modules.php + \ingroup expedition + \brief Fichier contenant la classe mère de generation de bon de livraison en PDF + et la classe mère de numérotation des bons de livraisons + \version $Revision$ +*/ +require_once(DOL_DOCUMENT_ROOT.'/includes/fpdf/fpdfi/fpdi_protection.php'); + +/** + \class methode_expedition + \brief Classe mère des methodes expeditions +*/ Class methode_expedition { @@ -79,17 +91,19 @@ Class methode_expedition if (file_exists($dir)) { - - $pdf=new FPDI_Protection('P','mm','A4'); - // Protection et encryption du pdf if ($conf->global->PDF_SECURITY_ENCRYPTION) { + $pdf=new FPDI_Protection('P','mm','A4'); $pdfrights = array('print'); // Ne permet que l'impression du document $pdfuserpass = ''; // Mot de passe pour l'utilisateur final $pdfownerpass = NULL; // Mot de passe du propriétaire, créé aléatoirement si pas défini $pdf->SetProtection($pdfrights,$pdfuserpass,$pdfownerpass); } + else + { + $pdf=new FPDI('P','mm',$this->format); + } $pdf->Open(); $pdf->AddPage(); diff --git a/htdocs/fourn/commande/modules/modules_commandefournisseur.php b/htdocs/fourn/commande/modules/modules_commandefournisseur.php index 76098f169ae..07d991194bb 100644 --- a/htdocs/fourn/commande/modules/modules_commandefournisseur.php +++ b/htdocs/fourn/commande/modules/modules_commandefournisseur.php @@ -31,8 +31,7 @@ et la classe mère de numérotation des commandes fournisseurs \version $Revision$ */ - -require_once(FPDF_PATH.'fpdi_protection.php'); +require_once(DOL_DOCUMENT_ROOT.'/includes/fpdf/fpdfi/fpdi_protection.php'); /** diff --git a/htdocs/fourn/commande/modules/pdf/pdf_muscadet.modules.php b/htdocs/fourn/commande/modules/pdf/pdf_muscadet.modules.php index 3dfbd5ca80f..f91ff8858e4 100644 --- a/htdocs/fourn/commande/modules/pdf/pdf_muscadet.modules.php +++ b/htdocs/fourn/commande/modules/pdf/pdf_muscadet.modules.php @@ -1,5 +1,5 @@ +/* Copyright (C) 2004-2007 Laurent Destailleur * Copyright (C) 2005-2006 Regis Houssin * Copyright (C) 2007 Franky Van Liedekerke * @@ -174,17 +174,20 @@ class pdf_muscadet extends ModelePDFSuppliersOrders { $nblignes = sizeof($com->lignes); - // Initialisation document vierge - $pdf=new FPDI_Protection('P','mm',$this->format); - // Protection et encryption du pdf + // Protection et encryption du pdf if ($conf->global->PDF_SECURITY_ENCRYPTION) { + $pdf=new FPDI_Protection('P','mm',$this->format); $pdfrights = array('print'); // Ne permet que l'impression du document $pdfuserpass = ''; // Mot de passe pour l'utilisateur final $pdfownerpass = NULL; // Mot de passe du propriétaire, créé aléatoirement si pas défini $pdf->SetProtection($pdfrights,$pdfuserpass,$pdfownerpass); } + else + { + $pdf=new FPDI('P','mm',$this->format); + } $pdf->Open(); $pdf->AddPage(); diff --git a/htdocs/includes/fpdf/DolibarrPdfBarCode.class.php b/htdocs/includes/fpdf/DolibarrPdfBarCode.class.php index 1ee02dbde95..08a959ea75f 100644 --- a/htdocs/includes/fpdf/DolibarrPdfBarCode.class.php +++ b/htdocs/includes/fpdf/DolibarrPdfBarCode.class.php @@ -17,10 +17,9 @@ * * $Id$ * $Source$ - * */ +require_once(DOL_DOCUMENT_ROOT.'/includes/fpdf/fpdfi/fpdi_protection.php'); -require_once(FPDF_PATH.'fpdi_protection.php'); class DolibarrPdfBarCode extends FPDF { diff --git a/htdocs/includes/fpdf/fpdf/fpdi.php b/htdocs/includes/fpdf/fpdf/fpdi.php deleted file mode 100644 index 6b989c12a95..00000000000 --- a/htdocs/includes/fpdf/fpdf/fpdi.php +++ /dev/null @@ -1,413 +0,0 @@ -current_filename = $filename; - $fn =& $this->current_filename; - - $this->parsers[$fn] = new fpdi_pdf_parser($fn,$this); - $this->current_parser =& $this->parsers[$fn]; - - return $this->parsers[$fn]->getPageCount(); - } - - /** - * Import a page - * - * @param int $pageno pagenumber - * @return int Index of imported page - to use with fpdf_tpl::useTemplate() - */ - function ImportPage($pageno) { - $fn =& $this->current_filename; - - $this->parsers[$fn]->setPageno($pageno); - - $this->tpl++; - $this->tpls[$this->tpl] = array(); - $this->tpls[$this->tpl]['parser'] =& $this->parsers[$fn]; - $this->tpls[$this->tpl]['resources'] = $this->parsers[$fn]->getPageResources(); - $this->tpls[$this->tpl]['buffer'] = $this->parsers[$fn]->getContent(); - // $mediabox holds the dimensions of the source page - $mediabox = $this->parsers[$fn]->getPageMediaBox($pageno); - - // To build array that can used by pdf_tpl::useTemplate() - $this->tpls[$this->tpl] = array_merge($this->tpls[$this->tpl],$mediabox); - - return $this->tpl; - } - - /** - * Private method, that rebuilds all needed objects of source files - */ - function _putOobjects() { - if (is_array($this->parsers) && count($this->parsers) > 0) { - foreach($this->parsers AS $filename => $p) { - $this->current_parser =& $this->parsers[$filename]; - if (is_array($this->obj_stack[$filename])) { - while($n = key($this->obj_stack[$filename])) { - $nObj = $this->current_parser->pdf_resolve_object($this->current_parser->c,$this->obj_stack[$filename][$n][1]); - - $this->_newobj($this->obj_stack[$filename][$n][0]); - - if ($nObj[0] == PDF_TYPE_STREAM) { - $this->pdf_write_value ($nObj); - } else { - $this->pdf_write_value ($nObj[1]); - } - - $this->_out('endobj'); - $this->obj_stack[$filename][$n] = null; // free memory - unset($this->obj_stack[$filename][$n]); - reset($this->obj_stack[$filename]); - } - } - } - } - } - - /** - * Rewritten for handling own defined PDF-Versions - * only needed by FPDF 1.52 - */ - function _begindoc() { - //Start document - $this->state=1; - } - - /** - * Sets the PDF Version to the highest of imported documents - */ - function setVersion() { - if ($this->importVersion > $this->PDFVersion) - $this->PDFVersion = $this->importVersion; - - if (!method_exists($this, '_putheader')) { - $this->buffer = '%PDF-'.$this->PDFVersion."\n".$this->buffer; - } - } - - /** - * rewritten for handling higher PDF Versions - */ - function _enddoc() { - $this->setVersion(); - parent::_enddoc(); - } - - - /** - * Put resources - */ - function _putresources() { - $this->_putfonts(); - $this->_putimages(); - $this->_puttemplates(); - $this->_putOobjects(); - - //Resource dictionary - $this->offsets[2]=strlen($this->buffer); - $this->_out('2 0 obj'); - $this->_out('<_out('/Font <<'); - foreach($this->fonts as $font) - $this->_out($this->fontprefix.$font['i'].' '.$font['n'].' 0 R'); - $this->_out('>>'); - if(count($this->images) || count($this->tpls)) - { - $this->_out('/XObject <<'); - if (count($this->images)) { - foreach($this->images as $image) - $this->_out('/I'.$image['i'].' '.$image['n'].' 0 R'); - } - if (count($this->tpls)) { - foreach($this->tpls as $tplidx => $tpl) - $this->_out($this->tplprefix.$tplidx.' '.$tpl['n'].' 0 R'); - } - $this->_out('>>'); - } - $this->_out('>>'); - $this->_out('endobj'); - } - - /** - * Private Method that writes /XObjects - "Templates" - */ - function _puttemplates() { - $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; - reset($this->tpls); - foreach($this->tpls AS $tplidx => $tpl) { - - $p=($this->compress) ? gzcompress($tpl['buffer']) : $tpl['buffer']; - $this->_newobj(); - $this->tpls[$tplidx]['n'] = $this->n; - $this->_out('<<'.$filter.'/Type /XObject'); - $this->_out('/Subtype /Form'); - $this->_out('/FormType 1'); - $this->_out(sprintf('/BBox [%.2f %.2f %.2f %.2f]',$tpl['x']*$this->k, ($tpl['h']-$tpl['y'])*$this->k, $tpl['w']*$this->k, ($tpl['h']-$tpl['y']-$tpl['h'])*$this->k)); - $this->_out('/Resources '); - - if ($tpl['resources']) { - $this->current_parser =& $tpl['parser']; - $this->pdf_write_value($tpl['resources']); - } else { - $this->_out('<res['tpl'][$tplidx]['fonts'])) { - $this->_out('/Font <<'); - foreach($this->res['tpl'][$tplidx]['fonts'] as $font) - $this->_out($this->fontprefix.$font['i'].' '.$font['n'].' 0 R'); - $this->_out('>>'); - } - if(count($this->res['tpl'][$tplidx]['images']) || count($this->res['tpl'][$tplidx]['tpls'])) - { - $this->_out('/XObject <<'); - if (count($this->res['tpl'][$tplidx]['images'])) { - foreach($this->res['tpl'][$tplidx]['images'] as $image) - $this->_out('/I'.$image['i'].' '.$image['n'].' 0 R'); - } - if (count($this->res['tpl'][$tplidx]['tpls'])) { - foreach($this->res['tpl'][$tplidx]['tpls'] as $i => $tpl) - $this->_out($this->tplprefix.$i.' '.$tpl['n'].' 0 R'); - } - $this->_out('>>'); - } - $this->_out('>>'); - } - - $this->_out('/Length '.strlen($p).' >>'); - $this->_putstream($p); - $this->_out('endobj'); - } - } - - /** - * Rewritten to handle existing own defined objects - */ - function _newobj($obj_id=false,$onlynewobj=false) { - if (!$obj_id) { - $obj_id = ++$this->n; - } - - //Begin a new object - if (!$onlynewobj) { - $this->offsets[$obj_id]=strlen($this->buffer); - $this->_out($obj_id.' 0 obj'); - $this->current_obj_id = $obj_id; // for later use with encryption - } - - } - - /** - * Writes a value - * Needed to rebuild the source document - * - * @param mixed $value A PDF-Value. Structure of values see cases in this method - */ - function pdf_write_value(&$value) - { - - switch ($value[0]) { - - case PDF_TYPE_NUMERIC : - case PDF_TYPE_TOKEN : - // A numeric value or a token. - // Simply output them - $this->_out($value[1]." "); - break; - - case PDF_TYPE_ARRAY : - - // An array. Output the proper - // structure and move on. - - $this->_out("[",false); - for ($i = 0; $i < count($value[1]); $i++) { - $this->pdf_write_value($value[1][$i]); - } - - $this->_out("]"); - break; - - case PDF_TYPE_DICTIONARY : - - // A dictionary. - $this->_out("<<",false); - - reset ($value[1]); - - while (list($k, $v) = each($value[1])) { - $this->_out($k . " ",false); - $this->pdf_write_value($v); - } - - $this->_out(">>"); - break; - - case PDF_TYPE_OBJREF : - - // An indirect object reference - // Fill the object stack if needed - if (!isset($this->don_obj_stack[$this->current_parser->filename][$value[1]])) { - $this->_newobj(false,true); - $this->obj_stack[$this->current_parser->filename][$value[1]] = array($this->n,$value); - $this->don_obj_stack[$this->current_parser->filename][$value[1]] = array($this->n,$value); - } - $objid = $this->don_obj_stack[$this->current_parser->filename][$value[1]][0]; - - $this->_out("{$objid} 0 R"); //{$value[2]} - break; - - case PDF_TYPE_STRING : - - // A string. - $this->_out('(' . $value[1] . ')'); - - break; - - case PDF_TYPE_STREAM : - - // A stream. First, output the - // stream dictionary, then the - // stream data itself. - $this->pdf_write_value($value[1]); - $this->_out("stream"); - $this->_out($value[2][1]); - $this->_out("endstream"); - break; - case PDF_TYPE_HEX : - - $this->_out("<" . $value[1] . ">"); - break; - - case PDF_TYPE_NULL : - // The null object. - - $this->_out("null"); - break; - } - } - - - /** - * Private Method - */ - function _out($s,$ln=true) { - //Add a line to the document - if ($this->state==2) { - if (!$this->intpl) - $this->pages[$this->page].=$s.($ln == true ? "\n" : ''); - else - $this->tpls[$this->tpl]['buffer'] .= $s.($ln == true ? "\n" : ''); - } else { - $this->buffer.=$s.($ln == true ? "\n" : ''); - } - } - - /** - * close all files opened by parsers - */ - function closeParsers() { - foreach ($this->parsers as $parser){ - $parser->closeFile(); - } - } - -} - -?> \ No newline at end of file diff --git a/htdocs/includes/fpdf/fpdf/fpdi_protection.php b/htdocs/includes/fpdf/fpdf/fpdi_protection.php deleted file mode 100644 index ba19796b1cd..00000000000 --- a/htdocs/includes/fpdf/fpdf/fpdi_protection.php +++ /dev/null @@ -1,271 +0,0 @@ -encrypted=false; - $this->last_rc4_key = ''; - $this->padding = "\x28\xBF\x4E\x5E\x4E\x75\x8A\x41\x64\x00\x4E\x56\xFF\xFA\x01\x08". - "\x2E\x2E\x00\xB6\xD0\x68\x3E\x80\x2F\x0C\xA9\xFE\x64\x53\x69\x7A"; - } - - /** - * Function to set permissions as well as user and owner passwords - * - * - permissions is an array with values taken from the following list: - * 40bit: copy, print, modify, annot-forms - * 128bit: fill-in, screenreaders, assemble, degraded-print - * If a value is present it means that the permission is granted - * - If a user password is set, user will be prompted before document is opened - * - If an owner password is set, document can be opened in privilege mode with no - * restriction if that password is entered - */ - function SetProtection($permissions=array(),$user_pass='',$owner_pass=null) - { - $options = array('print' => 4, 'modify' => 8, 'copy' => 16, 'annot-forms' => 32 ); - $protection = 192; - foreach($permissions as $permission){ - if (!isset($options[$permission])) - $this->Error('Incorrect permission: '.$permission); - $protection += $options[$permission]; - } - if ($owner_pass === null) - $owner_pass = uniqid(rand()); - $this->encrypted = true; - $this->_generateencryptionkey($user_pass, $owner_pass, $protection); - } - - - function _putstream($s) - { - if ($this->encrypted) { - $s = $this->_RC4($this->_objectkey($this->current_obj_id), $s); - } - parent::_putstream($s); - } - - - function _textstring($s) - { - if ($this->encrypted) { - $s = $this->_RC4($this->_objectkey($this->current_obj_id), $s); - } - return parent::_textstring($s); - } - - - /** - * Compute key depending on object number where the encrypted data is stored - */ - function _objectkey($n) - { - return substr($this->_md5_16($this->encryption_key.pack('VXxx',$n)),0,10); - } - - - /** - * Escape special characters - */ - function _escape($s) - { - return str_replace( - array('\\',')','(',"\r"), - array('\\\\','\\)','\\(','\\r'),$s); - } - - function _putresources() - { - parent::_putresources(); - if ($this->encrypted) { - $this->_newobj(); - $this->enc_obj_id = $this->current_obj_id; - $this->_out('<<'); - $this->_putencryption(); - $this->_out('>>'); - } - } - - function _putencryption() - { - $this->_out('/Filter /Standard'); - $this->_out('/V 1'); - $this->_out('/R 2'); - $this->_out('/O ('.$this->_escape($this->Ovalue).')'); - $this->_out('/U ('.$this->_escape($this->Uvalue).')'); - $this->_out('/P '.$this->Pvalue); - } - - - function _puttrailer() - { - parent::_puttrailer(); - if ($this->encrypted) { - $this->_out('/Encrypt '.$this->enc_obj_id.' 0 R'); - $this->_out('/ID [()()]'); - } - } - - - /** - * RC4 is the standard encryption algorithm used in PDF format - */ - function _RC4($key, $text) - { - if ($this->last_rc4_key != $key) { - $k = str_repeat($key, 256/strlen($key)+1); - $rc4 = range(0,255); - $j = 0; - for ($i=0; $i<256; $i++){ - $t = $rc4[$i]; - $j = ($j + $t + ord($k{$i})) % 256; - $rc4[$i] = $rc4[$j]; - $rc4[$j] = $t; - } - $this->last_rc4_key = $key; - $this->last_rc4_key_c = $rc4; - } else { - $rc4 = $this->last_rc4_key_c; - } - - $len = strlen($text); - $a = 0; - $b = 0; - $out = ''; - for ($i=0; $i<$len; $i++){ - $a = ($a+1)%256; - $t= $rc4[$a]; - $b = ($b+$t)%256; - $rc4[$a] = $rc4[$b]; - $rc4[$b] = $t; - $k = $rc4[($rc4[$a]+$rc4[$b])%256]; - $out.=chr(ord($text{$i}) ^ $k); - } - - return $out; - } - - - /** - * Get MD5 as binary string - */ - function _md5_16($string) - { - return pack('H*',md5($string)); - } - - /** - * Compute O value - */ - function _Ovalue($user_pass, $owner_pass) - { - $tmp = $this->_md5_16($owner_pass); - $owner_RC4_key = substr($tmp,0,5); - return $this->_RC4($owner_RC4_key, $user_pass); - } - - - /** - * Compute U value - */ - function _Uvalue() - { - return $this->_RC4($this->encryption_key, $this->padding); - } - - - /** - * Compute encryption key - */ - function _generateencryptionkey($user_pass, $owner_pass, $protection) - { - // Pad passwords - $user_pass = substr($user_pass.$this->padding,0,32); - $owner_pass = substr($owner_pass.$this->padding,0,32); - // Compute O value - $this->Ovalue = $this->_Ovalue($user_pass,$owner_pass); - // Compute encyption key - $tmp = $this->_md5_16($user_pass.$this->Ovalue.chr($protection)."\xFF\xFF\xFF"); - $this->encryption_key = substr($tmp,0,5); - // Compute U value - $this->Uvalue = $this->_Uvalue(); - // Compute P value - $this->Pvalue = -(($protection^255)+1); - } - - - function pdf_write_value(&$value) { - switch ($value[0]) { - case PDF_TYPE_STRING : - if ($this->encrypted) { - $value[1] = $this->_RC4($this->_objectkey($this->current_obj_id), $value[1]); - $value[1] = $this->_escape($value[1]); - } - break; - - case PDF_TYPE_STREAM : - if ($this->encrypted) { - $value[2][1] = $this->_RC4($this->_objectkey($this->current_obj_id), $value[2][1]); - } - break; - - case PDF_TYPE_HEX : - - if ($this->encrypted) { - $value[1] = $this->hex2str($value[1]); - $value[1] = $this->_RC4($this->_objectkey($this->current_obj_id), $value[1]); - - // remake hexstring of encrypted string - $value[1] = $this->str2hex($value[1]); - } - break; - } - - parent::pdf_write_value($value); - } - - - function hex2str($hex) { - return pack("H*", str_replace(array("\r","\n"),"", $hex)); - } - - function str2hex($str) { - return current(unpack("H*",$str)); - } - - -} - -?> \ No newline at end of file diff --git a/htdocs/includes/fpdf/fpdfi/README.txt b/htdocs/includes/fpdf/fpdfi/README.txt new file mode 100644 index 00000000000..b1c69409786 --- /dev/null +++ b/htdocs/includes/fpdf/fpdfi/README.txt @@ -0,0 +1,5 @@ +This directory contains all FPDFI librairies: +- FPDI +- FPDI_TPL +- FPDI_Protection +Found on http://www.setasign.de/products/pdf-php-solutions/fpdi/ diff --git a/htdocs/includes/fpdf/fpdfi/decoders/ASCII85Decode.php b/htdocs/includes/fpdf/fpdfi/decoders/ASCII85Decode.php new file mode 100644 index 00000000000..02191dc2c42 --- /dev/null +++ b/htdocs/includes/fpdf/fpdfi/decoders/ASCII85Decode.php @@ -0,0 +1,97 @@ +fpdi =& $fpdi; + } + + + function decode($in) { + $out = ""; + $state = 0; + $chn = null; + + $l = strlen($in); + + for ($k = 0; $k < $l; ++$k) { + $ch = ord($in[$k]) & 0xff; + + if ($ch == ORD_tilde) { + break; + } + if (preg_match("/^\s$/",chr($ch))) { + continue; + } + if ($ch == ORD_z && $state == 0) { + $out .= chr(0).chr(0).chr(0).chr(0); + continue; + } + if ($ch < ORD_exclmark || $ch > ORD_u) { + $this->fpdi->error("Illegal character in ASCII85Decode."); + } + + $chn[$state++] = $ch - ORD_exclmark; + + if ($state == 5) { + $state = 0; + $r = 0; + for ($j = 0; $j < 5; ++$j) + $r = $r * 85 + $chn[$j]; + $out .= chr($r >> 24); + $out .= chr($r >> 16); + $out .= chr($r >> 8); + $out .= chr($r); + } + } + $r = 0; + + if ($state == 1) + $this->fpdi->error("Illegal length in ASCII85Decode."); + if ($state == 2) { + $r = $chn[0] * 85 * 85 * 85 * 85 + ($chn[1]+1) * 85 * 85 * 85; + $out .= chr($r >> 24); + } + else if ($state == 3) { + $r = $chn[0] * 85 * 85 * 85 * 85 + $chn[1] * 85 * 85 * 85 + ($chn[2]+1) * 85 * 85; + $out .= chr($r >> 24); + $out .= chr($r >> 16); + } + else if ($state == 4) { + $r = $chn[0] * 85 * 85 * 85 * 85 + $chn[1] * 85 * 85 * 85 + $chn[2] * 85 * 85 + ($chn[3]+1) * 85 ; + $out .= chr($r >> 24); + $out .= chr($r >> 16); + $out .= chr($r >> 8); + } + + return $out; + } +} + +?> \ No newline at end of file diff --git a/htdocs/includes/fpdf/fpdfi/decoders/LZWDecode.php b/htdocs/includes/fpdf/fpdfi/decoders/LZWDecode.php new file mode 100644 index 00000000000..b3b41c72215 --- /dev/null +++ b/htdocs/includes/fpdf/fpdfi/decoders/LZWDecode.php @@ -0,0 +1,151 @@ +fpdi =& $fpdi; + } + + /** + * Method to decode LZW compressed data. + * + * @param string data The compressed data. + */ + function decode(&$data) { + + if($data[0] == 0x00 && $data[1] == 0x01) { + $this->fpdi->error("LZW flavour not supported."); + } + + $this->initsTable(); + + $this->data =& $data; + + // Initialize pointers + $this->bytePointer = 0; + $this->bitPointer = 0; + + $this->nextData = 0; + $this->nextBits = 0; + + $oldCode = 0; + + $string = ""; + $uncompData = ""; + + while (($code = $this->getNextCode()) != 257) { + if ($code == 256) { + $this->initsTable(); + $code = $this->getNextCode(); + + if ($code == 257) { + break; + } + + $uncompData .= $this->sTable[$code]; + $oldCode = $code; + + } else { + + if ($code < $this->tIdx) { + $string = $this->sTable[$code]; + $uncompData .= $string; + + $this->addStringToTable($this->sTable[$oldCode], $string[0]); + $oldCode = $code; + } else { + $string = $this->sTable[$oldCode]; + $string = $string.$string[0]; + $uncompData .= $string; + + $this->addStringToTable($string); + $oldCode = $code; + } + } + } + + return $uncompData; + } + + + /** + * Initialize the string table. + */ + function initsTable() { + $this->sTable = array(); + + for ($i = 0; $i < 256; $i++) + $this->sTable[$i] = chr($i); + + $this->tIdx = 258; + $this->bitsToGet = 9; + } + + /** + * Add a new string to the string table. + */ + function addStringToTable ($oldString, $newString="") { + $string = $oldString.$newString; + + // Add this new String to the table + $this->sTable[$this->tIdx++] = $string; + + if ($this->tIdx == 511) { + $this->bitsToGet = 10; + } else if ($this->tIdx == 1023) { + $this->bitsToGet = 11; + } else if ($this->tIdx == 2047) { + $this->bitsToGet = 12; + } + } + + // Returns the next 9, 10, 11 or 12 bits + function getNextCode() { + if ($this->bytePointer == strlen($this->data)) + return 257; + + $this->nextData = ($this->nextData << 8) | (ord($this->data[$this->bytePointer++]) & 0xff); + $this->nextBits += 8; + + if ($this->nextBits < $this->bitsToGet) { + $this->nextData = ($this->nextData << 8) | (ord($this->data[$this->bytePointer++]) & 0xff); + $this->nextBits += 8; + } + + $code = ($this->nextData >> ($this->nextBits - $this->bitsToGet)) & $this->andTable[$this->bitsToGet-9]; + $this->nextBits -= $this->bitsToGet; + + return $code; + } +} + + + +?> \ No newline at end of file diff --git a/htdocs/includes/fpdf/fpdf/fpdf_tpl.php b/htdocs/includes/fpdf/fpdfi/fpdf_tpl.php similarity index 57% rename from htdocs/includes/fpdf/fpdf/fpdf_tpl.php rename to htdocs/includes/fpdf/fpdfi/fpdf_tpl.php index 3ff5b4eb0b3..bfbe066b7f7 100644 --- a/htdocs/includes/fpdf/fpdf/fpdf_tpl.php +++ b/htdocs/includes/fpdf/fpdfi/fpdf_tpl.php @@ -1,446 +1,385 @@ -page <= 0) - $this->error("You have to add a page to fpdf first!"); - - // Save settings - $this->tpl++; - $this->tpls[$this->tpl]['o_x'] = $this->x; - $this->tpls[$this->tpl]['o_y'] = $this->y; - $this->tpls[$this->tpl]['o_AutoPageBreak'] = $this->AutoPageBreak; - $this->tpls[$this->tpl]['o_bMargin'] = $this->bMargin; - $this->tpls[$this->tpl]['o_tMargin'] = $this->tMargin; - $this->tpls[$this->tpl]['o_lMargin'] = $this->lMargin; - $this->tpls[$this->tpl]['o_rMargin'] = $this->rMargin; - $this->tpls[$this->tpl]['o_h'] = $this->h; - $this->tpls[$this->tpl]['o_w'] = $this->w; - - $this->SetAutoPageBreak(false); - - if ($x == null) - $x = 0; - if ($y == null) - $y = 0; - if ($w == null) - $w = $this->w; - if ($h == null) - $h = $this->h; - - // Define own high and width to calculate possitions correct - $this->h = $h; - $this->w = $w; - - $this->tpls[$this->tpl]['buffer'] = ""; - $this->tpls[$this->tpl]['x'] = $x; - $this->tpls[$this->tpl]['y'] = $y; - $this->tpls[$this->tpl]['w'] = $w; - $this->tpls[$this->tpl]['h'] = $h; - - $this->intpl = true; - $this->SetXY($x+$this->lMargin,$y+$this->tMargin); - $this->SetRightMargin($this->w-$w+$this->rMargin); - - return $this->tpl; - } - - /** - * End Template - * - * This method ends a template and reset initiated variables on beginTemplate. - * - * @return mixed If a template is opened, the ID is returned. If not a false is returned. - */ - function endTemplate() { - if ($this->intpl) { - $this->intpl = false; - $this->SetAutoPageBreak($this->tpls[$this->tpl]['o_AutoPageBreak'],$this->tpls[$this->tpl]['o_bMargin']); - $this->SetXY($this->tpls[$this->tpl]['o_x'],$this->tpls[$this->tpl]['o_y']); - $this->tMargin = $this->tpls[$this->tpl]['o_tMargin']; - $this->lMargin = $this->tpls[$this->tpl]['o_lMargin']; - $this->rMargin = $this->tpls[$this->tpl]['o_rMargin']; - $this->h = $this->tpls[$this->tpl]['o_h']; - $this->w = $this->tpls[$this->tpl]['o_w']; - return $this->tpl; - } else { - return false; - } - } - - /** - * Use a Template in current Page or other Template - * - * You can use a template in a page or in another template. - * You can give the used template a new size like you use the Image()-method. - * All parameters are optional. The width or height is calculated automaticaly - * if one is given. If no parameter is given the origin size as defined in - * beginTemplate() is used. - * The calculated or used width and height are returned as an array. - * - * @param int $tplidx A valid template-Id - * @param int $_x The x-position - * @param int $_y The y-position - * @param int $_w The new width of the template - * @param int $_h The new height of the template - * @retrun array The height and width of the template - */ - function useTemplate($tplidx, $_x=null, $_y=null, $_w=0, $_h=0) { - if ($this->page <= 0) - $this->error("You have to add a page to fpdf first!"); - - if (!$this->tpls[$tplidx]) - $this->error("Template does not exist!"); - - if ($this->intpl) { - $this->res['tpl'][$this->tpl]['tpls'][$tplidx] =& $this->tpls[$tplidx]; - } - extract($this->tpls[$tplidx]); - - if ($_x == null) - $_x = $x; - if ($_y == null) - $_y = $y; - $wh = $this->getTemplateSize($tplidx,$_w,$_h); - $_w = $wh['w']; - $_h = $wh['h']; - - $this->_out(sprintf("q %.4f 0 0 %.4f %.2f %.2f cm", ($_w/$w), ($_h/$h), $_x*$this->k, ($this->h-($_y+$_h))*$this->k)); // Translate - $this->_out($this->tplprefix.$tplidx." Do Q"); - - return array("w" => $_w, "h" => $_h); - } - - /** - * Get The calculated Size of a Template - * - * If one size is given, this method calculates the other one. - * - * @param int $tplidx A valid template-Id - * @param int $_w The width of the template - * @param int $_h The height of the template - * @return array The height and width of the template - */ - function getTemplateSize($tplidx, $_w=0, $_h=0) { - if (!$this->tpls[$tplidx]) - return false; - - extract($this->tpls[$tplidx]); - if ($_w == 0 and $_h == 0) { - $_w = $w; - $_h = $h; - } - - if($_w==0) - $_w=$_h*$w/$h; - if($_h==0) - $_h=$_w*$h/$w; - - return array("w" => $_w, "h" => $_h); - } - - /** - * See FPDF-Documentation ;-) - */ - function SetFont($family,$style='',$size=0) { - //Select a font; size given in points - global $fpdf_charwidths; - - $family=strtolower($family); - if($family=='') - $family=$this->FontFamily; - if($family=='arial') - $family='helvetica'; - elseif($family=='symbol' or $family=='zapfdingbats') - $style=''; - $style=strtoupper($style); - if(is_int(strpos($style,'U'))) - { - $this->underline=true; - $style=str_replace('U','',$style); - } - else - $this->underline=false; - if($style=='IB') - $style='BI'; - if($size==0) - $size=$this->FontSizePt; - //Test if font is already selected - if($this->FontFamily==$family and $this->FontStyle==$style and $this->FontSizePt==$size and !$this->intpl) - return; - //Test if used for the first time - $fontkey=$family.$style; - if(!isset($this->fonts[$fontkey])) - { - //Check if one of the standard fonts - if(isset($this->CoreFonts[$fontkey])) - { - if(!isset($fpdf_charwidths[$fontkey])) - { - //Load metric file - $file=$family; - if($family=='times' or $family=='helvetica') - $file.=strtolower($style); - $file.='.php'; - if(defined('FPDF_FONTPATH')) - $file=FPDF_FONTPATH.$file; - include($file); - if(!isset($fpdf_charwidths[$fontkey])) - $this->Error('Could not include font metric file'); - } - $i = $this->findNextAvailFont(); - $this->fonts[$fontkey]=array('i'=>$i,'type'=>'core','name'=>$this->CoreFonts[$fontkey],'up'=>-100,'ut'=>50,'cw'=>$fpdf_charwidths[$fontkey]); - } - else - $this->Error('Undefined font: '.$family.' '.$style); - } - //Select it - $this->FontFamily=$family; - $this->FontStyle=$style; - $this->FontSizePt=$size; - $this->FontSize=$size/$this->k; - $this->CurrentFont=&$this->fonts[$fontkey]; - if($this->page>0) - $this->_out(sprintf('BT '.$this->fontprefix.'%d %.2f Tf ET',$this->CurrentFont['i'],$this->FontSizePt)); - - - if ($this->intpl) { - $this->res['tpl'][$this->tpl]['fonts'][$fontkey] =& $this->fonts[$fontkey]; - } else { - $this->res['page'][$this->page]['fonts'][$fontkey] =& $this->fonts[$fontkey]; - } - } - - /** - * Find the next available Font-No. - * - * @return int - */ - function findNextAvailFont() { - return count($this->fonts)+1; - } - - /** - * See FPDF-Documentation ;-) - */ - function Image($file,$x,$y,$w=0,$h=0,$type='',$link='') { - parent::Image($file,$x,$y,$w,$h,$type,$link); - if ($this->intpl) { - $this->res['tpl'][$this->tpl]['images'][$file] =& $this->images[$file]; - } else { - $this->res['page'][$this->page]['images'][$file] =& $this->images[$file]; - } - } - - /** - * See FPDF-Documentation ;-) - * - * AddPage is not available when you're "in" a template. - */ - function AddPage($orientation='') { - if ($this->intpl) - $this->Error('Adding pages in templates isn\'t possible!'); - parent::AddPage($orientation); - } - - /** - * Preserve adding Links in Templates ...won't work - */ - function Link($x,$y,$w,$h,$link) { - if ($this->intpl) - $this->Error('Using links in templates aren\'t possible!'); - parent::Link($x,$y,$w,$h,$link); - } - - function AddLink() { - if ($this->intpl) - $this->Error('Adding links in templates aren\'t possible!'); - return parent::AddLink(); - } - - function SetLink($link,$y=0,$page=-1) { - if ($this->intpl) - $this->Error('Setting links in templates aren\'t possible!'); - parent::SetLink($link,$y,$page); - } - - /** - * Private Method that writes the Resources-Objects - */ - function _puttemplates() { - $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; - reset($this->tpls); - foreach($this->tpls AS $tplidx => $tpl) { - - $p=($this->compress) ? gzcompress($tpl['buffer']) : $tpl['buffer']; - $this->_newobj(); - $this->tpls[$tplidx]['n'] = $this->n; - $this->_out('<<'.$filter.'/Type /XObject'); - $this->_out('/Subtype /Form'); - $this->_out('/FormType 1'); - $this->_out(sprintf('/BBox [%.2f %.2f %.2f %.2f]',$tpl['x']*$this->k, ($tpl['h']-$tpl['y'])*$this->k, $tpl['w']*$this->k, ($tpl['h']-$tpl['y']-$tpl['h'])*$this->k)); // ($this->h-$tpl['y'])*$this->k - $this->_out('/Resources '); - - $this->_out('<res['tpl'][$tplidx]['fonts'])) { - $this->_out('/Font <<'); - foreach($this->res['tpl'][$tplidx]['fonts'] as $font) - $this->_out($this->fontprefix.$font['i'].' '.$font['n'].' 0 R'); - $this->_out('>>'); - } - if(count($this->res['tpl'][$tplidx]['images']) || count($this->res['tpl'][$tplidx]['tpls'])) - { - $this->_out('/XObject <<'); - if (count($this->res['tpl'][$tplidx]['images'])) { - foreach($this->res['tpl'][$tplidx]['images'] as $image) - $this->_out('/I'.$image['i'].' '.$image['n'].' 0 R'); - } - if (count($this->res['tpl'][$tplidx]['tpls'])) { - foreach($this->res['tpl'][$tplidx]['tpls'] as $i => $tpl) - $this->_out($this->tplprefix.$i.' '.$tpl['n'].' 0 R'); - } - $this->_out('>>'); - } - $this->_out('>>'); - - $this->_out('/Length '.strlen($p).' >>'); - $this->_putstream($p); - $this->_out('endobj'); - } - } - - /** - * Private Method - */ - function _putresources() { - $this->_putfonts(); - $this->_putimages(); - $this->_puttemplates(); - //Resource dictionary - $this->offsets[2]=strlen($this->buffer); - $this->_out('2 0 obj'); - $this->_out('<_out('/Font <<'); - foreach($this->fonts as $font) - $this->_out($this->fontprefix.$font['i'].' '.$font['n'].' 0 R'); - $this->_out('>>'); - if(count($this->images) || count($this->tpls)) - { - $this->_out('/XObject <<'); - if (count($this->images)) { - foreach($this->images as $image) - $this->_out('/I'.$image['i'].' '.$image['n'].' 0 R'); - } - if (count($this->tpls)) { - foreach($this->tpls as $tplidx => $tpl) - $this->_out($this->tplprefix.$tplidx.' '.$tpl['n'].' 0 R'); - } - $this->_out('>>'); - } - $this->_out('>>'); - $this->_out('endobj'); - } - - - /** - * Private Method - */ - function _out($s) { - //Add a line to the document - if ($this->state==2) { - if (!$this->intpl) - $this->pages[$this->page].=$s."\n"; - else - $this->tpls[$this->tpl]['buffer'] .= $s."\n"; - } else { - $this->buffer.=$s."\n"; - } - } -} - +page <= 0) + $this->error("You have to add a page to fpdf first!"); + + if ($x == null) + $x = 0; + if ($y == null) + $y = 0; + if ($w == null) + $w = $this->w; + if ($h == null) + $h = $this->h; + + // Save settings + $this->tpl++; + $tpl =& $this->tpls[$this->tpl]; + $tpl = array( + 'o_x' => $this->x, + 'o_y' => $this->y, + 'o_AutoPageBreak' => $this->AutoPageBreak, + 'o_bMargin' => $this->bMargin, + 'o_tMargin' => $this->tMargin, + 'o_lMargin' => $this->lMargin, + 'o_rMargin' => $this->rMargin, + 'o_h' => $this->h, + 'o_w' => $this->w, + 'buffer' => '', + 'x' => $x, + 'y' => $y, + 'w' => $w, + 'h' => $h + ); + + $this->SetAutoPageBreak(false); + + // Define own high and width to calculate possitions correct + $this->h = $h; + $this->w = $w; + + $this->_intpl = true; + $this->SetXY($x+$this->lMargin,$y+$this->tMargin); + $this->SetRightMargin($this->w-$w+$this->rMargin); + + return $this->tpl; + } + + /** + * End Template + * + * This method ends a template and reset initiated variables on beginTemplate. + * + * @return mixed If a template is opened, the ID is returned. If not a false is returned. + */ + function endTemplate() { + if ($this->_intpl) { + $this->_intpl = false; + $tpl =& $this->tpls[$this->tpl]; + $this->SetXY($tpl['o_x'], $tpl['o_y']); + $this->tMargin = $tpl['o_tMargin']; + $this->lMargin = $tpl['o_lMargin']; + $this->rMargin = $tpl['o_rMargin']; + $this->h = $tpl['o_h']; + $this->w = $tpl['o_w']; + $this->SetAutoPageBreak($tpl['o_AutoPageBreak'], $tpl['o_bMargin']); + + return $this->tpl; + } else { + return false; + } + } + + /** + * Use a Template in current Page or other Template + * + * You can use a template in a page or in another template. + * You can give the used template a new size like you use the Image()-method. + * All parameters are optional. The width or height is calculated automaticaly + * if one is given. If no parameter is given the origin size as defined in + * beginTemplate() is used. + * The calculated or used width and height are returned as an array. + * + * @param int $tplidx A valid template-Id + * @param int $_x The x-position + * @param int $_y The y-position + * @param int $_w The new width of the template + * @param int $_h The new height of the template + * @retrun array The height and width of the template + */ + function useTemplate($tplidx, $_x=null, $_y=null, $_w=0, $_h=0) { + if ($this->page <= 0) + $this->error("You have to add a page to fpdf first!"); + + if (!isset($this->tpls[$tplidx])) + $this->error("Template does not exist!"); + + if ($this->_intpl) { + $this->_res['tpl'][$this->tpl]['tpls'][$tplidx] =& $this->tpls[$tplidx]; + } + + $tpl =& $this->tpls[$tplidx]; + $x = $tpl['x']; + $y = $tpl['y']; + $w = $tpl['w']; + $h = $tpl['h']; + + if ($_x == null) + $_x = $x; + if ($_y == null) + $_y = $y; + $wh = $this->getTemplateSize($tplidx,$_w,$_h); + $_w = $wh['w']; + $_h = $wh['h']; + + $this->_out(sprintf("q %.4f 0 0 %.4f %.2f %.2f cm", ($_w/$w), ($_h/$h), $_x*$this->k, ($this->h-($_y+$_h))*$this->k)); // Translate + $this->_out($this->tplprefix.$tplidx." Do Q"); + + return array("w" => $_w, "h" => $_h); + } + + /** + * Get The calculated Size of a Template + * + * If one size is given, this method calculates the other one. + * + * @param int $tplidx A valid template-Id + * @param int $_w The width of the template + * @param int $_h The height of the template + * @return array The height and width of the template + */ + function getTemplateSize($tplidx, $_w=0, $_h=0) { + if (!$this->tpls[$tplidx]) + return false; + + $tpl =& $this->tpls[$tplidx]; + $w = $tpl['w']; + $h = $tpl['h']; + + if ($_w == 0 and $_h == 0) { + $_w = $w; + $_h = $h; + } + + if($_w==0) + $_w=$_h*$w/$h; + if($_h==0) + $_h=$_w*$h/$w; + + return array("w" => $_w, "h" => $_h); + } + + /** + * See FPDF-Documentation ;-) + */ + function SetFont($family,$style='',$size=0) { + /** + * force the resetting of font changes in a template + */ + if ($this->_intpl) + $this->FontFamily = ''; + + parent::SetFont($family, $style, $size); + + $fontkey = $this->FontFamily.$this->FontStyle; + + if ($this->_intpl) { + $this->_res['tpl'][$this->tpl]['fonts'][$fontkey] =& $this->fonts[$fontkey]; + } else { + $this->_res['page'][$this->page]['fonts'][$fontkey] =& $this->fonts[$fontkey]; + } + } + + /** + * See FPDF-Documentation ;-) + */ + function Image($file,$x,$y,$w=0,$h=0,$type='',$link='') { + parent::Image($file,$x,$y,$w,$h,$type,$link); + if ($this->_intpl) { + $this->_res['tpl'][$this->tpl]['images'][$file] =& $this->images[$file]; + } else { + $this->_res['page'][$this->page]['images'][$file] =& $this->images[$file]; + } + } + + /** + * See FPDF-Documentation ;-) + * + * AddPage is not available when you're "in" a template. + */ + function AddPage($orientation='') { + if ($this->_intpl) + $this->Error('Adding pages in templates isn\'t possible!'); + parent::AddPage($orientation); + } + + /** + * Preserve adding Links in Templates ...won't work + */ + function Link($x,$y,$w,$h,$link) { + if ($this->_intpl) + $this->Error('Using links in templates aren\'t possible!'); + parent::Link($x,$y,$w,$h,$link); + } + + function AddLink() { + if ($this->_intpl) + $this->Error('Adding links in templates aren\'t possible!'); + return parent::AddLink(); + } + + function SetLink($link,$y=0,$page=-1) { + if ($this->_intpl) + $this->Error('Setting links in templates aren\'t possible!'); + parent::SetLink($link,$y,$page); + } + + /** + * Private Method that writes the form xobjects + */ + function _putformxobjects() { + $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; + reset($this->tpls); + foreach($this->tpls AS $tplidx => $tpl) { + + $p=($this->compress) ? gzcompress($tpl['buffer']) : $tpl['buffer']; + $this->_newobj(); + $this->tpls[$tplidx]['n'] = $this->n; + $this->_out('<<'.$filter.'/Type /XObject'); + $this->_out('/Subtype /Form'); + $this->_out('/FormType 1'); + $this->_out(sprintf('/BBox [%.2f %.2f %.2f %.2f]',$tpl['x']*$this->k, ($tpl['h']-$tpl['y'])*$this->k, $tpl['w']*$this->k, ($tpl['h']-$tpl['y']-$tpl['h'])*$this->k)); + $this->_out('/Resources '); + + $this->_out('<_res['tpl'][$tplidx]['fonts']) && count($this->_res['tpl'][$tplidx]['fonts'])) { + $this->_out('/Font <<'); + foreach($this->_res['tpl'][$tplidx]['fonts'] as $font) + $this->_out('/F'.$font['i'].' '.$font['n'].' 0 R'); + $this->_out('>>'); + } + if(isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images']) || + isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) + { + $this->_out('/XObject <<'); + if (isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images'])) { + foreach($this->_res['tpl'][$tplidx]['images'] as $image) + $this->_out('/I'.$image['i'].' '.$image['n'].' 0 R'); + } + if (isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) { + foreach($this->_res['tpl'][$tplidx]['tpls'] as $i => $tpl) + $this->_out($this->tplprefix.$i.' '.$tpl['n'].' 0 R'); + } + $this->_out('>>'); + } + $this->_out('>>'); + + $this->_out('/Length '.strlen($p).' >>'); + $this->_putstream($p); + $this->_out('endobj'); + } + } + + /** + * Private Method + */ + function _putresources() { + $this->_putfonts(); + $this->_putimages(); + $this->_putformxobjects(); + //Resource dictionary + $this->offsets[2]=strlen($this->buffer); + $this->_out('2 0 obj'); + $this->_out('<<'); + $this->_putresourcedict(); + $this->_out('>>'); + $this->_out('endobj'); + } + + function _putxobjectdict() { + parent::_putxobjectdict(); + + if (count($this->tpls)) { + foreach($this->tpls as $tplidx => $tpl) { + $this->_out($this->tplprefix.$tplidx.' '.$tpl['n'].' 0 R'); + } + } + } + + /** + * Private Method + */ + function _out($s) { + //Add a line to the document + if ($this->state==2) { + if (!$this->_intpl) + $this->pages[$this->page].=$s."\n"; + else + $this->tpls[$this->tpl]['buffer'] .= $s."\n"; + } else { + $this->buffer.=$s."\n"; + } + } +} + ?> \ No newline at end of file diff --git a/htdocs/includes/fpdf/fpdfi/fpdi.php b/htdocs/includes/fpdf/fpdfi/fpdi.php new file mode 100644 index 00000000000..1c4b572a47b --- /dev/null +++ b/htdocs/includes/fpdf/fpdfi/fpdi.php @@ -0,0 +1,466 @@ +current_filename = $filename; + $fn =& $this->current_filename; + + if (!isset($this->parsers[$fn])) + $this->parsers[$fn] =& new fpdi_pdf_parser($fn,$this); + $this->current_parser =& $this->parsers[$fn]; + + return $this->parsers[$fn]->getPageCount(); + } + + /** + * Import a page + * + * @param int $pageno pagenumber + * @return int Index of imported page - to use with fpdf_tpl::useTemplate() + */ + function importPage($pageno, $boxName='/CropBox') { + if ($this->_intpl) { + return $this->error("Please import the desired pages before creating a new template."); + } + + $fn =& $this->current_filename; + + $parser =& $this->parsers[$fn]; + $parser->setPageno($pageno); + + $this->tpl++; + $this->tpls[$this->tpl] = array(); + $tpl =& $this->tpls[$this->tpl]; + $tpl['parser'] =& $parser; + $tpl['resources'] = $parser->getPageResources(); + $tpl['buffer'] = $parser->getContent(); + + if (!in_array($boxName, $parser->availableBoxes)) + return $this->Error(sprintf("Unknown box: %s", $boxName)); + $pageboxes = $parser->getPageBoxes($pageno); + + /** + * MediaBox + * CropBox: Default -> MediaBox + * BleedBox: Default -> CropBox + * TrimBox: Default -> CropBox + * ArtBox: Default -> CropBox + */ + if (!isset($pageboxes[$boxName]) && ($boxName == "/BleedBox" || $boxName == "/TrimBox" || $boxName == "/ArtBox")) + $boxName = "/CropBox"; + if (!isset($pageboxes[$boxName]) && $boxName == "/CropBox") + $boxName = "/MediaBox"; + + if (!isset($pageboxes[$boxName])) + return false; + $this->lastUsedPageBox = $boxName; + + $box = $pageboxes[$boxName]; + $tpl['box'] = $box; + + // To build an array that can be used by PDF_TPL::useTemplate() + $this->tpls[$this->tpl] = array_merge($this->tpls[$this->tpl],$box); + // An imported page will start at 0,0 everytime. Translation will be set in _putformxobjects() + $tpl['x'] = 0; + $tpl['y'] = 0; + + $page =& $parser->pages[$parser->pageno]; + + // fix for rotated pages + $rotation = $parser->getPageRotation($pageno); + if (isset($rotation[1]) && ($angle = $rotation[1] % 360) != 0) { + $steps = $angle / 90; + + $_w = $tpl['w']; + $_h = $tpl['h']; + $tpl['w'] = $steps % 2 == 0 ? $_w : $_h; + $tpl['h'] = $steps % 2 == 0 ? $_h : $_w; + + if ($steps % 2 != 0) { + $x = $y = ($steps == 1 || $steps == -3) ? $tpl['h'] : $tpl['w']; + } else { + $x = $tpl['w']; + $y = $tpl['h']; + } + + $cx=($x/2+$tpl['box']['x'])*$this->k; + $cy=($y/2+$tpl['box']['y'])*$this->k; + + $angle*=-1; + + $angle*=M_PI/180; + $c=cos($angle); + $s=sin($angle); + + $tpl['buffer'] = sprintf('q %.5f %.5f %.5f %.5f %.2f %.2f cm 1 0 0 1 %.2f %.2f cm %s Q',$c,$s,-$s,$c,$cx,$cy,-$cx,-$cy, $tpl['buffer']); + } + + return $this->tpl; + } + + function getLastUsedPageBox() { + return $this->lastUsedPageBox; + } + + function useTemplate($tplidx, $_x=null, $_y=null, $_w=0, $_h=0) { + $this->_out('q 0 J 1 w 0 j 0 G'); // reset standard values + $s = parent::useTemplate($tplidx, $_x, $_y, $_w, $_h); + $this->_out('Q'); + return $s; + } + + /** + * Private method, that rebuilds all needed objects of source files + */ + function _putimportedobjects() { + if (is_array($this->parsers) && count($this->parsers) > 0) { + foreach($this->parsers AS $filename => $p) { + $this->current_parser =& $this->parsers[$filename]; + if (is_array($this->_obj_stack[$filename])) { + while($n = key($this->_obj_stack[$filename])) { + $nObj = $this->current_parser->pdf_resolve_object($this->current_parser->c,$this->_obj_stack[$filename][$n][1]); + + $this->_newobj($this->_obj_stack[$filename][$n][0]); + + if ($nObj[0] == PDF_TYPE_STREAM) { + $this->pdf_write_value ($nObj); + } else { + $this->pdf_write_value ($nObj[1]); + } + + $this->_out('endobj'); + $this->_obj_stack[$filename][$n] = null; // free memory + unset($this->_obj_stack[$filename][$n]); + reset($this->_obj_stack[$filename]); + } + } + } + } + } + + /** + * Sets the PDF Version to the highest of imported documents + */ + function setVersion() { + $this->PDFVersion = max($this->importVersion, $this->PDFVersion); + } + + /** + * Put resources + */ + function _putresources() { + $this->_putfonts(); + $this->_putimages(); + $this->_putformxobjects(); + $this->_putimportedobjects(); + //Resource dictionary + $this->offsets[2]=strlen($this->buffer); + $this->_out('2 0 obj'); + $this->_out('<<'); + $this->_putresourcedict(); + $this->_out('>>'); + $this->_out('endobj'); + } + + /** + * Private Method that writes the form xobjects + */ + function _putformxobjects() { + $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; + reset($this->tpls); + foreach($this->tpls AS $tplidx => $tpl) { + $p=($this->compress) ? gzcompress($tpl['buffer']) : $tpl['buffer']; + $this->_newobj(); + $this->tpls[$tplidx]['n'] = $this->n; + $this->_out('<<'.$filter.'/Type /XObject'); + $this->_out('/Subtype /Form'); + $this->_out('/FormType 1'); + + $this->_out(sprintf('/BBox [%.2f %.2f %.2f %.2f]', + ($tpl['x'] + (isset($tpl['box']['x'])?$tpl['box']['x']:0))*$this->k, + ($tpl['h'] + (isset($tpl['box']['y'])?$tpl['box']['y']:0) - $tpl['y'])*$this->k, + ($tpl['w'] + (isset($tpl['box']['x'])?$tpl['box']['x']:0))*$this->k, + ($tpl['h'] + (isset($tpl['box']['y'])?$tpl['box']['y']:0) - $tpl['y']-$tpl['h'])*$this->k) + ); + + if (isset($tpl['box'])) + $this->_out(sprintf('/Matrix [1 0 0 1 %.5f %.5f]',-$tpl['box']['x']*$this->k, -$tpl['box']['y']*$this->k)); + + $this->_out('/Resources '); + + if (isset($tpl['resources'])) { + $this->current_parser =& $tpl['parser']; + $this->pdf_write_value($tpl['resources']); + } else { + $this->_out('<_res['tpl'][$tplidx]['fonts']) && count($this->_res['tpl'][$tplidx]['fonts'])) { + $this->_out('/Font <<'); + foreach($this->_res['tpl'][$tplidx]['fonts'] as $font) + $this->_out('/F'.$font['i'].' '.$font['n'].' 0 R'); + $this->_out('>>'); + } + if(isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images']) || + isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) + { + $this->_out('/XObject <<'); + if (isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images'])) { + foreach($this->_res['tpl'][$tplidx]['images'] as $image) + $this->_out('/I'.$image['i'].' '.$image['n'].' 0 R'); + } + if (isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) { + foreach($this->_res['tpl'][$tplidx]['tpls'] as $i => $tpl) + $this->_out($this->tplprefix.$i.' '.$tpl['n'].' 0 R'); + } + $this->_out('>>'); + } + $this->_out('>>'); + } + + $this->_out('/Length '.strlen($p).' >>'); + $this->_putstream($p); + $this->_out('endobj'); + } + } + + /** + * Rewritten to handle existing own defined objects + */ + function _newobj($obj_id=false,$onlynewobj=false) { + if (!$obj_id) { + $obj_id = ++$this->n; + } + + //Begin a new object + if (!$onlynewobj) { + $this->offsets[$obj_id] = strlen($this->buffer); + $this->_out($obj_id.' 0 obj'); + $this->_current_obj_id = $obj_id; // for later use with encryption + } + + } + + /** + * Writes a value + * Needed to rebuild the source document + * + * @param mixed $value A PDF-Value. Structure of values see cases in this method + */ + function pdf_write_value(&$value) + { + + switch ($value[0]) { + + case PDF_TYPE_NUMERIC : + case PDF_TYPE_TOKEN : + // A numeric value or a token. + // Simply output them + $this->_out($value[1]." ", false); + break; + + case PDF_TYPE_ARRAY : + + // An array. Output the proper + // structure and move on. + + $this->_out("[",false); + for ($i = 0; $i < count($value[1]); $i++) { + $this->pdf_write_value($value[1][$i]); + } + + $this->_out("]"); + break; + + case PDF_TYPE_DICTIONARY : + + // A dictionary. + $this->_out("<<",false); + + reset ($value[1]); + + while (list($k, $v) = each($value[1])) { + $this->_out($k . " ",false); + $this->pdf_write_value($v); + } + + $this->_out(">>"); + break; + + case PDF_TYPE_OBJREF : + + // An indirect object reference + // Fill the object stack if needed + $cpfn =& $this->current_parser->filename; + if (!isset($this->_don_obj_stack[$cpfn][$value[1]])) { + $this->_newobj(false,true); + $this->_obj_stack[$cpfn][$value[1]] = array($this->n, $value); + $this->_don_obj_stack[$cpfn][$value[1]] = array($this->n, $value); + } + $objid = $this->_don_obj_stack[$cpfn][$value[1]][0]; + + $this->_out("{$objid} 0 R"); //{$value[2]} + break; + + case PDF_TYPE_STRING : + + // A string. + $this->_out('('.$value[1].')'); + + break; + + case PDF_TYPE_STREAM : + + // A stream. First, output the + // stream dictionary, then the + // stream data itself. + $this->pdf_write_value($value[1]); + $this->_out("stream"); + $this->_out($value[2][1]); + $this->_out("endstream"); + break; + case PDF_TYPE_HEX : + + $this->_out("<".$value[1].">"); + break; + + case PDF_TYPE_NULL : + // The null object. + + $this->_out("null"); + break; + } + } + + + /** + * Private Method + */ + function _out($s,$ln=true) { + //Add a line to the document + if ($this->state==2) { + if (!$this->_intpl) + $this->pages[$this->page] .= $s.($ln == true ? "\n" : ''); + else + $this->tpls[$this->tpl]['buffer'] .= $s.($ln == true ? "\n" : ''); + } else { + $this->buffer.=$s.($ln == true ? "\n" : ''); + } + } + + /** + * rewritten to close opened parsers + * + */ + function _enddoc() { + parent::_enddoc(); + $this->_closeParsers(); + } + + /** + * close all files opened by parsers + */ + function _closeParsers() { + if ($this->state > 2 && count($this->parsers) > 0) { + foreach ($this->parsers as $k => $_){ + $this->parsers[$k]->closeFile(); + $this->parsers[$k] = null; + unset($this->parsers[$k]); + } + return true; + } + return false; + } + +} + +// for PHP5 +if (!class_exists('fpdi')) { + class fpdi extends FPDI {} +} +?> \ No newline at end of file diff --git a/htdocs/includes/fpdf/fpdf/fpdi_pdf_parser.php b/htdocs/includes/fpdf/fpdfi/fpdi_pdf_parser.php similarity index 55% rename from htdocs/includes/fpdf/fpdf/fpdi_pdf_parser.php rename to htdocs/includes/fpdf/fpdfi/fpdi_pdf_parser.php index 71df28d3ff2..8c12298903c 100644 --- a/htdocs/includes/fpdf/fpdf/fpdi_pdf_parser.php +++ b/htdocs/includes/fpdf/fpdfi/fpdi_pdf_parser.php @@ -1,482 +1,379 @@ -fpdi =& $fpdi; - $this->filename = $filename; - - parent::pdf_parser($filename); - - // Get Info - $this->getInfo(); - - // resolve Pages-Dictonary - $pages = $this->pdf_resolve_object($this->c, $this->root[1][1]['/Pages']); - - // Read pages - $this->read_pages($this->c, $pages, $this->pages); - - // count pages; - $this->page_count = count($this->pages); - } - - /** - * Overwrite parent::error() - * - * @param string $msg Error-Message - */ - function error($msg) { - $this->fpdi->error($msg); - } - - /** - * Get pagecount from sourcefile - * - * @return int - */ - function getPageCount() { - return $this->page_count; - } - - - /** - * Set pageno - * - * @param int $pageno Pagenumber to use - */ - function setPageno($pageno) { - $pageno-=1; - - if ($pageno < 0 || $pageno >= $this->getPageCount()) { - $this->fpdi->error("Pagenumber is wrong!"); - } - - $this->pageno = $pageno; - } - - /** - * Get page-resources from current page - * - * @return array - */ - function getPageResources() { - return $this->_getPageResources($this->pages[$this->pageno]); - } - - /** - * Get page-resources from /Page - * - * @param array $obj Array of pdf-data - */ - function _getPageResources ($obj) { // $obj = /Page - $obj = $this->pdf_resolve_object($this->c, $obj); - - // If the current object has a resources - // dictionary associated with it, we use - // it. Otherwise, we move back to its - // parent object. - if (isset ($obj[1][1]['/Resources'])) { - $res = $this->pdf_resolve_object($this->c, $obj[1][1]['/Resources']); - if ($res[0] == PDF_TYPE_OBJECT) - return $res[1]; - return $res; - } else { - if (!isset ($obj[1][1]['/Parent'])) { - return false; - } else { - $res = $this->_getPageResources($obj[1][1]['/Parent']); - if ($res[0] == PDF_TYPE_OBJECT) - return $res[1]; - return $res; - } - } - } - - - function getInfo() { - $avail_infos = array("Title", "Author", "Subject", "Keywords", "Creator", "Producer", "CreationDate", "ModDate", "Trapped"); - - $_infos = $this->pdf_resolve_object($this->c,$this->xref['trailer'][1]['/Info']); - $infos = array(); - - foreach ($avail_infos AS $info) { - if (isset($_infos[1][1]["/".$info])) { - if ($_infos[1][1]["/".$info][0] == PDF_TYPE_STRING) { - $infos[$info] = $this->deescapeString($_infos[1][1]["/".$info][1]); - } else if ($_infos[1][1]["/".$info][0] == PDF_TYPE_HEX) { - $infos[$info] = $this->hex2String($_infos[1][1]["/".$info][1]); - } - } - } - $this->infos = $infos; - } - - /** - * Rebuilds a hexstring to string - * - * @param string $hex hexstring - * @return string - */ - function hex2String($hex) { - $endian = false; - - if (preg_match("/^FEFF/",$hex)) { // is utf-16 aka big endian - $i = 4; - $endian = "big"; - } else if (preg_match("/^FFFE/",$hex)) { // is utf-16 aka little endian - $i = 4; - $endian = "little"; - } else { - $i = 0; - } - - $s = ""; - $l = strlen($hex); - for (; $i < $l; $i+=2) { - if (!$endian) { - $s .= chr(hexdec($hex[$i].(isset($hex[$i+1]) ? $hex[$i+1] : '0'))); - } else { - if ($endian == "big") { - $_c = $hex[$i].$hex[$i+1]; - $i+=2; - $c = $hex[$i].$hex[$i+1]; - - if ($_c != "00") { - $s .= "?"; - continue; - } else { - $s .= chr(hexdec($c)); - continue; - } - } else if ($endian == "little") { - $c = $hex[$i].$hex[$i+1]; - $i+=2; - $_c = $hex[$i].$hex[$i+1]; - - if ($_c != "00") { - $s .= "?"; - continue; - } else { - $s .= chr(hexdec($c)); - continue; - } - } - } - } - - return $s; - } - - function deescapeString($s) { - $torepl = array("/\\\(\d{1,3})/e" => "chr(octdec(\\1))", - "/\\\\\(/" => "(", - "/\\\\\)/" => ")"); - return preg_replace(array_keys($torepl),$torepl,$s); - } - - - - /** - * Get content of current page - * - * If more /Contents is an array, the streams are concated - * - * @return string - */ - function getContent() { - $buffer = ""; - - $contents = $this->getPageContent($this->pages[$this->pageno][1][1]['/Contents']); - foreach($contents AS $tmp_content) { - $buffer .= $this->rebuildContentStream($tmp_content); - } - - return $buffer; - } - - - /** - * Resolve all content-objects - * - * @param array $content_ref - * @return array - */ - function getPageContent($content_ref) { - $contents = array(); - - if ($content_ref[0] == PDF_TYPE_OBJREF) { - $content = $this->pdf_resolve_object($this->c, $content_ref); - if ($content[1][0] == PDF_TYPE_ARRAY) { - $contents = $this->getPageContent($content[1]); - } else { - $contents[] = $content; - } - } else if ($content_ref[0] == PDF_TYPE_ARRAY) { - foreach ($content_ref[1] AS $tmp_content_ref) { - $contents = array_merge($contents,$this->getPageContent($tmp_content_ref)); - } - } - - return $contents; - } - - - /** - * Rebuild content-streams - * only non-compressed streams and /FlateDecode are ready! - * - * @param array $obj - * @return string - */ - function rebuildContentStream($obj) { - $filters = array(); - - if (isset($obj[1][1]['/Filter'])) { - $_filter = $obj[1][1]['/Filter']; - - if ($_filter[0] == PDF_TYPE_TOKEN) { - $filters[] = $_filter; - } else if ($_filter[0] == PDF_TYPE_ARRAY) { - $filters = $_filter[1]; - } - } - - $stream = $obj[2][1]; - - foreach ($filters AS $_filter) { - switch ($_filter[1]) { - case "/FlateDecode": - if (function_exists('gzuncompress')) { - $stream = @gzuncompress($stream); - } else { - $this->fpdi->error(sprintf("To handle %s filter, please compile php with zlib support.",$_filter[1])); - } - if ($stream === false) { - $this->fpdi->error("Error while decompressing string."); - } - - break; - case "/LZWDecode": - @include_once("decoders/lzw.php"); - if (class_exists("LZWDecode")) { - $lzwdec = new LZWDecode($this->fpdi); - $stream = $lzwdec->decode($stream); - } else { - $this->fpdi->error(sprintf("Unsupported Filter: %s",$_filter[1])); - } - break; - case "/ASCII85Decode": - @include_once("decoders/ascii85.php"); - if (class_exists("ASCII85Decode")) { - $ascii85 = new ASCII85Decode($this->fpdi); - $stream = $ascii85->decode(trim($stream)); - } else { - $this->fpdi->error(sprintf("Unsupported Filter: %s",$_filter[1])); - } - break; - case null: - $stream = $stream; - break; - default: - $this->fpdi->error(sprintf("Unsupported Filter: %s",$_filter[1])); - } - } - - return $stream; - } - - /** - * Get MediaBox - * - * gets an array that describes the size of a page. - * - * @param integer $pageno - * @return array @see getPageBox() - */ - function getPageMediaBox($pageno) { - return $this->getPageBox($this->pages[$pageno-1],"/MediaBox"); - } - - - /** - * Get a Box from a page - * Arrayformat is same as used by fpdf_tpl - * - * @param array $page a /Page - * @param string $box_index Type of Box @see getPageBoxes() - * @return array - */ - function getPageBox($page, $box_index) { - $page = $this->pdf_resolve_object($this->c,$page); - - $box = null; - if (isset($page[1][1][$box_index])) - $box =& $page[1][1][$box_index]; - - if (!is_null($box) && $box[0] == PDF_TYPE_OBJREF) { - $tmp_box = $this->pdf_resolve_object($this->c,$box); - $box = $tmp_box[1]; - } - - if (!is_null($box) && $box[0] == PDF_TYPE_ARRAY) { - $b =& $box[1]; - return array("x" => $b[0][1]/$this->fpdi->k, - "y" => $b[1][1]/$this->fpdi->k, - "w" => $b[2][1]/$this->fpdi->k, - "h" => $b[3][1]/$this->fpdi->k); - } else if (!isset ($page[1][1]['/Parent'])) { - return false; - } else { - return $this->getPageBox($this->pdf_resolve_object($this->c, $page[1][1]['/Parent']), $box_index); - } - } - - /** - * Get all Boxes from /Page - * - * @param array a /Page - * @return array - */ - function getPageBoxes($page) { - $_boxes = array("/MediaBox","/CropBox","/BleedBox","/TrimBox","/ArtBox"); - $boxes = array(); - - foreach($_boxes AS $box) { - if ($_box = $this->getPageBox($page,$box)) { - $boxes[$box] = $_box; - } - } - - return $boxes; - } - - - /** - * Read all /Page(es) - * - * @param object pdf_context - * @param array /Pages - * @param array the result-array - */ - function read_pages (&$c, &$pages, &$result) { - - // Get the kids dictionary - $kids = $this->pdf_resolve_object ($c, $pages[1][1]['/Kids']); - - if (!is_array($kids)) - $this->fpdi->Error("Cannot find /Kids in current /Page-Dictionary"); - foreach ($kids[1] as $v) { - $pg = $this->pdf_resolve_object ($c, $v); - #print_r($pg); - - if ($pg[1][1]['/Type'][1] === '/Pages') { - // If one of the kids is an embedded - // /Pages array, resolve it as well. - $this->read_pages ($c, $pg, $result); - } else { - $result[] = $pg; - } - } - } - - - - /** - * Get PDF-Version - * - * And reset the PDF Version used in FPDI if needed - */ - function getPDFVersion() { - parent::getPDFVersion(); - - if (isset($this->fpdi->importVersion) && $this->pdfVersion > $this->fpdi->importVersion) { - $this->fpdi->importVersion = $this->pdfVersion; - } - } - -} - +fpdi =& $fpdi; + $this->filename = $filename; + + parent::pdf_parser($filename); + + // resolve Pages-Dictonary + $pages = $this->pdf_resolve_object($this->c, $this->root[1][1]['/Pages']); + + // Read pages + $this->read_pages($this->c, $pages, $this->pages); + + // count pages; + $this->page_count = count($this->pages); + } + + /** + * Overwrite parent::error() + * + * @param string $msg Error-Message + */ + function error($msg) { + $this->fpdi->error($msg); + } + + /** + * Get pagecount from sourcefile + * + * @return int + */ + function getPageCount() { + return $this->page_count; + } + + + /** + * Set pageno + * + * @param int $pageno Pagenumber to use + */ + function setPageno($pageno) { + $pageno = ((int) $pageno) - 1; + + if ($pageno < 0 || $pageno >= $this->getPageCount()) { + $this->fpdi->error("Pagenumber is wrong!"); + } + + $this->pageno = $pageno; + } + + /** + * Get page-resources from current page + * + * @return array + */ + function getPageResources() { + return $this->_getPageResources($this->pages[$this->pageno]); + } + + /** + * Get page-resources from /Page + * + * @param array $obj Array of pdf-data + */ + function _getPageResources ($obj) { // $obj = /Page + $obj = $this->pdf_resolve_object($this->c, $obj); + + // If the current object has a resources + // dictionary associated with it, we use + // it. Otherwise, we move back to its + // parent object. + if (isset ($obj[1][1]['/Resources'])) { + $res = $this->pdf_resolve_object($this->c, $obj[1][1]['/Resources']); + if ($res[0] == PDF_TYPE_OBJECT) + return $res[1]; + return $res; + } else { + if (!isset ($obj[1][1]['/Parent'])) { + return false; + } else { + $res = $this->_getPageResources($obj[1][1]['/Parent']); + if ($res[0] == PDF_TYPE_OBJECT) + return $res[1]; + return $res; + } + } + } + + + /** + * Get content of current page + * + * If more /Contents is an array, the streams are concated + * + * @return string + */ + function getContent() { + $buffer = ""; + + if (isset($this->pages[$this->pageno][1][1]['/Contents'])) { + $contents = $this->_getPageContent($this->pages[$this->pageno][1][1]['/Contents']); + foreach($contents AS $tmp_content) { + $buffer .= $this->_rebuildContentStream($tmp_content).' '; + } + } + + return $buffer; + } + + + /** + * Resolve all content-objects + * + * @param array $content_ref + * @return array + */ + function _getPageContent($content_ref) { + $contents = array(); + + if ($content_ref[0] == PDF_TYPE_OBJREF) { + $content = $this->pdf_resolve_object($this->c, $content_ref); + if ($content[1][0] == PDF_TYPE_ARRAY) { + $contents = $this->_getPageContent($content[1]); + } else { + $contents[] = $content; + } + } else if ($content_ref[0] == PDF_TYPE_ARRAY) { + foreach ($content_ref[1] AS $tmp_content_ref) { + $contents = array_merge($contents,$this->_getPageContent($tmp_content_ref)); + } + } + + return $contents; + } + + + /** + * Rebuild content-streams + * + * @param array $obj + * @return string + */ + function _rebuildContentStream($obj) { + $filters = array(); + + if (isset($obj[1][1]['/Filter'])) { + $_filter = $obj[1][1]['/Filter']; + + if ($_filter[0] == PDF_TYPE_TOKEN) { + $filters[] = $_filter; + } else if ($_filter[0] == PDF_TYPE_ARRAY) { + $filters = $_filter[1]; + } + } + + $stream = $obj[2][1]; + + foreach ($filters AS $_filter) { + switch ($_filter[1]) { + case "/FlateDecode": + if (function_exists('gzuncompress')) { + $stream = (strlen($stream) > 0) ? @gzuncompress($stream) : ''; + } else { + $this->fpdi->error(sprintf("To handle %s filter, please compile php with zlib support.",$_filter[1])); + } + if ($stream === false) { + $this->fpdi->error("Error while decompressing stream."); + } + break; + case null: + $stream = $stream; + break; + default: + if (preg_match("/^\/[a-z85]*$/i", $_filter[1], $filterName) && @include_once('decoders'.$_filter[1].'.php')) { + $filterName = substr($_filter[1],1); + if (class_exists($filterName)) { + $decoder =& new $filterName($this->fpdi); + $stream = $decoder->decode(trim($stream)); + } else { + $this->fpdi->error(sprintf("Unsupported Filter: %s",$_filter[1])); + } + } else { + $this->fpdi->error(sprintf("Unsupported Filter: %s",$_filter[1])); + } + } + } + + return $stream; + } + + + /** + * Get a Box from a page + * Arrayformat is same as used by fpdf_tpl + * + * @param array $page a /Page + * @param string $box_index Type of Box @see $availableBoxes + * @return array + */ + function getPageBox($page, $box_index) { + $page = $this->pdf_resolve_object($this->c,$page); + $box = null; + if (isset($page[1][1][$box_index])) + $box =& $page[1][1][$box_index]; + + if (!is_null($box) && $box[0] == PDF_TYPE_OBJREF) { + $tmp_box = $this->pdf_resolve_object($this->c,$box); + $box = $tmp_box[1]; + } + + if (!is_null($box) && $box[0] == PDF_TYPE_ARRAY) { + $b =& $box[1]; + return array("x" => $b[0][1]/$this->fpdi->k, + "y" => $b[1][1]/$this->fpdi->k, + "w" => abs($b[0][1]-$b[2][1])/$this->fpdi->k, + "h" => abs($b[1][1]-$b[3][1])/$this->fpdi->k); + } else if (!isset ($page[1][1]['/Parent'])) { + return false; + } else { + return $this->getPageBox($this->pdf_resolve_object($this->c, $page[1][1]['/Parent']), $box_index); + } + } + + function getPageBoxes($pageno) { + return $this->_getPageBoxes($this->pages[$pageno-1]); + } + + /** + * Get all Boxes from /Page + * + * @param array a /Page + * @return array + */ + function _getPageBoxes($page) { + $boxes = array(); + + foreach($this->availableBoxes AS $box) { + if ($_box = $this->getPageBox($page,$box)) { + $boxes[$box] = $_box; + } + } + + return $boxes; + } + + function getPageRotation($pageno) { + return $this->_getPageRotation($this->pages[$pageno-1]); + } + + function _getPageRotation ($obj) { // $obj = /Page + $obj = $this->pdf_resolve_object($this->c, $obj); + if (isset ($obj[1][1]['/Rotate'])) { + $res = $this->pdf_resolve_object($this->c, $obj[1][1]['/Rotate']); + if ($res[0] == PDF_TYPE_OBJECT) + return $res[1]; + return $res; + } else { + if (!isset ($obj[1][1]['/Parent'])) { + return false; + } else { + $res = $this->_getPageRotation($obj[1][1]['/Parent']); + if ($res[0] == PDF_TYPE_OBJECT) + return $res[1]; + return $res; + } + } + } + + /** + * Read all /Page(es) + * + * @param object pdf_context + * @param array /Pages + * @param array the result-array + */ + function read_pages (&$c, &$pages, &$result) { + // Get the kids dictionary + $kids = $this->pdf_resolve_object ($c, $pages[1][1]['/Kids']); + + if (!is_array($kids)) + $this->fpdi->Error("Cannot find /Kids in current /Page-Dictionary"); + foreach ($kids[1] as $v) { + $pg = $this->pdf_resolve_object ($c, $v); + if ($pg[1][1]['/Type'][1] === '/Pages') { + // If one of the kids is an embedded + // /Pages array, resolve it as well. + $this->read_pages ($c, $pg, $result); + } else { + $result[] = $pg; + } + } + } + + + + /** + * Get PDF-Version + * + * And reset the PDF Version used in FPDI if needed + */ + function getPDFVersion() { + parent::getPDFVersion(); + + if (isset($this->fpdi->importVersion) && $this->pdfVersion > $this->fpdi->importVersion) { + $this->fpdi->importVersion = $this->pdfVersion; + } + } + +} + ?> \ No newline at end of file diff --git a/htdocs/includes/fpdf/fpdfi/FPDI_Protection.php b/htdocs/includes/fpdf/fpdfi/fpdi_protection.php similarity index 100% rename from htdocs/includes/fpdf/fpdfi/FPDI_Protection.php rename to htdocs/includes/fpdf/fpdfi/fpdi_protection.php diff --git a/htdocs/includes/fpdf/fpdf/pdf_context.php b/htdocs/includes/fpdf/fpdfi/pdf_context.php similarity index 88% rename from htdocs/includes/fpdf/fpdf/pdf_context.php rename to htdocs/includes/fpdf/fpdfi/pdf_context.php index 9e1a86ee8e4..0e961ca5f08 100644 --- a/htdocs/includes/fpdf/fpdf/pdf_context.php +++ b/htdocs/includes/fpdf/fpdfi/pdf_context.php @@ -1,8 +1,8 @@ file, $pos); } - $this->buffer = fread($this->file, $l); + $this->buffer = $l > 0 ? fread($this->file, $l) : ''; $this->offset = 0; $this->length = strlen($this->buffer); $this->stack = array(); diff --git a/htdocs/includes/fpdf/fpdf/pdf_parser.php b/htdocs/includes/fpdf/fpdfi/pdf_parser.php similarity index 79% rename from htdocs/includes/fpdf/fpdf/pdf_parser.php rename to htdocs/includes/fpdf/fpdfi/pdf_parser.php index f7125370ef5..baddd3a3587 100644 --- a/htdocs/includes/fpdf/fpdf/pdf_parser.php +++ b/htdocs/includes/fpdf/fpdfi/pdf_parser.php @@ -1,634 +1,660 @@ -filename = $filename; - - $this->f = @fopen($this->filename,"rb"); - - if (!$this->f) - $this->error(sprintf("Cannot open %s !",$filename)); - - $this->getPDFVersion(); - - $this->c = new pdf_context($this->f); - // Read xref-Data - $this->pdf_read_xref($this->xref, $this->pdf_find_xref()); - - // Check for Encryption - $this->getEncryption(); - - // Read root - $this->pdf_read_root(); - } - - /** - * Close the opened file - */ - function closeFile() { - if (isset($this->f)) { - fclose($this->f); - } - } - - /** - * Print Error and die - * - * @param string $msg Error-Message - */ - function error($msg) { - die("PDF-Parser Error: ".$msg); - } - - /** - * Check Trailer for Encryption - */ - function getEncryption() { - if (isset($this->xref['trailer'][1]['/Encrypt'])) { - $this->error("File is encrypted!"); - } - } - - /** - * Find/Return /Root - * - * @return array - */ - function pdf_find_root() { - if ($this->xref['trailer'][1]['/Root'][0] != PDF_TYPE_OBJREF) { - $this->Error("Wrong Type of Root-Element! Must be an indirect reference"); - } - return $this->xref['trailer'][1]['/Root']; - } - - /** - * Read the /Root - */ - function pdf_read_root() { - // read root - $this->root = $this->pdf_resolve_object($this->c, $this->pdf_find_root()); - } - - /** - * Get PDF-Version - * - * And reset the PDF Version used in FPDI if needed - */ - function getPDFVersion() { - fseek($this->f, 0); - preg_match("/\d\.\d/",fread($this->f,16),$m); - $this->pdfVersion = $m[0]; - } - - /** - * Find the xref-Table - */ - function pdf_find_xref() { - fseek ($this->f, -50, SEEK_END); - $data = fread($this->f, 50); - - if (!preg_match('/startxref\s*(\d+)\s*%%EOF\s*$/', $data, $matches)) { - $this->error("Unable to find pointer to xref table"); - } - - return (int) $matches[1]; - } - - /** - * Read xref-table - * - * @param array $result Array of xref-table - * @param integer $offset of xref-table - * @param integer $start start-position in xref-table - * @param integer $end end-position in xref-table - */ - function pdf_read_xref(&$result, $offset, $start = null, $end = null) { - if (is_null ($start) || is_null ($end)) { - fseek($this->f, $o_pos = $offset); - $data = trim(fgets($this->f)); - - if ($data !== 'xref') { - fseek($this->f, $o_pos); - $data = trim(_fgets($this->f, true)); - - if ($data !== 'xref') { - $this->error("Unable to find xref table - Maybe a Problem with 'auto_detect_line_endings'"); - } - } - - $o_pos = ftell($this->f); - $data = explode(' ', trim(fgets($this->f))); - if (count($data) != 2) { - fseek($this->f, $o_pos); - $data = explode(' ', trim(_fgets($this->f, true))); - - if (count($data) != 2) - $this->error("Unexpected header in xref table"); - } - $start = $data[0]; - $end = $start + $data[1]; - } - - if (!isset($result['xref_location'])) { - $result['xref_location'] = $offset; - } - - if (!isset($result['max_object']) || $end > $result['max_object']) { - $result['max_object'] = $end; - } - - for (; $start < $end; $start++) { - $data = fread($this->f, 20); // Spezifications says: 20 bytes including newlines - $offset = substr($data, 0, 10); - $generation = substr($data, 11, 5); - - if (!isset ($result['xref'][$start][(int) $generation])) { - $result['xref'][$start][(int) $generation] = (int) $offset; - } - } - - $o_pos = ftell($this->f); - $data = fgets($this->f); - - if (preg_match("/trailer/",$data)) { - if (preg_match("/(.*trailer[ \n\r]+)/",$data,$m)) { - fseek($this->f, $o_pos+strlen($m[1])); - } - - $c =& new pdf_context($this->f); - $trailer = $this->pdf_read_value($c); - - if (isset($trailer[1]['/Prev'])) { - $this->pdf_read_xref($result, $trailer[1]['/Prev'][1]); - $result['trailer'][1] = array_merge($result['trailer'][1], $trailer[1]); - } else { - $result['trailer'] = $trailer; - } - } else { - $data = explode(' ', trim($data)); - - if (count($data) != 2) { - fseek($this->f, $o_pos); - $data = explode(' ', trim (_fgets ($this->f, true))); - - if (count($data) != 2) { - $this->error("Unexpected data in xref table"); - } - } - - $this->pdf_read_xref($result, null, (int) $data[0], (int) $data[0] + (int) $data[1]); - } - } - - - /** - * Reads an Value - * - * @param object $c pdf_context - * @param string $token a Token - * @return mixed - */ - function pdf_read_value(&$c, $token = null) { - if (is_null($token)) { - $token = $this->pdf_read_token($c); - } - - if ($token === false) { - return false; - } - - switch ($token) { - case '<': - // This is a hex string. - // Read the value, then the terminator - - $pos = $c->offset; - - while(1) { - - $match = strpos ($c->buffer, '>', $pos); - - // If you can't find it, try - // reading more data from the stream - - if ($match === false) { - if (!$c->increase_length()) { - return false; - } else { - continue; - } - } - - $result = substr ($c->buffer, $c->offset, $match - $c->offset); - $c->offset = $match+1; - - return array (PDF_TYPE_HEX, $result); - } - - break; - case '<<': - // This is a dictionary. - - $result = array(); - - // Recurse into this function until we reach - // the end of the dictionary. - while (($key = $this->pdf_read_token($c)) !== '>>') { - if ($key === false) { - return false; - } - - if (($value = $this->pdf_read_value($c)) === false) { - return false; - } - $result[$key] = $value; - } - - return array (PDF_TYPE_DICTIONARY, $result); - - case '[': - // This is an array. - - $result = array(); - - // Recurse into this function until we reach - // the end of the array. - while (($token = $this->pdf_read_token($c)) !== ']') { - if ($token === false) { - return false; - } - - if (($value = $this->pdf_read_value($c, $token)) === false) { - return false; - } - - $result[] = $value; - } - - return array (PDF_TYPE_ARRAY, $result); - - case '(' : - // This is a string - - $pos = $c->offset; - - while(1) { - - // Start by finding the next closed - // parenthesis - - $match = strpos ($c->buffer, ')', $pos); - - // If you can't find it, try - // reading more data from the stream - - if ($match === false) { - if (!$c->increase_length()) { - return false; - } else { - continue; - } - } - - // Make sure that there is no backslash - // before the parenthesis. If there is, - // move on. Otherwise, return the string. - - if (isset($c->buffer[$match - 1]) && $c->buffer[$match - 1] !== '\\' || - isset($c->buffer[$match - 1]) && $c->buffer[$match - 1] === '\\' && isset($c->buffer[$match - 2]) && $c->buffer[$match - 2] === '\\') { - $result = substr ($c->buffer, $c->offset, $match - $c->offset); - $c->offset = $match + 1; - return array (PDF_TYPE_STRING, $result); - } else { - $pos = $match + 1; - - if ($pos > $c->offset + $c->length) { - $c->increase_length(); - } - } - } - - case "stream": - $o_pos = ftell($c->file)-strlen($c->buffer); - $o_offset = $c->offset; - - $c->reset($startpos = $o_pos + $o_offset); - - $e = 0; // ensure line breaks in front of the stream - if ($c->buffer[0] == chr(10) || $c->buffer[0] == chr(13)) - $e++; - if ($c->buffer[1] == chr(10) && $c->buffer[0] != chr(10)) - $e++; - - if ($this->actual_obj[1][1]['/Length'][0] == PDF_TYPE_OBJREF) { - $tmp_c = new pdf_context($this->f); - $tmp_length = $this->pdf_resolve_object($tmp_c,$this->actual_obj[1][1]['/Length']); - $length = $tmp_length[1][1]; - } else { - $length = $this->actual_obj[1][1]['/Length'][1]; - } - - $c->reset($startpos+$e,$length); - $v = $c->buffer; - $c->reset($startpos+$e+$length+strlen("endstream")); - - return array(PDF_TYPE_STREAM, $v); - - default : - if (is_numeric ($token)) { - // A numeric token. Make sure that - // it is not part of something else. - if (($tok2 = $this->pdf_read_token ($c)) !== false) { - if (is_numeric ($tok2)) { - - // Two numeric tokens in a row. - // In this case, we're probably in - // front of either an object reference - // or an object specification. - // Determine the case and return the data - if (($tok3 = $this->pdf_read_token ($c)) !== false) { - switch ($tok3) { - case 'obj' : - return array (PDF_TYPE_OBJDEC, (int) $token, (int) $tok2); - case 'R' : - return array (PDF_TYPE_OBJREF, (int) $token, (int) $tok2); - } - // If we get to this point, that numeric value up - // there was just a numeric value. Push the extra - // tokens back into the stack and return the value. - array_push ($c->stack, $tok3); - } - } - - array_push ($c->stack, $tok2); - } - - return array (PDF_TYPE_NUMERIC, $token); - } else { - - // Just a token. Return it. - return array (PDF_TYPE_TOKEN, $token); - } - - } - } - - /** - * Resolve an object - * - * @param object $c pdf_context - * @param array $obj_spec The object-data - * @param boolean $encapsulate Must set to true, cause the parsing and fpdi use this method only without this para - */ - function pdf_resolve_object(&$c, $obj_spec, $encapsulate = true) { - // Exit if we get invalid data - if (!is_array($obj_spec)) { - return false; - } - - if ($obj_spec[0] == PDF_TYPE_OBJREF) { - - // This is a reference, resolve it - if (isset($this->xref['xref'][$obj_spec[1]][$obj_spec[2]])) { - - // Save current file position - // This is needed if you want to resolve - // references while you're reading another object - // (e.g.: if you need to determine the length - // of a stream) - - $old_pos = ftell($c->file); - - // Reposition the file pointer and - // load the object header. - - $c->reset($this->xref['xref'][$obj_spec[1]][$obj_spec[2]]); - - $header = $this->pdf_read_value($c,null,true); - - if ($header[0] != PDF_TYPE_OBJDEC || $header[1] != $obj_spec[1] || $header[2] != $obj_spec[2]) { - $this->error("Unable to find object ({$obj_spec[1]}, {$obj_spec[2]}) at expected location"); - } - - // If we're being asked to store all the information - // about the object, we add the object ID and generation - // number for later use - $this->actual_obj =& $result; - if ($encapsulate) { - $result = array ( - PDF_TYPE_OBJECT, - 'obj' => $obj_spec[1], - 'gen' => $obj_spec[2] - ); - } else { - $result = array(); - } - - // Now simply read the object data until - // we encounter an end-of-object marker - while(1) { - $value = $this->pdf_read_value($c); - if ($value === false || count($result) > 4) { - // in this case the parser coudn't find an endobj so we break here - break; - } - - if ($value[0] == PDF_TYPE_TOKEN && $value[1] === 'endobj') { - break; - } - - $result[] = $value; - } - - $c->reset($old_pos); - - if (isset($result[2][0]) && $result[2][0] == PDF_TYPE_STREAM) { - $result[0] = PDF_TYPE_STREAM; - } - - return $result; - } - } else { - return $obj_spec; - } - } - - - - /** - * Reads a token from the file - * - * @param object $c pdf_context - * @return mixed - */ - function pdf_read_token(&$c) - { - // If there is a token available - // on the stack, pop it out and - // return it. - - if (count($c->stack)) { - return array_pop($c->stack); - } - - // Strip away any whitespace - - do { - if (!$c->ensure_content()) { - return false; - } - $c->offset += _strspn($c->buffer, " \n\r", $c->offset); - } while ($c->offset >= $c->length - 1); - - // Get the first character in the stream - - $char = $c->buffer[$c->offset++]; - - switch ($char) { - - case '[' : - case ']' : - case '(' : - case ')' : - - // This is either an array or literal string - // delimiter, Return it - - return $char; - - case '<' : - case '>' : - - // This could either be a hex string or - // dictionary delimiter. Determine the - // appropriate case and return the token - - if ($c->buffer[$c->offset] == $char) { - if (!$c->ensure_content()) { - return false; - } - $c->offset++; - return $char . $char; - } else { - return $char; - } - - default : - - // This is "another" type of token (probably - // a dictionary entry or a numeric value) - // Find the end and return it. - - if (!$c->ensure_content()) { - return false; - } - - while(1) { - - // Determine the length of the token - - $pos = _strcspn($c->buffer, " []<>()\r\n\t/", $c->offset); - - if ($c->offset + $pos <= $c->length - 1) { - break; - } else { - // If the script reaches this point, - // the token may span beyond the end - // of the current buffer. Therefore, - // we increase the size of the buffer - // and try again--just to be safe. - - $c->increase_length(); - } - } - - $result = substr($c->buffer, $c->offset - 1, $pos + 1); - - $c->offset += $pos; - return $result; - } - } - - -} - +filename = $filename; + + $this->f = @fopen($this->filename, "rb"); + + if (!$this->f) + $this->error(sprintf("Cannot open %s !", $filename)); + + $this->getPDFVersion(); + + $this->c =& new pdf_context($this->f); + // Read xref-Data + $this->pdf_read_xref($this->xref, $this->pdf_find_xref()); + + // Check for Encryption + $this->getEncryption(); + + // Read root + $this->pdf_read_root(); + } + + /** + * Close the opened file + */ + function closeFile() { + if (isset($this->f)) { + fclose($this->f); + unset($this->f); + } + } + + /** + * Print Error and die + * + * @param string $msg Error-Message + */ + function error($msg) { + die("PDF-Parser Error: ".$msg); + } + + /** + * Check Trailer for Encryption + */ + function getEncryption() { + if (isset($this->xref['trailer'][1]['/Encrypt'])) { + $this->error("File is encrypted!"); + } + } + + /** + * Find/Return /Root + * + * @return array + */ + function pdf_find_root() { + if ($this->xref['trailer'][1]['/Root'][0] != PDF_TYPE_OBJREF) { + $this->error("Wrong Type of Root-Element! Must be an indirect reference"); + } + return $this->xref['trailer'][1]['/Root']; + } + + /** + * Read the /Root + */ + function pdf_read_root() { + // read root + $this->root = $this->pdf_resolve_object($this->c, $this->pdf_find_root()); + } + + /** + * Get PDF-Version + * + * And reset the PDF Version used in FPDI if needed + */ + function getPDFVersion() { + fseek($this->f, 0); + preg_match("/\d\.\d/",fread($this->f,16),$m); + $this->pdfVersion = $m[0]; + } + + /** + * Find the xref-Table + */ + function pdf_find_xref() { + fseek ($this->f, -min(filesize($this->filename),1500), SEEK_END); + $data = fread($this->f, 1500); + + $pos = strlen($data) - strpos(strrev($data), strrev('startxref')); + $data = substr($data, $pos); + + if (!preg_match('/\s*(\d+).*$/s', $data, $matches)) { + $this->error("Unable to find pointer to xref table"); + } + + return (int) $matches[1]; + } + + /** + * Read xref-table + * + * @param array $result Array of xref-table + * @param integer $offset of xref-table + * @param integer $start start-position in xref-table + * @param integer $end end-position in xref-table + */ + function pdf_read_xref(&$result, $offset, $start = null, $end = null) { + if (is_null ($start) || is_null ($end)) { + fseek($this->f, $o_pos = $offset); + $data = trim(fgets($this->f,1024)); + + if (strlen($data) == 0) + $data = trim(fgets($this->f,1024)); + + if ($data !== 'xref') { + fseek($this->f, $o_pos); + $data = trim(_fgets($this->f, true)); + if ($data !== 'xref') { + if (preg_match('/(.*xref)(.*)/m', $data, $m)) { // xref 0 128 - in one line + fseek($this->f, $o_pos+strlen($m[1])); + } elseif (preg_match('/(x|r|e|f)+/', $data, $m)) { // correct invalid xref-pointer + $tmpOffset = $offset-4+strlen($m[0]); + $this->pdf_read_xref($result, $tmpOffset, $start, $end); + return; + } else { + $this->error("Unable to find xref table - Maybe a Problem with 'auto_detect_line_endings'"); + } + } + } + + $o_pos = ftell($this->f); + $data = explode(' ', trim(fgets($this->f,1024))); + if (count($data) != 2) { + fseek($this->f, $o_pos); + $data = explode(' ', trim(_fgets($this->f, true))); + + if (count($data) != 2) { + if (count($data) > 2) { // no lineending + $n_pos = $o_pos+strlen($data[0])+strlen($data[1])+2; + fseek($this->f, $n_pos); + } else { + $this->error("Unexpected header in xref table"); + } + } + } + $start = $data[0]; + $end = $start + $data[1]; + } + + if (!isset($result['xref_location'])) { + $result['xref_location'] = $offset; + } + + if (!isset($result['max_object']) || $end > $result['max_object']) { + $result['max_object'] = $end; + } + + for (; $start < $end; $start++) { + $data = ltrim(fread($this->f, 20)); // Spezifications says: 20 bytes including newlines + $offset = substr($data, 0, 10); + $generation = substr($data, 11, 5); + + if (!isset ($result['xref'][$start][(int) $generation])) { + $result['xref'][$start][(int) $generation] = (int) $offset; + } + } + + $o_pos = ftell($this->f); + $data = fgets($this->f,1024); + if (strlen(trim($data)) == 0) + $data = fgets($this->f, 1024); + + if (preg_match("/trailer/",$data)) { + if (preg_match("/(.*trailer[ \n\r]*)/",$data,$m)) { + fseek($this->f, $o_pos+strlen($m[1])); + } + + $c =& new pdf_context($this->f); + $trailer = $this->pdf_read_value($c); + + if (isset($trailer[1]['/Prev'])) { + $this->pdf_read_xref($result, $trailer[1]['/Prev'][1]); + $result['trailer'][1] = array_merge($result['trailer'][1], $trailer[1]); + } else { + $result['trailer'] = $trailer; + } + } else { + $data = explode(' ', trim($data)); + + if (count($data) != 2) { + fseek($this->f, $o_pos); + $data = explode(' ', trim (_fgets ($this->f, true))); + + if (count($data) != 2) { + $this->error("Unexpected data in xref table"); + } + } + + $this->pdf_read_xref($result, null, (int) $data[0], (int) $data[0] + (int) $data[1]); + } + } + + + /** + * Reads an Value + * + * @param object $c pdf_context + * @param string $token a Token + * @return mixed + */ + function pdf_read_value(&$c, $token = null) { + if (is_null($token)) { + $token = $this->pdf_read_token($c); + } + + if ($token === false) { + return false; + } + + switch ($token) { + case '<': + // This is a hex string. + // Read the value, then the terminator + + $pos = $c->offset; + + while(1) { + + $match = strpos ($c->buffer, '>', $pos); + + // If you can't find it, try + // reading more data from the stream + + if ($match === false) { + if (!$c->increase_length()) { + return false; + } else { + continue; + } + } + + $result = substr ($c->buffer, $c->offset, $match - $c->offset); + $c->offset = $match+1; + + return array (PDF_TYPE_HEX, $result); + } + + break; + case '<<': + // This is a dictionary. + + $result = array(); + + // Recurse into this function until we reach + // the end of the dictionary. + while (($key = $this->pdf_read_token($c)) !== '>>') { + if ($key === false) { + return false; + } + + if (($value = $this->pdf_read_value($c)) === false) { + return false; + } + $result[$key] = $value; + } + + return array (PDF_TYPE_DICTIONARY, $result); + + case '[': + // This is an array. + + $result = array(); + + // Recurse into this function until we reach + // the end of the array. + while (($token = $this->pdf_read_token($c)) !== ']') { + if ($token === false) { + return false; + } + + if (($value = $this->pdf_read_value($c, $token)) === false) { + return false; + } + + $result[] = $value; + } + + return array (PDF_TYPE_ARRAY, $result); + + case '(' : + // This is a string + + $pos = $c->offset; + + while(1) { + + // Start by finding the next closed + // parenthesis + + $match = strpos ($c->buffer, ')', $pos); + + // If you can't find it, try + // reading more data from the stream + + if ($match === false) { + if (!$c->increase_length()) { + return false; + } else { + continue; + } + } + + // Make sure that there is no backslash + // before the parenthesis. If there is, + // move on. Otherwise, return the string. + $esc = preg_match('/([\\\\]+)$/', $tmpresult = substr($c->buffer, $c->offset, $match - $c->offset), $m); + + if ($esc === 0 || strlen($m[1]) % 2 == 0) { + $result = $tmpresult; + $c->offset = $match + 1; + return array (PDF_TYPE_STRING, $result); + } else { + $pos = $match + 1; + + if ($pos > $c->offset + $c->length) { + $c->increase_length(); + } + } + } + + case "stream": + $o_pos = ftell($c->file)-strlen($c->buffer); + $o_offset = $c->offset; + + $c->reset($startpos = $o_pos + $o_offset); + + $e = 0; // ensure line breaks in front of the stream + if ($c->buffer[0] == chr(10) || $c->buffer[0] == chr(13)) + $e++; + if ($c->buffer[1] == chr(10) && $c->buffer[0] != chr(10)) + $e++; + + if ($this->actual_obj[1][1]['/Length'][0] == PDF_TYPE_OBJREF) { + $tmp_c =& new pdf_context($this->f); + $tmp_length = $this->pdf_resolve_object($tmp_c,$this->actual_obj[1][1]['/Length']); + $length = $tmp_length[1][1]; + } else { + $length = $this->actual_obj[1][1]['/Length'][1]; + } + + if ($length > 0) { + $c->reset($startpos+$e,$length); + $v = $c->buffer; + } else { + $v = ''; + } + $c->reset($startpos+$e+$length+9); // 9 = strlen("endstream") + + return array(PDF_TYPE_STREAM, $v); + + default : + if (is_numeric ($token)) { + // A numeric token. Make sure that + // it is not part of something else. + if (($tok2 = $this->pdf_read_token ($c)) !== false) { + if (is_numeric ($tok2)) { + + // Two numeric tokens in a row. + // In this case, we're probably in + // front of either an object reference + // or an object specification. + // Determine the case and return the data + if (($tok3 = $this->pdf_read_token ($c)) !== false) { + switch ($tok3) { + case 'obj' : + return array (PDF_TYPE_OBJDEC, (int) $token, (int) $tok2); + case 'R' : + return array (PDF_TYPE_OBJREF, (int) $token, (int) $tok2); + } + // If we get to this point, that numeric value up + // there was just a numeric value. Push the extra + // tokens back into the stack and return the value. + array_push ($c->stack, $tok3); + } + } + + array_push ($c->stack, $tok2); + } + + return array (PDF_TYPE_NUMERIC, $token); + } else { + + // Just a token. Return it. + return array (PDF_TYPE_TOKEN, $token); + } + + } + } + + /** + * Resolve an object + * + * @param object $c pdf_context + * @param array $obj_spec The object-data + * @param boolean $encapsulate Must set to true, cause the parsing and fpdi use this method only without this para + */ + function pdf_resolve_object(&$c, $obj_spec, $encapsulate = true) { + // Exit if we get invalid data + if (!is_array($obj_spec)) { + return false; + } + + if ($obj_spec[0] == PDF_TYPE_OBJREF) { + + // This is a reference, resolve it + if (isset($this->xref['xref'][$obj_spec[1]][$obj_spec[2]])) { + + // Save current file position + // This is needed if you want to resolve + // references while you're reading another object + // (e.g.: if you need to determine the length + // of a stream) + + $old_pos = ftell($c->file); + + // Reposition the file pointer and + // load the object header. + + $c->reset($this->xref['xref'][$obj_spec[1]][$obj_spec[2]]); + + $header = $this->pdf_read_value($c,null,true); + + if ($header[0] != PDF_TYPE_OBJDEC || $header[1] != $obj_spec[1] || $header[2] != $obj_spec[2]) { + $this->error("Unable to find object ({$obj_spec[1]}, {$obj_spec[2]}) at expected location"); + } + + // If we're being asked to store all the information + // about the object, we add the object ID and generation + // number for later use + $this->actual_obj =& $result; + if ($encapsulate) { + $result = array ( + PDF_TYPE_OBJECT, + 'obj' => $obj_spec[1], + 'gen' => $obj_spec[2] + ); + } else { + $result = array(); + } + + // Now simply read the object data until + // we encounter an end-of-object marker + while(1) { + $value = $this->pdf_read_value($c); + if ($value === false || count($result) > 4) { + // in this case the parser coudn't find an endobj so we break here + break; + } + + if ($value[0] == PDF_TYPE_TOKEN && $value[1] === 'endobj') { + break; + } + + $result[] = $value; + } + + $c->reset($old_pos); + + if (isset($result[2][0]) && $result[2][0] == PDF_TYPE_STREAM) { + $result[0] = PDF_TYPE_STREAM; + } + + return $result; + } + } else { + return $obj_spec; + } + } + + + + /** + * Reads a token from the file + * + * @param object $c pdf_context + * @return mixed + */ + function pdf_read_token(&$c) + { + // If there is a token available + // on the stack, pop it out and + // return it. + + if (count($c->stack)) { + return array_pop($c->stack); + } + + // Strip away any whitespace + + do { + if (!$c->ensure_content()) { + return false; + } + $c->offset += _strspn($c->buffer, " \n\r\t", $c->offset); + } while ($c->offset >= $c->length - 1); + + // Get the first character in the stream + + $char = $c->buffer[$c->offset++]; + + switch ($char) { + + case '[' : + case ']' : + case '(' : + case ')' : + + // This is either an array or literal string + // delimiter, Return it + + return $char; + + case '<' : + case '>' : + + // This could either be a hex string or + // dictionary delimiter. Determine the + // appropriate case and return the token + + if ($c->buffer[$c->offset] == $char) { + if (!$c->ensure_content()) { + return false; + } + $c->offset++; + return $char . $char; + } else { + return $char; + } + + default : + + // This is "another" type of token (probably + // a dictionary entry or a numeric value) + // Find the end and return it. + + if (!$c->ensure_content()) { + return false; + } + + while(1) { + + // Determine the length of the token + + $pos = _strcspn($c->buffer, " []<>()\r\n\t/", $c->offset); + if ($c->offset + $pos <= $c->length - 1) { + break; + } else { + // If the script reaches this point, + // the token may span beyond the end + // of the current buffer. Therefore, + // we increase the size of the buffer + // and try again--just to be safe. + + $c->increase_length(); + } + } + + $result = substr($c->buffer, $c->offset - 1, $pos + 1); + + $c->offset += $pos; + return $result; + } + } + + +} + ?> \ No newline at end of file diff --git a/htdocs/includes/fpdf/fpdf/wrapper_functions.php b/htdocs/includes/fpdf/fpdfi/wrapper_functions.php similarity index 93% rename from htdocs/includes/fpdf/fpdf/wrapper_functions.php rename to htdocs/includes/fpdf/fpdfi/wrapper_functions.php index bfef3f8f79b..e069526f781 100644 --- a/htdocs/includes/fpdf/fpdf/wrapper_functions.php +++ b/htdocs/includes/fpdf/fpdfi/wrapper_functions.php @@ -1,8 +1,8 @@ format); - - - // Protection et encryption du pdf + // Protection et encryption du pdf if ($conf->global->PDF_SECURITY_ENCRYPTION) { + $pdf=new FPDI_Protection('P','mm',$this->format); $pdfrights = array('print'); // Ne permet que l'impression du document $pdfuserpass = ''; // Mot de passe pour l'utilisateur final $pdfownerpass = NULL; // Mot de passe du propriétaire, créé aléatoirement si pas défini $pdf->SetProtection($pdfrights,$pdfuserpass,$pdfownerpass); } + else + { + $pdf=new FPDI('P','mm',$this->format); + } $pdf->Open(); diff --git a/htdocs/includes/modules/commande/pdf_einstein.modules.php b/htdocs/includes/modules/commande/pdf_einstein.modules.php index 6aef8e0a139..804f3911a28 100644 --- a/htdocs/includes/modules/commande/pdf_einstein.modules.php +++ b/htdocs/includes/modules/commande/pdf_einstein.modules.php @@ -152,16 +152,20 @@ class pdf_einstein extends ModelePDFCommandes $nblignes = sizeof($com->lignes); // Initialisation document vierge - $pdf=new FPDI_Protection('P','mm',$this->format); // Protection et encryption du pdf if ($conf->global->PDF_SECURITY_ENCRYPTION) { + $pdf=new FPDI_Protection('P','mm',$this->format); $pdfrights = array('print'); // Ne permet que l'impression du document $pdfuserpass = ''; // Mot de passe pour l'utilisateur final $pdfownerpass = NULL; // Mot de passe du propriétaire, créé aléatoirement si pas défini $pdf->SetProtection($pdfrights,$pdfuserpass,$pdfownerpass); } + else + { + $pdf=new FPDI('P','mm',$this->format); + } $pdf->Open(); $pdf->AddPage(); diff --git a/htdocs/includes/modules/facture/modules_facture.php b/htdocs/includes/modules/facture/modules_facture.php index 3e8670f3432..8e54fd63905 100644 --- a/htdocs/includes/modules/facture/modules_facture.php +++ b/htdocs/includes/modules/facture/modules_facture.php @@ -31,7 +31,7 @@ \version $Revision$ */ -require_once(FPDF_PATH.'fpdi_protection.php'); +require_once(DOL_DOCUMENT_ROOT.'/includes/fpdf/fpdfi/fpdi_protection.php'); require_once(DOL_DOCUMENT_ROOT."/product.class.php"); require_once(DOL_DOCUMENT_ROOT."/compta/bank/account.class.php"); // Requis car utilisé dans les classes qui héritent diff --git a/htdocs/includes/modules/facture/pdf_crabe.modules.php b/htdocs/includes/modules/facture/pdf_crabe.modules.php index 250696d45b9..b361af7b583 100644 --- a/htdocs/includes/modules/facture/pdf_crabe.modules.php +++ b/htdocs/includes/modules/facture/pdf_crabe.modules.php @@ -28,7 +28,7 @@ \version $Revision$ */ -require_once(DOL_DOCUMENT_ROOT ."/includes/modules/facture/modules_facture.php"); +require_once(DOL_DOCUMENT_ROOT."/includes/modules/facture/modules_facture.php"); require_once(DOL_DOCUMENT_ROOT."/product.class.php"); @@ -151,17 +151,19 @@ class pdf_crabe extends ModelePDFFactures { $nblignes = sizeof($fac->lignes); - // Initialisation document vierge - $pdf=new FPDI_Protection('P','mm',$this->format); - // Protection et encryption du pdf if ($conf->global->PDF_SECURITY_ENCRYPTION) { + $pdf=new FPDI_Protection('P','mm',$this->format); $pdfrights = array('print'); // Ne permet que l'impression du document $pdfuserpass = ''; // Mot de passe pour l'utilisateur final $pdfownerpass = NULL; // Mot de passe du propriétaire, créé aléatoirement si pas défini $pdf->SetProtection($pdfrights,$pdfuserpass,$pdfownerpass); } + else + { + $pdf=new FPDI('P','mm',$this->format); + } $pdf->Open(); $pdf->AddPage(); diff --git a/htdocs/includes/modules/facture/pdf_huitre.modules.php b/htdocs/includes/modules/facture/pdf_huitre.modules.php index 587f7c958dd..55b8a2da647 100644 --- a/htdocs/includes/modules/facture/pdf_huitre.modules.php +++ b/htdocs/includes/modules/facture/pdf_huitre.modules.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2006 Laurent Destailleur + * Copyright (C) 2004-2007 Laurent Destailleur * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -124,17 +124,19 @@ class pdf_huitre extends ModelePDFFactures if (file_exists($dir)) { - // Initialisation facture vierge - $pdf=new FPDI_Protection('P','mm','A4'); - - // Protection et encryption du pdf + // Protection et encryption du pdf if ($conf->global->PDF_SECURITY_ENCRYPTION) { + $pdf=new FPDI_Protection('P','mm','A4'); $pdfrights = array('print'); // Ne permet que l'impression du document $pdfuserpass = ''; // Mot de passe pour l'utilisateur final $pdfownerpass = NULL; // Mot de passe du propriétaire, créé aléatoirement si pas défini $pdf->SetProtection($pdfrights,$pdfuserpass,$pdfownerpass); } + else + { + $pdf=new FPDI('P','mm',$this->format); + } $pdf->Open(); $pdf->AddPage(); diff --git a/htdocs/includes/modules/facture/pdf_oursin.modules.php b/htdocs/includes/modules/facture/pdf_oursin.modules.php index 927ccbb457d..e3094f014de 100644 --- a/htdocs/includes/modules/facture/pdf_oursin.modules.php +++ b/htdocs/includes/modules/facture/pdf_oursin.modules.php @@ -148,17 +148,20 @@ class pdf_oursin extends ModelePDFFactures if (file_exists($dir)) { - // Initialisation facture vierge - $pdf=new FPDI_Protection('P','mm',$this->format); - // Protection et encryption du pdf - if ($conf->global->PDF_SECURITY_ENCRYPTION) - { + // Protection et encryption du pdf + if ($conf->global->PDF_SECURITY_ENCRYPTION) + { + $pdf=new FPDI_Protection('P','mm',$this->format); $pdfrights = array('print'); // Ne permet que l'impression du document $pdfuserpass = ''; // Mot de passe pour l'utilisateur final $pdfownerpass = NULL; // Mot de passe du propriétaire, créé aléatoirement si pas défini $pdf->SetProtection($pdfrights,$pdfuserpass,$pdfownerpass); } + else + { + $pdf=new FPDI('P','mm',$this->format); + } $pdf->Open(); $pdf->AddPage(); diff --git a/htdocs/includes/modules/fichinter/modules_fichinter.php b/htdocs/includes/modules/fichinter/modules_fichinter.php index 4410a1511ab..8ad0189b11f 100644 --- a/htdocs/includes/modules/fichinter/modules_fichinter.php +++ b/htdocs/includes/modules/fichinter/modules_fichinter.php @@ -30,13 +30,13 @@ \version $Revision$ */ -require_once(FPDF_PATH.'fpdi_protection.php'); +require_once(DOL_DOCUMENT_ROOT.'/includes/fpdf/fpdfi/fpdi_protection.php'); + /** \class ModelePDFFicheinter \brief Classe mère des modèles de fiche intervention */ - class ModelePDFFicheinter extends FPDF { var $error=''; diff --git a/htdocs/includes/modules/fichinter/pdf_soleil.modules.php b/htdocs/includes/modules/fichinter/pdf_soleil.modules.php index 1b46eed7a7d..c9e456c2965 100644 --- a/htdocs/includes/modules/fichinter/pdf_soleil.modules.php +++ b/htdocs/includes/modules/fichinter/pdf_soleil.modules.php @@ -29,7 +29,7 @@ \version $Revision$ */ -require_once(DOL_DOCUMENT_ROOT ."/includes/modules/fichinter/modules_fichinter.php"); +require_once(DOL_DOCUMENT_ROOT."/includes/modules/fichinter/modules_fichinter.php"); /** @@ -100,17 +100,19 @@ class pdf_soleil extends ModelePDFFicheinter if (file_exists($dir)) { - // Initialisation document vierge - $pdf=new FPDI_Protection('P','mm',$this->format); - - // Protection et encryption du pdf + // Protection et encryption du pdf if ($conf->global->PDF_SECURITY_ENCRYPTION) { + $pdf=new FPDI_Protection('P','mm',$this->format); $pdfrights = array('print'); // Ne permet que l'impression du document $pdfuserpass = ''; // Mot de passe pour l'utilisateur final $pdfownerpass = NULL; // Mot de passe du propriétaire, créé aléatoirement si pas défini $pdf->SetProtection($pdfrights,$pdfuserpass,$pdfownerpass); } + else + { + $pdf=new FPDI('P','mm',$this->format); + } $pdf->Open(); $pdf->AddPage(); diff --git a/htdocs/includes/modules/propale/modules_propale.php b/htdocs/includes/modules/propale/modules_propale.php index e71b5eb6858..f798325438b 100644 --- a/htdocs/includes/modules/propale/modules_propale.php +++ b/htdocs/includes/modules/propale/modules_propale.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2005 Laurent Destailleur + * Copyright (C) 2004-2007 Laurent Destailleur * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -29,7 +29,7 @@ \version $Revision$ */ -require_once(FPDF_PATH.'fpdi_protection.php'); +require_once(DOL_DOCUMENT_ROOT.'/includes/fpdf/fpdfi/fpdi_protection.php'); require_once(DOL_DOCUMENT_ROOT."/compta/bank/account.class.php"); // Requis car utilisé dans les classes qui héritent diff --git a/htdocs/includes/modules/propale/pdf_propale_azur.modules.php b/htdocs/includes/modules/propale/pdf_propale_azur.modules.php index 753c6922210..3e512438bc7 100644 --- a/htdocs/includes/modules/propale/pdf_propale_azur.modules.php +++ b/htdocs/includes/modules/propale/pdf_propale_azur.modules.php @@ -150,17 +150,19 @@ class pdf_propale_azur extends ModelePDFPropales { $nblignes = sizeof($propale->lignes); - // Initialisation document vierge - $pdf=new FPDI_Protection('P','mm',$this->format); - - // Protection et encryption du pdf + // Protection et encryption du pdf if ($conf->global->PDF_SECURITY_ENCRYPTION) { + $pdf=new FPDI_Protection('P','mm',$this->format); $pdfrights = array('print'); // Ne permet que l'impression du document $pdfuserpass = ''; // Mot de passe pour l'utilisateur final $pdfownerpass = NULL; // Mot de passe du propriétaire, créé aléatoirement si pas défini $pdf->SetProtection($pdfrights,$pdfuserpass,$pdfownerpass); } + else + { + $pdf=new FPDI('P','mm',$this->format); + } $pdf->Open(); $pdf->AddPage(); diff --git a/htdocs/includes/modules/propale/pdf_propale_bleu.modules.php b/htdocs/includes/modules/propale/pdf_propale_bleu.modules.php index 424b344ecc5..17c4650c6ba 100644 --- a/htdocs/includes/modules/propale/pdf_propale_bleu.modules.php +++ b/htdocs/includes/modules/propale/pdf_propale_bleu.modules.php @@ -115,17 +115,19 @@ class pdf_propale_bleu extends ModelePDFPropales if (file_exists($dir)) { - - $pdf=new FPDI_Protection('P','mm',$this->format); - - // Protection et encryption du pdf + // Protection et encryption du pdf if ($conf->global->PDF_SECURITY_ENCRYPTION) { + $pdf=new FPDI_Protection('P','mm',$this->format); $pdfrights = array('print'); // Ne permet que l'impression du document $pdfuserpass = ''; // Mot de passe pour l'utilisateur final $pdfownerpass = NULL; // Mot de passe du propriétaire, créé aléatoirement si pas défini $pdf->SetProtection($pdfrights,$pdfuserpass,$pdfownerpass); } + else + { + $pdf=new FPDI('P','mm',$this->format); + } $pdf->Open(); $pdf->AddPage(); diff --git a/htdocs/includes/modules/propale/pdf_propale_jaune.modules.php b/htdocs/includes/modules/propale/pdf_propale_jaune.modules.php index 5831f702978..8364d358334 100644 --- a/htdocs/includes/modules/propale/pdf_propale_jaune.modules.php +++ b/htdocs/includes/modules/propale/pdf_propale_jaune.modules.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2006 Laurent Destailleur + * Copyright (C) 2004-2007 Laurent Destailleur * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -116,17 +116,19 @@ class pdf_propale_jaune extends ModelePDFPropales if (file_exists($dir)) { - - $pdf=new FPDI_Protection('P','mm',$this->format); - - // Protection et encryption du pdf + // Protection et encryption du pdf if ($conf->global->PDF_SECURITY_ENCRYPTION) { + $pdf=new FPDI_Protection('P','mm',$this->format); $pdfrights = array('print'); // Ne permet que l'impression du document $pdfuserpass = ''; // Mot de passe pour l'utilisateur final $pdfownerpass = NULL; // Mot de passe du propriétaire, créé aléatoirement si pas défini $pdf->SetProtection($pdfrights,$pdfuserpass,$pdfownerpass); } + else + { + $pdf=new FPDI('P','mm',$this->format); + } $pdf->Open(); diff --git a/htdocs/includes/modules/propale/pdf_propale_rouge.modules.php b/htdocs/includes/modules/propale/pdf_propale_rouge.modules.php index 550e141e6ed..005cf084bac 100644 --- a/htdocs/includes/modules/propale/pdf_propale_rouge.modules.php +++ b/htdocs/includes/modules/propale/pdf_propale_rouge.modules.php @@ -119,16 +119,19 @@ class pdf_propale_rouge extends ModelePDFPropales if (file_exists($dir)) { - $pdf=new FPDI_Protection('P','mm',$this->format); - - // Protection et encryption du pdf + // Protection et encryption du pdf if ($conf->global->PDF_SECURITY_ENCRYPTION) { + $pdf=new FPDI_Protection('P','mm',$this->format); $pdfrights = array('print'); // Ne permet que l'impression du document $pdfuserpass = ''; // Mot de passe pour l'utilisateur final $pdfownerpass = NULL; // Mot de passe du propriétaire, créé aléatoirement si pas défini $pdf->SetProtection($pdfrights,$pdfuserpass,$pdfownerpass); } + else + { + $pdf=new FPDI('P','mm',$this->format); + } $pdf->Open(); $pdf->AddPage(); diff --git a/htdocs/includes/modules/propale/pdf_propale_vert.modules.php b/htdocs/includes/modules/propale/pdf_propale_vert.modules.php index 85d61fcca01..74b807cd9b8 100644 --- a/htdocs/includes/modules/propale/pdf_propale_vert.modules.php +++ b/htdocs/includes/modules/propale/pdf_propale_vert.modules.php @@ -117,17 +117,19 @@ class pdf_propale_vert extends ModelePDFPropales if (file_exists($dir)) { - - $pdf=new FPDI_Protection('P','mm',$this->format); - - // Protection et encryption du pdf + // Protection et encryption du pdf if ($conf->global->PDF_SECURITY_ENCRYPTION) { + $pdf=new FPDI_Protection('P','mm',$this->format); $pdfrights = array('print'); // Ne permet que l'impression du document $pdfuserpass = ''; // Mot de passe pour l'utilisateur final $pdfownerpass = NULL; // Mot de passe du propriétaire, créé aléatoirement si pas défini $pdf->SetProtection($pdfrights,$pdfuserpass,$pdfownerpass); } + else + { + $pdf=new FPDI('P','mm',$this->format); + } $pdf->Open(); $pdf->AddPage(); diff --git a/htdocs/includes/modules/rapport/pdf_paiement.class.php b/htdocs/includes/modules/rapport/pdf_paiement.class.php index 60a164c286f..6c518c1bb76 100644 --- a/htdocs/includes/modules/rapport/pdf_paiement.class.php +++ b/htdocs/includes/modules/rapport/pdf_paiement.class.php @@ -28,7 +28,8 @@ \version $Revision$ */ -require_once(FPDF_PATH.'fpdi_protection.php'); +require_once(DOL_DOCUMENT_ROOT.'/includes/fpdf/fpdfi/fpdi_protection.php'); + /** \class pdf_paiement @@ -180,16 +181,19 @@ class pdf_paiement $year = sprintf("%04d",$year); $_file = $dir . "/payments-".$month."-".$year.".pdf"; - $pdf = new FPDI_Protection('P','mm','A4'); - - // Protection et encryption du pdf + // Protection et encryption du pdf if ($conf->global->PDF_SECURITY_ENCRYPTION) { + $pdf = new FPDI_Protection('P','mm','A4'); $pdfrights = array('print'); // Ne permet que l'impression du document $pdfuserpass = ''; // Mot de passe pour l'utilisateur final $pdfownerpass = NULL; // Mot de passe du propriétaire, créé aléatoirement si pas défini $pdf->SetProtection($pdfrights,$pdfuserpass,$pdfownerpass); } + else + { + $pdf=new FPDI('P','mm',$this->format); + } $pdf->Open(); diff --git a/htdocs/livraison/mods/modules_livraison.php b/htdocs/livraison/mods/modules_livraison.php index 03dd76c58ae..a5bf41344df 100644 --- a/htdocs/livraison/mods/modules_livraison.php +++ b/htdocs/livraison/mods/modules_livraison.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2005 Laurent Destailleur + * Copyright (C) 2004-2007 Laurent Destailleur * Copyright (C) 2004 Eric Seigne * Copyright (C) 2006 Regis Houssin * @@ -21,25 +21,23 @@ * * $Id$ * $Source$ - * */ /** \file htdocs/livraison/mods/modules_livraison.php - \ingroup expedition - \brief Fichier contenant la classe mère de generation de bon de livraison en PDF + \ingroup expedition + \brief Fichier contenant la classe mère de generation de bon de livraison en PDF et la classe mère de numérotation des bons de livraisons - \version $Revision$ + \version $Revision$ */ -require_once(FPDF_PATH.'fpdi_protection.php'); +require_once(DOL_DOCUMENT_ROOT.'/includes/fpdf/fpdfi/fpdi_protection.php'); /** \class ModelePDFDeliveryOrder \brief Classe mère des modèles de bon de livraison */ - class ModelePDFDeliveryOrder extends FPDF { var $error=''; diff --git a/htdocs/livraison/mods/pdf/pdf_sirocco.modules.php b/htdocs/livraison/mods/pdf/pdf_sirocco.modules.php index 8b2c73e6b3d..570b94e5674 100644 --- a/htdocs/livraison/mods/pdf/pdf_sirocco.modules.php +++ b/htdocs/livraison/mods/pdf/pdf_sirocco.modules.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2005 Laurent Destailleur + * Copyright (C) 2004-2007 Laurent Destailleur * Copyright (C) 2005-2006 Regis Houssin * Copyright (C) 2007 Franky Van Liedekerke * @@ -30,7 +30,7 @@ \version $Revision$ */ -require_once(DOL_DOCUMENT_ROOT ."/livraison/mods/modules_livraison.php"); +require_once(DOL_DOCUMENT_ROOT."/livraison/mods/modules_livraison.php"); /** @@ -106,17 +106,19 @@ class pdf_sirocco extends ModelePDFDeliveryOrder if (file_exists($dir)) { - - $pdf=new FPDI_Protection('P','mm',$this->format); - - // Protection et encryption du pdf + // Protection et encryption du pdf if ($conf->global->PDF_SECURITY_ENCRYPTION) { + $pdf=new FPDI_Protection('P','mm',$this->format); $pdfrights = array('print'); // Ne permet que l'impression du document $pdfuserpass = ''; // Mot de passe pour l'utilisateur final $pdfownerpass = NULL; // Mot de passe du propriétaire, créé aléatoirement si pas défini $pdf->SetProtection($pdfrights,$pdfuserpass,$pdfownerpass); } + else + { + $pdf=new FPDI('P','mm',$this->format); + } $pdf->Open(); $pdf->AddPage(); diff --git a/htdocs/livraison/mods/pdf/pdf_typhon.modules.php b/htdocs/livraison/mods/pdf/pdf_typhon.modules.php index 2d286476ff1..74a3a2b41d3 100644 --- a/htdocs/livraison/mods/pdf/pdf_typhon.modules.php +++ b/htdocs/livraison/mods/pdf/pdf_typhon.modules.php @@ -1,5 +1,5 @@ +/* Copyright (C) 2004-2007 Laurent Destailleur * Copyright (C) 2005-2006 Regis Houssin * Copyright (C) 2007 Franky Van Liedekerke * @@ -30,7 +30,7 @@ \version $Revision$ */ -require_once(DOL_DOCUMENT_ROOT ."/livraison/mods/modules_livraison.php"); +require_once(DOL_DOCUMENT_ROOT."/livraison/mods/modules_livraison.php"); require_once(DOL_DOCUMENT_ROOT."/livraison/livraison.class.php"); @@ -161,17 +161,19 @@ class pdf_typhon extends ModelePDFDeliveryOrder if (file_exists($dir)) { - // Initialisation document vierge - $pdf=new FPDI_Protection('P','mm',$this->format); - - // Protection et encryption du pdf + // Protection et encryption du pdf if ($conf->global->PDF_SECURITY_ENCRYPTION) { + $pdf=new FPDI_Protection('P','mm',$this->format); $pdfrights = array('print'); // Ne permet que l'impression du document $pdfuserpass = ''; // Mot de passe pour l'utilisateur final $pdfownerpass = NULL; // Mot de passe du propriétaire, créé aléatoirement si pas défini $pdf->SetProtection($pdfrights,$pdfuserpass,$pdfownerpass); } + else + { + $pdf=new FPDI('P','mm',$this->format); + } $pdf->Open(); $pdf->AddPage();