FPDF($orientation,$unit,$format); } /** * Additional getter methods **/ function GetFontFamily() { return $this->FontFamily; } function GetFontStyle() { return $this->FontStyle; } function GetFontSize() { return $this->FontSize; } function GetFontSizePt() { return $this->FontSizePt; } function GetDrawColor() { return $this->DrawColor; } function GetFillColor() { return $this->FillColor; } function GetTextColor() { return $this->TextColor; } function GetPageWidth() { return $this->w-$this->rMargin-$this->lMargin; } function GetLineWidth() { return $this->LineWidth; } function FontExists($family, $style='') { $fontkey=$family.$style; return isset($this->fonts[$fontkey]) || isset($this->CoreFonts[$fontkey]); } /** * Methods to capture output */ function startCapture() { if($this->state==2) { $buf = $this->pages[$this->page]; $this->pages[$this->page] = ""; return $buf; } else { $buf = $this->buffer; $this->buffer = ""; return $buf; } } function endCapture($buffer) { if($this->state==2) { $buf = $this->pages[$this->page]; $this->pages[$this->page] = $buffer; return $buf; } else { $buf = $this->buffer; $this->buffer = $buffer; return $buf; } } function appendBuffer($buffer) { if($this->state==2) { $this->pages[$this->page] .= $buffer; } else { $this->buffer .= $buffer; } } /** * Get the number of characters having space whithin the * given width, respecting not to break words */ function GetNumberOfChars($width, $s, $fontsize=null) { //Get width of a string in the current font // $s=(string)$s; if($fontsize==null) $fontsize=$this->FontSize; //echo "width:$width s:$s font:$fontsize"; $cw=&$this->CurrentFont['cw']; $w=0; $wordPos = 0; $l=strlen($s); $width = $width*1000/$fontsize; for($i=0;$i<$l;$i++) { $w+=$cw[$s{$i}]; if ($s{$i} == ' ') { $wordPos = $i; } if ($w >= $width) { if ($wordPos > 0) { return $wordPos; } else { return -1; } } } return (($w <= $width)?$l:-1); } /** * Write string regarding to \n as line breaks * Return an array containing number of line, width and height * of this textual block. The align paramtere accepts L, R and C * get values using: * list($width, $height, $no, $firstX, $firstY, $lastX, $lastYl) = $pdf->Text2(); **/ function Text2($x, $y, $text, $align="L", $lineHeight=NULL, $xNewLine=NULL, $width=NULL) { if (!$xNewLine) { $xNewLine = $x; } $lines = explode('\n', $text); $height = ($lineHeight)?$lineHeight:$this->FontSize; //oesi - add parameter width for set the content-width of fo:block if($width!=NULL) { $pw = $xNewLine+$width; } else $pw = $this->GetPageWidth(); //echo "x: $x width: $width pw: $pw
"; $nb = 0; $maxWidth = 0; $sx = $x; $sy = $y; foreach($lines as $line) { $width = $this->GetStringWidth($line); do { //$w=$this->w-$this->rMargin-$x; $w = $pw-$x; //oesi - changed //echo "w:$w
"; //$wmax=($w-2*$this->cMargin)*1000/$this->FontSize; $noc = $this->GetNumberOfChars($w, $line); //echo "noc:$noc xNewLine: $xNewLine x:$x w:$w strlen:".strlen($line)." line:$line
"; if ($noc == -1) { if ($x == $xNewLine) { //word has not enough space on one line, draw it beyond borders $noc = strlen($line); } else { //echo "NEWLINE"; if ($nb == 0) { $sy += $height; $sx = $xNewLine; } //add newline and try again $y += $height; $nb++; $x = $xNewLine; continue; } } $showLine = substr($line, 0, $noc); $textWidth = $this->GetStringWidth($showLine); //echo "showline: $showLine
"; //echo "nb:$nb x:$x w:$w textwidth:$textWidth showline:$showLine
"; switch ($align) { case "R": $tx = $pw-$textWidth; break; case "C": $tx = ($pw-$x-$textWidth)/2 + $x; break; case "L": default: $tx = $x; } $this->Text($tx, $y+$height, $showLine); $line = trim(substr($line, $noc)); $width = $this->GetStringWidth($line); if ($textWidth > $maxWidth) { $maxWidth = $textWidth; } $y += $height; $nb++; //oesi - wenn er die zeileumbricht dann soll in der naechsten zeile um //1 eingerueckt werden sonst schaut des in einer tablle nicht gut aus //$this->GetStringWidth(" ") statt '1' is bessa - MP if($width!=0) $x = $xNewLine+$this->GetStringWidth(" "); else $x = $xNewLine; } while ($width > 0); } //$this->y = $y; $tot_height = $nb * $height; return array($maxWidth, $tot_height, $nb, $sx, $sy, $tx+$textWidth, $y-$height); } /* This extension allows to set a dash pattern and draw dashed lines or rectangles. $pdf->SetDash(4,2); //4mm on, 2mm off $pdf->Rect(20,30,170,20); $pdf->SetDash(); //restore no dash */ function SetDash($black=false,$white=false) { if($black and $white) $s=sprintf('[%.3f %.3f] 0 d',$black*$this->k,$white*$this->k); else $s='[] 0 d'; $this->_out($s); } /** * Draw polygons * $pdf->Polygon(array(50,115,150,115,100,20),'FD'); **/ function Polygon($points, $style='D') { //Draw a polygon if($style=='F') $op='f'; elseif($style=='FD' or $style=='DF') $op='b'; else $op='s'; $h = $this->h; $k = $this->k; $points_string = ''; for($i=0; $i_out($points_string . $op); } /** * Rounded rect * $pdf->RoundedRect(70, 30, 68, 46, 3.5, 'DF'); */ 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); } /** * Rotate content. End rotation by call to Rotate(0) * $pdf->Rotate($angle,$x,$y); * $pdf->Text($x,$y,$txt); * $pdf->Rotate(0); */ 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)); } } // Draws a cubic B�zier curve from last draw point // Parameters: // - x1, y1: Control point 1 // - x2, y2: Control point 2 // - x3, y3: End point function CubicBezier($x1, $y1, $x2, $y2, $x3, $y3, $style='D') { if($style=='F') $op='f'; elseif($style=='FD' or $style=='DF') $op='B'; else $op='S'; $this->_Curve($x1, $y1, $x2, $y2, $x3, $y3); $this->_out($op); } // Draws an ellipse // Parameters: // - x0, y0: Center point // - rx, ry: Horizontal and vertical radius (if ry = 0, draws a circle) // - angle: Orientation angle (anti-clockwise) // - astart: Start angle // - afinish: Finish angle // - style: Style of ellipse (draw and/or fill: D, F, DF, FD, C (D + close)) // - line_style: Line style for ellipse. Array like for SetLineStyle // - fill_color: Fill color. Array with components (red, green, blue) // - nSeg: Ellipse is made up of nSeg B�zier curves function Ellipse($x0, $y0, $rx, $ry = 0, $angle = 0, $astart = 0, $afinish = 360, $style = '', $fill_color = null, $nSeg = 8) { if ($rx) { if (!(false === strpos($style, 'F')) && $fill_color) { list($r, $g, $b) = $fill_color; $this->SetFillColor($r, $g, $b); } switch ($style) { case 'F': $op = 'f'; $line_style = null; break; case 'FD': case 'DF': $op = 'B'; break; case 'C': $op = 's'; // small 's' means closing the path as well break; default: $op = 'S'; break; } if ($rx) { if (!$ry) $ry = $rx; $rx *= $this->k; $ry *= $this->k; if ($nSeg < 2) $nSeg = 2; $astart = deg2rad((float) $astart); $afinish = deg2rad((float) $afinish); $totalAngle = $afinish - $astart; $dt = $totalAngle/$nSeg; $dtm = $dt/3; $x0 *= $this->k; $y0 = ($this->h - $y0) * $this->k; if ($angle != 0) { $a = -deg2rad((float) $angle); $this->_out(sprintf('q %.2f %.2f %.2f %.2f %.2f %.2f cm', cos($a), -1 * sin($a), sin($a), cos($a), $x0*10, $y0*10)); $x0 = 0; $y0 = 0; } $t1 = $astart; $a0 = $x0 + ($rx * cos($t1)); $b0 = $y0 + ($ry * sin($t1)); $c0 = -$rx * sin($t1); $d0 = $ry * cos($t1); $this->_Point($a0 / $this->k, $this->h - ($b0 / $this->k)); for ($i = 1; $i <= $nSeg; $i++) { // Draw this bit of the total curve $t1 = ($i * $dt) + $astart; $a1 = $x0 + ($rx * cos($t1)); $b1 = $y0 + ($ry * sin($t1)); $c1 = -$rx * sin($t1); $d1 = $ry * cos($t1); $this->_Curve(($a0 + ($c0 * $dtm)) / $this->k, $this->h - (($b0 + ($d0 * $dtm)) / $this->k), ($a1 - ($c1 * $dtm)) / $this->k, $this->h - (($b1 - ($d1 * $dtm)) / $this->k), $a1 / $this->k, $this->h - ($b1 / $this->k)); $a0 = $a1; $b0 = $b1; $c0 = $c1; $d0 = $d1; } if ($angle !=0) { $this->_out('Q'); } } $this->_out($op); } } function ClosePath($style="D") { if($style=='F') $op='f'; elseif($style=='FD' or $style=='DF') $op='B'; else $op='S'; $this->_out(sprintf('h %s', $op)); } function _Style($style="D") { if($style=='F') $op='f'; elseif($style=='FD' or $style=='DF') $op='B'; else $op='S'; $this->_out(sprintf('%s', $op)); } // Draws a circle // Parameters: // - x0, y0: Center point // - r: Radius // - astart: Start angle // - afinish: Finish angle // - style: Style of circle (draw and/or fill) (D, F, DF, FD, C (D + close)) // - line_style: Line style for circle. Array like for SetLineStyle // - fill_color: Fill color. Array with components (red, green, blue) // - nSeg: Ellipse is made up of nSeg B�zier curves function Circle($x0, $y0, $r, $astart = 0, $afinish = 360, $style = '', $fill_color = null, $nSeg = 8) { $this->Ellipse($x0, $y0, $r, 0, 0, $astart, $afinish, $style, $line_style, $fill_color, $nSeg); } // Sets a draw point // Parameters: // - x, y: Point function _Point($x, $y) { $this->_out(sprintf('%.2f %.2f m', $x * $this->k, ($this->h - $y) * $this->k)); } // Draws a B�zier curve from last draw point // Parameters: // - x1, y1: Control point 1 // - x2, y2: Control point 2 // - x3, y3: End point function _Curve($x1, $y1, $x2, $y2, $x3, $y3) { $this->_out(sprintf('%.2f %.2f %.2f %.2f %.2f %.2f c', $x1 * $this->k, ($this->h - $y1) * $this->k, $x2 * $this->k, ($this->h - $y2) * $this->k, $x3 * $this->k, ($this->h - $y3) * $this->k)); } // Draws a cubic B�zier curve from last draw point // Parameters: // - x2, y2: Control point 2 // - x3, y3: End point function _CurveRef1($x2, $y2, $x3, $y3) { $this->_out(sprintf('%.2f %.2f %.2f %.2f v', $x2 * $this->k, ($this->h - $y2) * $this->k, $x3 * $this->k, ($this->h - $y3) * $this->k)); } // Draws a cubic B�zier curve from last draw point // Parameters: // - x1, y1: Control point 1 // - x3, y3: End point function _CurveRef2($x1, $y1, $x3, $y3) { $this->_out(sprintf('%.2f %.2f %.2f %.2f y', $x1 * $this->k, ($this->h - $y1) * $this->k, $x3 * $this->k, ($this->h - $y3) * $this->k)); } // Draws a line from last draw point // Parameters: // - x, y: End point function _Line($x, $y) { $this->_out(sprintf('%.2f %.2f l', $x * $this->k, ($this->h - $y) * $this->k)); } // Draws an ellipse // Parameters: // - x0, y0: Center point // - rx, ry: Horizontal and vertical radius (if ry = 0, draws a circle) // - angle: Orientation angle (anti-clockwise) // - astart: Start angle // - afinish: Finish angle // - style: Style of ellipse (draw and/or fill: D, F, DF, FD, C (D + close)) // - line_style: Line style for ellipse. Array like for SetLineStyle // - fill_color: Fill color. Array with components (red, green, blue) // - nSeg: Ellipse is made up of nSeg B�zier curves function _Ellipse($x0, $y0, $rx, $ry = 0, $angle = 0, $astart = 0, $afinish = 360, $nSeg = 8) { if ($rx) { if (!$ry) $ry = $rx; $rx *= $this->k; $ry *= $this->k; if ($nSeg < 2) $nSeg = 2; $astart = deg2rad((float) $astart); $afinish = deg2rad((float) $afinish); $totalAngle = $afinish - $astart; $dt = $totalAngle/$nSeg; $dtm = $dt/3; $x0 *= $this->k; $y0 = ($this->h - $y0) * $this->k; if ($angle != 0) { //$a = -deg2rad((float) $angle); //$this->_out(sprintf('q %.2f %.2f %.2f %.2f %.2f %.2f cm', cos($a), -1 * sin($a), sin($a), cos($a), $x0*10, $y0*10)); //echo "X:$x0:$y0:$a:".cos($a).":".sin($a)."
"; //echo "X2:$x0:$y0
"; //$x0 -= cos($a); //$y0 -= $ry * sin($a); } $t1 = $astart; $a0 = $x0 + ($rx * cos($t1)); $b0 = $y0 + ($ry * sin($t1)); $c0 = -$rx * sin($t1); $d0 = $ry * cos($t1); //$this->_Point($a0 / $this->k, $this->h - ($b0 / $this->k)); for ($i = 1; $i <= $nSeg; $i++) { // Draw this bit of the total curve $t1 = ($i * $dt) + $astart; $a1 = $x0 + ($rx * cos($t1)); $b1 = $y0 + ($ry * sin($t1)); $c1 = -$rx * sin($t1); $d1 = $ry * cos($t1); $this->_Curve(($a0 + ($c0 * $dtm)) / $this->k, $this->h - (($b0 + ($d0 * $dtm)) / $this->k), ($a1 - ($c1 * $dtm)) / $this->k, $this->h - (($b1 - ($d1 * $dtm)) / $this->k), $a1 / $this->k, $this->h - ($b1 / $this->k)); $a0 = $a1; $b0 = $b1; $c0 = $c1; $d0 = $d1; } if ($angle !=0) { //$this->_out('Q'); } } } } ?>