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_CITY_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. ?>

Documentation generated on Fri, 16 Oct 2009 09:33:49 +0200 by phpDocumentor 1.4.1