414 lines
9.9 KiB
PHP
414 lines
9.9 KiB
PHP
<?php
|
|
require('include/tcpdf/tcpdf.php');
|
|
// Xavier Nicolay 2004
|
|
// Version 1.01
|
|
class PDF extends TCPDF
|
|
{
|
|
// private variables
|
|
var $columns;
|
|
var $format;
|
|
var $angle=0;
|
|
|
|
// private functions
|
|
function RoundedRect($x, $y, $w, $h, $r, $style = '')
|
|
{
|
|
$k = $this->k;
|
|
$hp = $this->h;
|
|
if($style=='F')
|
|
$op='f';
|
|
elseif($style=='FD' or $style=='DF')
|
|
$op='B';
|
|
else
|
|
$op='S';
|
|
$MyArc = 4/3 * (sqrt(2) - 1);
|
|
$this->_out(sprintf('%.2f %.2f m',($x+$r)*$k,($hp-$y)*$k ));
|
|
$xc = $x+$w-$r ;
|
|
$yc = $y+$r;
|
|
$this->_out(sprintf('%.2f %.2f l', $xc*$k,($hp-$y)*$k ));
|
|
|
|
$this->_Arc($xc + $r*$MyArc, $yc - $r, $xc + $r, $yc - $r*$MyArc, $xc + $r, $yc);
|
|
$xc = $x+$w-$r ;
|
|
$yc = $y+$h-$r;
|
|
$this->_out(sprintf('%.2f %.2f l',($x+$w)*$k,($hp-$yc)*$k));
|
|
$this->_Arc($xc + $r, $yc + $r*$MyArc, $xc + $r*$MyArc, $yc + $r, $xc, $yc + $r);
|
|
$xc = $x+$r ;
|
|
$yc = $y+$h-$r;
|
|
$this->_out(sprintf('%.2f %.2f l',$xc*$k,($hp-($y+$h))*$k));
|
|
$this->_Arc($xc - $r*$MyArc, $yc + $r, $xc - $r, $yc + $r*$MyArc, $xc - $r, $yc);
|
|
$xc = $x+$r ;
|
|
$yc = $y+$r;
|
|
$this->_out(sprintf('%.2f %.2f l',($x)*$k,($hp-$yc)*$k ));
|
|
$this->_Arc($xc - $r, $yc - $r*$MyArc, $xc - $r*$MyArc, $yc - $r, $xc, $yc - $r);
|
|
$this->_out($op);
|
|
}
|
|
|
|
function _Arc($x1, $y1, $x2, $y2, $x3, $y3)
|
|
{
|
|
$h = $this->h;
|
|
$this->_out(sprintf('%.2f %.2f %.2f %.2f %.2f %.2f c ', $x1*$this->k, ($h-$y1)*$this->k,
|
|
$x2*$this->k, ($h-$y2)*$this->k, $x3*$this->k, ($h-$y3)*$this->k));
|
|
}
|
|
|
|
function Rotate($angle,$x=-1,$y=-1)
|
|
{
|
|
if($x==-1)
|
|
$x=$this->x;
|
|
if($y==-1)
|
|
$y=$this->y;
|
|
if($this->angle!=0)
|
|
$this->_out('Q');
|
|
$this->angle=$angle;
|
|
if($angle!=0)
|
|
{
|
|
$angle*=M_PI/180;
|
|
$c=cos($angle);
|
|
$s=sin($angle);
|
|
$cx=$x*$this->k;
|
|
$cy=($this->h-$y)*$this->k;
|
|
$this->_out(sprintf('q %.5f %.5f %.5f %.5f %.2f %.2f cm 1 0 0 1 %.2f %.2f cm',$c,$s,-$s,$c,$cx,$cy,-$cx,-$cy));
|
|
}
|
|
}
|
|
|
|
function _endpage()
|
|
{
|
|
if($this->angle!=0)
|
|
{
|
|
$this->angle=0;
|
|
$this->_out('Q');
|
|
}
|
|
parent::_endpage();
|
|
}
|
|
|
|
// public functions
|
|
function sizeOfText( $text, $largeur )
|
|
{
|
|
$index = 0;
|
|
$nb_lines = 0;
|
|
$loop = TRUE;
|
|
while ( $loop )
|
|
{
|
|
$pos = strpos($text, "\n");
|
|
if (!$pos)
|
|
{
|
|
$loop = FALSE;
|
|
$line = $text;
|
|
}
|
|
else
|
|
{
|
|
$line = substr( $text, $index, $pos);
|
|
$text = substr( $text, $pos+1 );
|
|
}
|
|
$length = floor( $this->GetStringWidth( $line ) );
|
|
$res = 1 + floor( $length / $largeur) ;
|
|
$nb_lines += $res;
|
|
}
|
|
return $nb_lines;
|
|
}
|
|
|
|
// addImage
|
|
// Default will place vtiger in the top left corner
|
|
function addImage( $logo_name, $location=array('10','10','0','0') ) {
|
|
if($logo_name)//error checking just in case, by OpenCRM
|
|
{
|
|
$x1 = $location[0];
|
|
$y1 = $location[1];
|
|
$stretchx = $location[2];
|
|
$stretchy = $location[3];
|
|
$this->Image('test/logo/'.$logo_name,$x1,$y1,$stretchx,$stretchy);
|
|
}
|
|
}
|
|
|
|
// Company
|
|
function addCompany( $nom, $address, $location='' )
|
|
{
|
|
$x1 = $location[0];
|
|
$y1 = $location[1];
|
|
//Positionnement en bas
|
|
$this->SetXY( $x1, $y1 );
|
|
$this->SetFont('Arial','B',12);
|
|
$length = $this->GetStringWidth( $nom );
|
|
$this->Cell( $length, 2, $nom);
|
|
$this->SetXY( $x1, $y1 + 4 );
|
|
$this->SetFont('Arial','',10);
|
|
$length = $this->GetStringWidth( $address );
|
|
//Coordonnées de la société
|
|
$lines = $this->sizeOfText( $address, $length) ;
|
|
$this->MultiCell($length, 4, $address);
|
|
}
|
|
|
|
// bubble blocks
|
|
function title ($label, $total, $position)
|
|
{
|
|
$r1 = $position[0];
|
|
$r2 = $r1 + 19 + $position[2] ;
|
|
$y1 = $position[1];
|
|
$y2 = $y1;
|
|
$mid = $y1 + ($y2 / 2);
|
|
$width=10;
|
|
$this->SetFillColor(192);
|
|
$this->RoundedRect($r1-16, $y1-1, 52, $y2+1, 2.5, 'DF');
|
|
$this->SetXY( $r1 + 4, $y1+1 );
|
|
$this->SetFont( "Helvetica", "B", 15);
|
|
$this->Cell($width,5, $label." ".$total, 0, 0, "C");
|
|
}
|
|
|
|
// text block, non-wrapped
|
|
function addTextBlock( $title,$text,$positions )
|
|
{
|
|
$r1 = $positions[0];
|
|
$y1 = $positions[1];
|
|
$this->SetXY( $r1, $y1);
|
|
$this->SetFont( "Helvetica", "B", 10);
|
|
$this->Cell( $positions[2], 4,$title);
|
|
$this->SetXY( $r1, $y1+4);
|
|
$this->SetFont( "Helvetica", "", 10);
|
|
$this->MultiCell( $positions[2], 4, $text);
|
|
}
|
|
|
|
function tableWrapper($position)
|
|
{
|
|
$r1 = $position[0];
|
|
$r2 = $r1 + 19 + $position[2] ;
|
|
$y1 = $position[1];
|
|
if($position[3])
|
|
$y2 = $position[3];
|
|
else
|
|
$y2 = 17;
|
|
|
|
$mid = $y1 + (13 / 2);
|
|
$width=10;
|
|
$this->RoundedRect($r1, $y1, ($r2 - $r1), $y2, 4.5, 'D');
|
|
$this->Line( $r1, $mid, $r2, $mid);
|
|
$this->SetXY( $r1 + ($r2-$r1)/2 - 3, $y1+3 );
|
|
$this->SetXY( $r1 + ($r2-$r1)/2 - 5, $y1 + 9 );
|
|
}
|
|
|
|
function addBubble($page,$title,$position)
|
|
{
|
|
$r1 = $position[0];
|
|
$r2 = $r1 + 19 + $position[2] ;
|
|
$y1 = $position[1];
|
|
if($position[3])
|
|
$y2 = 17*$position[3];
|
|
else
|
|
$y2 = 17;
|
|
|
|
$mid = $y1 + (19 / 2);
|
|
$width=10;
|
|
$this->RoundedRect($r1, $y1, ($r2 - $r1), $y2, 4.5, 'D');
|
|
$this->Line( $r1, $mid, $r2, $mid);
|
|
$this->SetXY( $r1 + ($r2-$r1)/2 - 3, $y1+3 );
|
|
$this->SetFont( "Helvetica", "B", 10);
|
|
$this->Cell($width,5, $title, 0, 0, "C");
|
|
$this->SetXY( $r1 + ($r2-$r1)/2 - 5, $y1 + 9 );
|
|
$this->SetFont( "Helvetica", "", 10);
|
|
$this->MultiCell($width,5,$page, 0,0, "C");
|
|
}
|
|
|
|
// bubble blocks
|
|
function addBubbleBlock ($page, $title, $position)
|
|
{
|
|
$r1 = $position[0];
|
|
$r2 = $r1 + 19 + $position[2] ;
|
|
$y1 = $position[1];
|
|
$y2 = 17;
|
|
|
|
$mid = $y1 + ($y2 / 2);
|
|
$width=10;
|
|
$this->RoundedRect($r1, $y1, ($r2 - $r1), $y2, 4.5, 'D');
|
|
$this->Line( $r1, $mid, $r2, $mid);
|
|
$this->SetXY( $r1 + ($r2-$r1)/2 - 5, $y1+3 );
|
|
$this->SetFont( "Helvetica", "B", 10);
|
|
$this->Cell($width,5, $title, 0, 0, "C");
|
|
$this->SetXY( $r1 + ($r2-$r1)/2 - 5, $y1 + 9 );
|
|
$this->SetFont( "Helvetica", "", 10);
|
|
$this->Cell($width,5,$page, 0,0, "C");
|
|
}
|
|
|
|
// record blocks
|
|
function addRecBlock( $data, $title, $postion )
|
|
{
|
|
$lengthtitle = strlen($title);
|
|
$lengthdata = strlen($data);
|
|
$length=$lengthtitle;
|
|
$r1 = $postion[0];
|
|
$r2 = $r1 + 40 + $length;
|
|
$y1 = $postion[1];
|
|
$y2 = $y1+10;
|
|
$mid = $y1 + (($y2-$y1) / 2);
|
|
|
|
$this->RoundedRect($r1, $y1, ($r2 - $r1), ($y2-$y1), 2.5, 'D');
|
|
$this->Line( $r1, $mid, $r2, $mid);
|
|
$this->SetXY( $r1 + ($r2-$r1)/2 -5 , $y1+1 );
|
|
$this->SetFont( "Helvetica", "B", 10);
|
|
$this->Cell(10,4, $title, 0, 0, "C");
|
|
$this->SetXY( $r1 + ($r2-$r1)/2 -5 , $y1 + 5 );
|
|
$this->SetFont( "Helvetica", "", 10);
|
|
$this->Cell(10,4,$data, 0, 0, "C");
|
|
}
|
|
|
|
// description blocks
|
|
function addDescBlock( $data, $title, $position )
|
|
{
|
|
$lengthtitle = strlen($title);
|
|
$lengthdata= $position[3];
|
|
|
|
$length=$position[2];
|
|
$r1 = $position[0];
|
|
$r2 = $r1 + 40 + $length;
|
|
$y1 = $position[1];
|
|
$y2 = $y1+10;
|
|
$mid = $y1 + (($y2-$y1) / 2);
|
|
|
|
$this->RoundedRect($r1,$y1, ($length + 40), ($lengthdata/140*30), 2.5, 'D');
|
|
$this->Line( $r1, $mid, $r2, $mid);
|
|
|
|
$this->SetXY( $position[0]+2 , $y1 + 1 );
|
|
$this->SetFont( "Helvetica", "B", 10);
|
|
$this->Cell(10,4, $title);
|
|
|
|
$this->SetXY( $position[0]+2 , $y1 + 6 );
|
|
$this->SetFont( "Helvetica", "", 10);
|
|
$this->MultiCell(($length+36),4,$data);
|
|
}
|
|
|
|
function drawLine($positions)
|
|
{
|
|
$x=$positions[0];
|
|
$y=$positions[1];
|
|
$width=$positions[2];
|
|
$this->Line( $x, $y, $x+$width, $y);
|
|
}
|
|
|
|
// add columns to table
|
|
function addCols( $tab ,$positions ,$bottom, $taxtype = 'group')
|
|
{
|
|
global $columns,$app_strings;
|
|
|
|
$r1 = 10;
|
|
$r2 = $this->w - ($r1 * 2) ;
|
|
$y1 = 80;
|
|
$x1 = $positions[1];
|
|
$y2 = $bottom;
|
|
$this->SetXY( $r1, $y1 );
|
|
$this->SetFont( "Helvetica", "", 10);
|
|
|
|
$colX = $r1;
|
|
$columns = $tab;
|
|
while ( list( $lib, $pos ) = each ($tab) )
|
|
{
|
|
$this->SetXY( $colX, $y1+3 );
|
|
$this->Cell( $pos, 1, $app_strings[$lib], 0, 0, "C");
|
|
$colX += $pos;
|
|
switch($lib) {
|
|
case 'Total':
|
|
break;
|
|
case 'Qty':
|
|
case 'Price':
|
|
if($taxtype == "individual")
|
|
$this->Line( $colX, $y1, $colX, (($y1+$y2)-37));
|
|
else
|
|
$this->Line( $colX, $y1, $colX, (($y1+$y2)-43));
|
|
break;
|
|
default:
|
|
if($taxtype == "individual" && $lib == 'Discount')
|
|
$this->Line( $colX, $y1, $colX, (($y1+$y2)-37));
|
|
else
|
|
$this->Line( $colX, $y1, $colX, ($y1+$y2));
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
function addLineFormat( $tab )
|
|
{
|
|
global $format, $columns;
|
|
|
|
while ( list( $lib, $pos ) = each ($columns) )
|
|
{
|
|
if ( isset( $tab["$lib"] ) )
|
|
$format[ $lib ] = $tab["$lib"];
|
|
}
|
|
}
|
|
|
|
function addProductLine( $line, $tab, $totals='' )
|
|
{
|
|
global $columns, $format;
|
|
|
|
$ordonnee = 10;
|
|
$maxSize = $line;
|
|
|
|
reset( $columns );
|
|
while ( list( $lib, $pos ) = each ($columns) )
|
|
{
|
|
$longCell = $pos -2;
|
|
$text = $tab[ $lib ];
|
|
$length = $this->GetStringWidth( $text );
|
|
$formText = $format[ $lib ];
|
|
$this->SetXY( $ordonnee, $line);
|
|
$this->MultiCell( $longCell, 3 , $text, 3, $formText);
|
|
if ( $maxSize < ($this->GetY() ) )
|
|
$maxSize = $this->GetY() ;
|
|
$ordonnee += $pos;
|
|
}
|
|
return ( $maxSize - $line );
|
|
}
|
|
|
|
function addTotalsRec($names, $totals, $positions)
|
|
{
|
|
$this->SetFont( "Arial", "B", 8);
|
|
$r1 = $positions[0];
|
|
$r2 = $r1 + 90;
|
|
$y1 = $positions[1];
|
|
$y2 = $y1+10;
|
|
$this->RoundedRect($r1, $y1, ($r2 - $r1), ($y2-$y1), 2.5, 'D');
|
|
$this->Line( $r1, $y1+4, $r2, $y1+4);
|
|
$this->Line( $r1+27, $y1, $r1+27, $y2); // avant Subtotal
|
|
$this->Line( $r1+43, $y1, $r1+43, $y2); // avant Tax
|
|
$this->Line( $r1+66, $y1, $r1+66, $y2); // avant Adjustment
|
|
|
|
$this->SetXY( $r1+2, $y1);
|
|
$this->Cell(10,4, $names[0]);
|
|
$this->SetX( $r1+29,$y1 );
|
|
$this->Cell(10,4, $names[1]);
|
|
$this->SetX( $r1+45 );
|
|
$this->Cell(10,4, $names[2]);
|
|
$this->SetX( $r1+66 );
|
|
$this->Cell(10,4, $names[3]);
|
|
|
|
|
|
$this->SetXY( $r1+2, $y1+5 );
|
|
$this->Cell( 10,4, $totals[0] );
|
|
$this->SetXY( $r1+29, $y1+5 );
|
|
$this->Cell( 10,4, $totals[1] );
|
|
$this->SetXY( $r1+44, $y1+5 );
|
|
$this->Cell( 10,4, $totals[2] );
|
|
$this->SetXY( $r1+66, $y1+5 );
|
|
$this->Cell( 10,4, $totals[3] );
|
|
|
|
$this->SetFont( "Arial", "B", 6);
|
|
$this->SetXY( $r1+90, $y2 - 8 );
|
|
$this->SetFont( "Helvetica", "", 10);
|
|
}
|
|
|
|
// add a watermark (temporary estimate, DUPLICATA...)
|
|
// call this method first
|
|
function watermark( $text, $positions, $rotate = array('45','50','180') )
|
|
{
|
|
$this->SetFont('Arial','B',50);
|
|
$this->SetTextColor(230,230,230);
|
|
$this->Rotate($rotate[0],$rotate[1],$rotate[2]);
|
|
$this->Text($positions[0],$positions[1],$text);
|
|
$this->Rotate(0);
|
|
$this->SetTextColor(0,0,0);
|
|
}
|
|
|
|
}
|
|
function StripLastZero($string)
|
|
{
|
|
$count=strlen($string);
|
|
$ret=substr($string,0,($count-1));
|
|
return $ret;
|
|
}
|
|
?>
|