linea21-core
[ class tree: linea21-core ] [ index: linea21-core ] [ all elements ]

Source for file idd_pdf.php

Documentation is available at idd_pdf.php

  1. <?php
  2.  
  3. /**
  4.  * @package linea21.core
  5.  * @subpackage system
  6.  * @see tcpdf
  7.  * @author linea21 <info@linea21.com>
  8.  * @version $id SVN
  9.  * @access public
  10.  * @license http://opensource.org/licenses/gpl-3.0.html
  11.  */
  12.  
  13. require('tcpdf.php');
  14.  
  15. class idd_pdf extends TCPDF {
  16.  
  17.   // //////////////////////////////////
  18.   // formattage titres item & info
  19.   // //////////////////////////////////
  20.   function FormatSdiItem($libelle)
  21.   {
  22.     $libelle="        ".$libelle;
  23.     $this->SetFont(DOC_POLICESDI_ITEM_STYLESDI_ITEM_SIZE);
  24.     $this->SetColor('SDI_ITEM_COLOR');
  25.     $this->MultiCell(0,DOC_HEIGHT,$libelle,0,'L',0);
  26.     $this->SetColor('DOC_COLOR');
  27.     $this->SetFont(DOC_POLICE,DOC_STYLE,DOC_SIZE);
  28.   }
  29.  
  30.   function FormatSdiInfo($libelle)
  31.   {
  32.     $this->SetColor('BCKG_INFO''BCKG');
  33.     $this->SetFont(DOC_POLICESDI_INFO_STYLESDI_INFO_SIZE);
  34.     $this->SetColor('SDI_INFO_COLOR');
  35.     $this->MultiCell(0,DOC_HEIGHT+1,$libelle,0,'L',1);
  36.     $this->SetColor('DOC_COLOR');
  37.     $this->SetFont(DOC_POLICE,DOC_STYLE,DOC_SIZE);
  38.     $this->Ln(DOC_INTERVAL);
  39.   }
  40.  
  41.   // Saut de paragraphe
  42.   function ParagraphBreak()
  43.   {
  44.     $this->SetColor('DOC_COLOR');
  45.     $this->SetFont(DOC_POLICE,DOC_STYLE,DOC_SIZE);
  46.     $this->Ln(PARAGRAPH_BREAK);
  47.   }
  48.  
  49.  
  50.   // //////////////////////////////////
  51.   // gestion header & footer
  52.   // //////////////////////////////////
  53.   function Footer()
  54.   {
  55.     global $report_settings;
  56.     global $lang;
  57.  
  58.     $content $report_settings['author'];
  59.     if(!empty($report_settings['mail_author']))  {
  60.       $content .= ' ('.$report_settings['mail_author'].')';
  61.       $mailto='mailto:'.$report_settings['mail_author'];
  62.     else $mailto='';
  63.     $content_comp!empty($report_settings['service_author']' -- '.$report_settings['service_author''';
  64.     $content_comp.= !empty($report_settings['adress_author']' -- '.$report_settings['adress_author''';
  65.  
  66.     $this->SetColor('DOC_COLOR_HEADER');
  67.     $this->SetFont(DOC_POLICEEM_STYLEMIN_SIZE);
  68.     $this->SetY(-10);
  69.     $this->Line($this->GetX()$this->GetY()$this->GetX()+190$this->GetY());
  70.     $this->Cell($this->GetStringWidth($content)4$content00'L'0$mailto);
  71.     $this->Cell(04$content_comp00'L');
  72.  
  73.     // Numéro et nombre de pages
  74.     $this->Cell(04$lang['divers']['page'].' ' $this->PageNo('/{nb}'00'R');
  75.   }
  76.  
  77.   function Header()
  78.   {
  79.     global $report_settings;
  80.     global $lang;
  81.  
  82.     $today date("d-m-Y");
  83.     $content formatText($report_settings['title'].' - 'SITE_NAME;
  84.  
  85.     $this->SetColor('DOC_COLOR_HEADER');
  86.     $this->SetFont(DOC_POLICEEM_STYLEMIN_SIZE);
  87.  
  88.     //$this->Cell(0, 4, $lang['statut']['published_on'].' '. $today, 0, 0, 'L');
  89.     $this->Cell(04$today00'L');
  90.     $this->Cell(04$content01'R');
  91.     $this->Line($this->GetX()$this->GetY()$this->GetX()+190$this->GetY());
  92.     //$this->Image('inc_report/logo_p.png', $this->GetX(), $this->GetY());
  93.     $this->Ln(PARAGRAPH_BREAK);
  94.   }
  95.   // //////////////////////////////////
  96.   // gestion dynamique des couleurs
  97.   // //////////////////////////////////
  98.   /**
  99.   * idd_pdf::SetColor()
  100.   *
  101.   * @param string $ink 
  102.   * @param string $type 'TRACE' | 'FONT' | 'BCKG'
  103.   * @return 
  104.   */
  105.   function SetColor($ink 'DOC_COLOR'$type 'FONT')
  106.   {
  107.     switch ($ink{
  108.       case 'DOC_COLOR':
  109.         $r 0;
  110.         $g 0;
  111.         $b 0;
  112.         break;
  113.       case 'DOC_COLOR_HEADER':
  114.         $r 34;
  115.         $g 122;
  116.         $b 155;
  117.         break;
  118.       case 'DOC_COLOR_BORDER';
  119.       $r 34;
  120.       $g 122;
  121.       $b 155;
  122.       break;
  123.       case 'DOC_TITLE_COLOR';
  124.       $r 34;
  125.       $g 122;
  126.       $b 155;
  127.       break;
  128.       case 'DOC_ADVISE_COLOR':
  129.         $r 113;
  130.         $g 114;
  131.         $b 115;
  132.         break;
  133.       case 'SDI_TITLE_COLOR':
  134.         $r 82;
  135.         $g 117;
  136.         $b 181;
  137.         break;
  138.       case 'SDI_ITEM_COLOR':
  139.         $r 236;
  140.         $g 158;
  141.         $b 22;
  142.         break;
  143.       case 'SDI_INFO_COLOR':
  144.         $r 255;
  145.         $g 255;
  146.         $b 255;
  147.         break;
  148.       case 'BCKG_PROVIDER':
  149.         $r 226;
  150.         $g 234;
  151.         $b 249;
  152.         break;
  153.       case 'BCKG_ITEM':
  154.         $r 226;
  155.         $g 234;
  156.         $b 249;
  157.         break;
  158.       case 'BCKG_INFO':
  159.         $r 119;
  160.         $g 152;
  161.         $b 183;
  162.         break;
  163.     }
  164.     switch ($type{
  165.       case 'FONT':
  166.         $this->SetTextColor($r$g$b);
  167.         break;
  168.       case 'TRACE':
  169.         $this->SetDrawColor($r$g$b);
  170.         break;
  171.       case 'BCKG':
  172.         $this->SetFillColor($r$g$b);
  173.         break;
  174.     }
  175.   }
  176.  
  177.  
  178.   // //////////////////////////////////
  179.   // gestion signets
  180.   // //////////////////////////////////
  181.   var $outlines = array();
  182.   var $OutlineRoot;
  183.  
  184.   function Bookmark($txt$level 0$y 0)
  185.   {
  186.     if ($y == -1)
  187.     $y $this->GetY();
  188.     $this->outlines[array('t' => $txt'l' => $level'y' => $y'p' => $this->PageNo());
  189.   }
  190.  
  191.   function _putbookmarks()
  192.   {
  193.     $nb count($this->outlines);
  194.     if ($nb == 0)
  195.     return;
  196.     $lru array();
  197.     $level 0;
  198.     foreach($this->outlines as $i => $o{
  199.       if ($o['l'0{
  200.         $parent $lru[$o['l']-1];
  201.         // Set parent and last pointers
  202.         $this->outlines[$i]['parent'$parent;
  203.         $this->outlines[$parent]['last'$i;
  204.         if ($o['l'$level{
  205.           // Level increasing: set first pointer
  206.           $this->outlines[$parent]['first'$i;
  207.         }
  208.       else
  209.       $this->outlines[$i]['parent'$nb;
  210.       if ($o['l'<= $level and $i 0{
  211.         // Set prev and next pointers
  212.         $prev $lru[$o['l']];
  213.         $this->outlines[$prev]['next'$i;
  214.         $this->outlines[$i]['prev'$prev;
  215.       }
  216.       $lru[$o['l']] $i;
  217.       $level $o['l'];
  218.     }
  219.     // Outline items
  220.     $n $this->1;
  221.     foreach($this->outlines as $i => $o{
  222.       $this->_newobj();
  223.       $this->_out('<</Title ' $this->_textstring($o['t']));
  224.       //$this->_out('<</Title ' . $this->_escapetext($o['t']));
  225.       $this->_out('/Parent ' ($n $o['parent']' 0 R');
  226.       if (isset($o['prev']))
  227.       $this->_out('/Prev ' ($n $o['prev']' 0 R');
  228.       if (isset($o['next']))
  229.       $this->_out('/Next ' ($n $o['next']' 0 R');
  230.       if (isset($o['first']))
  231.       $this->_out('/First ' ($n $o['first']' 0 R');
  232.       if (isset($o['last']))
  233.       $this->_out('/Last ' ($n $o['last']' 0 R');
  234.       $this->_out(sprintf('/Dest [%d 0 R /XYZ 0 %.2f null]'$o['p']($this->$o['y']$this->k));
  235.       $this->_out('/Count 0>>');
  236.       $this->_out('endobj');
  237.     }
  238.     // Outline root
  239.     $this->_newobj();
  240.     $this->OutlineRoot = $this->n;
  241.     $this->_out('<</Type /Outlines /First ' $n ' 0 R');
  242.     $this->_out('/Last ' ($n $lru[0]' 0 R>>');
  243.     $this->_out('endobj');
  244.   }
  245.  
  246.   function _putresources()
  247.   {
  248.     parent::_putresources();
  249.     $this->_putbookmarks();
  250.   }
  251.  
  252.   function _putcatalog()
  253.   {
  254.     parent::_putcatalog();
  255.     if (count($this->outlines0{
  256.       $this->_out('/Outlines ' $this->OutlineRoot . ' 0 R');
  257.       $this->_out('/PageMode /UseOutlines');
  258.     }
  259.   }
  260.  
  261.  
  262.  
  263.   // //////////////////////////////////
  264.   // creation de l'index
  265.   // //////////////////////////////////
  266.   function CreateIndex($depth=100){
  267.  
  268.     global $lang;
  269.     global $link_array;
  270.  
  271.     //Titre
  272.     $this->SetFont(DOC_POLICEDOC_TITLE_STYLEDOC_TITLE_SIZE);
  273.     $this->SetColor('DOC_TITLE_COLOR');
  274.     $this->Cell(0DOC_HEIGHT$lang['dashboard']['rap_summary']02'C');
  275.     $this->SetFont(DOC_POLICEEM_STYLEMIN_SIZE);
  276.     $this->Ln(10);
  277.  
  278.  
  279.  
  280.  
  281.     $size=sizeof($this->outlines)-1// -1 pour supprimer le bookmark de l'index
  282.     $PageCellSize=$this->GetStringWidth('p. '.$this->outlines[$size-1]['p'])+2;
  283.  
  284.     $cnt_level1=0;
  285.     for ($i=0;$i<$size;$i++){
  286.  
  287.       //Décalage
  288.       $level=$this->outlines[$i]['l'];
  289.       if($level<$depth{
  290.         if($level>0)
  291.         $this->Cell($level*8);
  292.             
  293.         // Titre de l'indicateur
  294.         if($level==0{
  295.           $cnt_level1++;
  296.           $link=$cnt_level1;
  297.                    $this->SetColor('SDI_ITEM_COLOR');
  298.         else $link='';
  299.  
  300.             
  301.             
  302.         //Libellé
  303.         $str=$this->outlines[$i]['t'];
  304.         $strsize=$this->GetStringWidth($str);
  305.         $avail_size=$this->w-$this->lMargin-$this->rMargin-$PageCellSize-($level*8)-4;
  306.         while ($strsize>=$avail_size){
  307.           $str=substr($str,0,-1);
  308.           $strsize=$this->GetStringWidth($str);
  309.         }
  310.         $this->Cell($strsize+2,$this->FontSize+2,$str00'L'0$link);
  311.         $this->SetColor('DOC_TITLE_COLOR');
  312.  
  313.         //Points
  314.         $w=$this->w-$this->lMargin-$this->rMargin-$PageCellSize-($level*8)-($strsize+2);
  315.         $nb=$w/$this->GetStringWidth('.');
  316.         $dots=str_repeat('.',$nb);
  317.         $this->Cell($w,$this->FontSize+2,$dots,0,0,'R');
  318.  
  319.         //Numéro de page
  320.         $this->Cell($PageCellSize,$this->FontSize+2,'p. '.$this->outlines[$i]['p'],0,1,'R');
  321.       }
  322.     }
  323.     $this->SetFont(DOC_POLICEDOC_TITLE_STYLEDOC_TITLE_SIZE);
  324.   }
  325.  
  326.   // //////////////////////////////////
  327.   // Tableau avec multicells
  328.   // //////////////////////////////////
  329.   var $widths;
  330.   var $aligns;
  331.  
  332.   function SetWidths($w)
  333.   {
  334.     // Tableau des largeurs de colonnes
  335.     $this->widths = $w;
  336.   }
  337.  
  338.   function SetAligns($a)
  339.   {
  340.     // Tableau des alignements de colonnes
  341.     $this->aligns = $a;
  342.   }
  343.  
  344.   function Row($data)
  345.   {
  346.     // Calcule la hauteur de la ligne
  347.     $nb 0;
  348.     for($i 0;$i count($data);$i++)
  349.     $nb max($nb$this->NbLines($this->widths[$i]$data[$i]));
  350.     $h $nb;
  351.     // Effectue un saut de page si nécessaire
  352.     $this->CheckPageBreak($h);
  353.     // Dessine les cellules
  354.     for($i 0;$i count($data);$i++{
  355.       $w $this->widths[$i];
  356.       $a = isset($this->aligns[$i]$this->aligns[$i'L';
  357.       // Sauve la position courante
  358.       $x $this->GetX();
  359.       $y $this->GetY();
  360.       // Dessine le cadre
  361.       $this->Rect($x$y$w$h);
  362.       // Imprime le texte
  363.       $this->MultiCell($w5$data[$i]0$a);
  364.       // Repositionne à droite
  365.       $this->SetXY($x $w$y);
  366.     }
  367.     // Va à la ligne
  368.     $this->Ln($h);
  369.   }
  370.  
  371.   function CheckPageBreak($h)
  372.   {
  373.     // Si la hauteur h provoque un d�bordement, saut de page manuel
  374.     if ($this->GetY($h $this->PageBreakTrigger)
  375.     $this->AddPage($this->CurOrientation);
  376.   }
  377.  
  378.   function NbLines($w$txt)
  379.   {
  380.     // Calcule le nombre de lignes qu'occupe un MultiCell de largeur w
  381.     $cw &$this->CurrentFont['cw'];
  382.     if ($w == 0)
  383.     $w $this->$this->rMargin $this->x;
  384.     $wmax ($w-$this->cMargin1000 $this->FontSize;
  385.     $s str_replace("\r"''$txt);
  386.     $nb strlen($s);
  387.     if ($nb and $s[$nb-1== "\n")
  388.     $nb--;
  389.     $sep = -1;
  390.     $i 0;
  391.     $j 0;
  392.     $l 0;
  393.     $nl 1;
  394.     while ($i $nb{
  395.       $c $s[$i];
  396.       if ($c == "\n"{
  397.         $i++;
  398.         $sep = -1;
  399.         $j $i;
  400.         $l 0;
  401.         $nl++;
  402.         continue;
  403.       }
  404.       if ($c == ' ')
  405.       $sep $i;
  406.       //$l += $cw[$c];
  407.       $l += $cw[ord($c)];
  408.       if ($l $wmax{
  409.         if ($sep == -1{
  410.           if ($i == $j)
  411.           $i++;
  412.         else
  413.         $i $sep 1;
  414.         $sep = -1;
  415.         $j $i;
  416.         $l 0;
  417.         $nl++;
  418.       else
  419.       $i++;
  420.     }
  421.     return $nl;
  422.   }
  423.  
  424.  
  425.   // //////////////////////////////////
  426.   // import d'image en memoire
  427.   // //////////////////////////////////
  428.   // (c) Xavier Nicolay
  429.   // V1.0 : 2004-01-17
  430.   // CONSTRUCTOR
  431.   function MEM_IMAGE($orientation 'P'$unit 'mm'$format 'A4')
  432.   {
  433.     $this->FPDF($orientation$unit$format);
  434.     // Register var stream protocol (requires PHP>=4.3.2)
  435.     if (function_exists('stream_wrapper_register'))
  436.     stream_wrapper_register('var''VariableStream');
  437.   }
  438.   // PRIVATE FUNCTIONS
  439.   function _readstr($var&$pos$n)
  440.   {
  441.     // Read some bytes from string
  442.     $string substr($var$pos$n);
  443.     $pos += $n;
  444.     return $string;
  445.   }
  446.  
  447.   function _readstr_int($var&$pos)
  448.   {
  449.     // Read a 4-byte integer from string
  450.     $i ord($this->_readstr($var$pos1)) << 24;
  451.     $i += ord($this->_readstr($var$pos1)) << 16;
  452.     $i += ord($this->_readstr($var$pos1)) << 8;
  453.     $i += ord($this->_readstr($var$pos1));
  454.     return $i;
  455.   }
  456.  
  457.   function _parsemempng($var)
  458.   {
  459.     $pos 0;
  460.     // Check signature
  461.     $sig $this->_readstr($var$pos8);
  462.     if ($sig != chr(137'PNG' chr(13chr(10chr(26chr(10))
  463.     $this->Error('Not a PNG image');
  464.     // Read header chunk
  465.     $this->_readstr($var$pos4);
  466.     $ihdr $this->_readstr($var$pos4);
  467.     if ($ihdr != 'IHDR')
  468.     $this->Error('Incorrect PNG Image');
  469.     $w $this->_readstr_int($var$pos);
  470.     $h $this->_readstr_int($var$pos);
  471.     $bpc ord($this->_readstr($var$pos1));
  472.     if ($bpc 8)
  473.     $this->Error('16-bit depth not supported: ' $file);
  474.     $ct ord($this->_readstr($var$pos1));
  475.     if ($ct == 0)
  476.     $colspace 'DeviceGray';
  477.     elseif ($ct == 2)
  478.     $colspace 'DeviceRGB';
  479.     elseif ($ct == 3)
  480.     $colspace 'Indexed';
  481.     else
  482.     $this->Error('Alpha channel not supported: ' $file);
  483.     if (ord($this->_readstr($var$pos1)) != 0)
  484.     $this->Error('Unknown compression method: ' $file);
  485.     if (ord($this->_readstr($var$pos1)) != 0)
  486.     $this->Error('Unknown filter method: ' $file);
  487.     if (ord($this->_readstr($var$pos1)) != 0)
  488.     $this->Error('Interlacing not supported: ' $file);
  489.     $this->_readstr($var$pos4);
  490.     $parms '/DecodeParms <</Predictor 15 /Colors ' ($ct == 1' /BitsPerComponent ' $bpc ' /Columns ' $w '>>';
  491.     // Scan chunks looking for palette, transparency and image data
  492.     $pal '';
  493.     $trns '';
  494.     $data '';
  495.     do {
  496.       $n $this->_readstr_int($var$pos);
  497.       $type $this->_readstr($var$pos4);
  498.       if ($type == 'PLTE'{
  499.         // Read palette
  500.         $pal $this->_readstr($var$pos$n);
  501.         $this->_readstr($var$pos4);
  502.       elseif ($type == 'tRNS'{
  503.         // Read transparency info
  504.         $t $this->_readstr($var$pos$n);
  505.         if ($ct == 0)
  506.         $trns array(ord(substr($t11)));
  507.         elseif ($ct == 2)
  508.         $trns array(ord(substr($t11))ord(substr($t31))ord(substr($t51)));
  509.         else {
  510.           $pos strpos($tchr(0));
  511.           if (is_int($pos))
  512.           $trns array($pos);
  513.         }
  514.         $this->_readstr($var$pos4);
  515.       elseif ($type == 'IDAT'{
  516.         // Read image data block
  517.         $data .= $this->_readstr($var$pos$n);
  518.         $this->_readstr($var$pos4);
  519.       elseif ($type == 'IEND')
  520.       break;
  521.       else
  522.       $this->_readstr($var$pos$n 4);
  523.     while ($n);
  524.     if ($colspace == 'Indexed' and empty($pal))
  525.     $this->Error('Missing palette in ' $file);
  526.     return array('w' => $w,
  527.             'h' => $h,
  528.             'cs' => $colspace,
  529.             'bpc' => $bpc,
  530.             'f' => 'FlateDecode',
  531.             'parms' => $parms,
  532.             'pal' => $pal,
  533.             'trns' => $trns,
  534.             'data' => $data);
  535.   }
  536.  
  537.   /**
  538.    */
  539.   /* PUBLIC FUNCTIONS */
  540.   /**
  541.    */
  542.   function MemImage($data$x$y$w 0$h 0$link '')
  543.   {
  544.     // Put the PNG image stored in $data
  545.     $id md5($data);
  546.     if (!isset($this->images[$id])) {
  547.       $info $this->_parsemempng($data);
  548.       $info['i'count($this->images1;
  549.       $this->images[$id$info;
  550.     else
  551.     $info $this->images[$id];
  552.     // Automatic width and height calculation if needed
  553.     if ($w == and $h == 0{
  554.       // Put image at 72 dpi
  555.       $w $info['w'$this->k;
  556.       $h $info['h'$this->k;
  557.     }
  558.     if ($w == 0)
  559.     $w $h $info['w'$info['h'];
  560.     if ($h == 0)
  561.     $h $w $info['h'$info['w'];
  562.  
  563.     $this->_out(sprintf('q %.2f 0 0 %.2f %.2f %.2f cm /I%d Do Q'$w $this->k$h $this->k$x $this->k($this->($y $h)) $this->k$info['i']));
  564.     if ($link)
  565.     $this->Link($x$y$w$h$link);
  566.   }
  567.  
  568. }
  569.  
  570. ?>

Documentation generated on Fri, 01 Apr 2011 09:31:30 +0200 by phpDocumentor 1.4.1