diff --git a/lam/copyright b/lam/copyright
index 632af90c..0e1a36f3 100644
--- a/lam/copyright
+++ b/lam/copyright
@@ -83,16 +83,6 @@ Some parts of this package have other, compatible licences. These are:
A:
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software to use, copy, modify, distribute, sublicense, and/or sell
- copies of the software, and to permit persons to whom the software is furnished
- to do so.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED.
-
-
-B:
-
DejaVu Fonts — License
Fonts are © Bitstream (see below). DejaVu changes are in public domain. Explanation
@@ -183,7 +173,7 @@ B:
Software without prior written authorization from Tavmjong Bah. For further
information, contact: tavmjong @ free . fr.
-C:
+B:
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
@@ -208,15 +198,14 @@ C:
Programs and licenses with other licenses and/or authors than the
main license and authors:
-lib/fpdf-lam.inc A 2008 Olivier Plathey
-lib/font/DejaVu*.ttf B Public Domain, Bitstream, Inc., Tavmjong Bah
-lib/font/DejaVu*.z B Public Domain, Bitstream, Inc., Tavmjong Bah
-lib/3rdParty/tcpdf/fonts/DejaVu*.ttf B Public Domain, Bitstream, Inc., Tavmjong Bah
-lib/3rdParty/tcpdf/fonts/DejaVu*.z B Public Domain, Bitstream, Inc., Tavmjong Bah
-lib/3rdParty/phpseclib C Jim Wigginton
-templates/lib/*jquery*.js C 2010 John Resig, Paul Bakaus, Fred Heusschen
-templates/lib/*jquery-dropmenu-*.js C 2010 Fred Heusschen
-templates/lib/*jquery-validationEngine-*.js C 2010 Cedric Dugas and Olivier Refalo
-templates/lib/*jquery-fineuploader-*.js C 2010 Andrew Valums
+lib/font/DejaVu*.ttf A Public Domain, Bitstream, Inc., Tavmjong Bah
+lib/font/DejaVu*.z A Public Domain, Bitstream, Inc., Tavmjong Bah
+lib/3rdParty/tcpdf/fonts/DejaVu*.ttf A Public Domain, Bitstream, Inc., Tavmjong Bah
+lib/3rdParty/tcpdf/fonts/DejaVu*.z A Public Domain, Bitstream, Inc., Tavmjong Bah
+lib/3rdParty/phpseclib B Jim Wigginton
+templates/lib/*jquery*.js B 2010 John Resig, Paul Bakaus, Fred Heusschen
+templates/lib/*jquery-dropmenu-*.js B 2010 Fred Heusschen
+templates/lib/*jquery-validationEngine-*.js B 2010 Cedric Dugas and Olivier Refalo
+templates/lib/*jquery-fineuploader-*.js B 2010 Andrew Valums
diff --git a/lam/lib/fpdf-lam.inc b/lam/lib/fpdf-lam.inc
deleted file mode 100644
index 897f305a..00000000
--- a/lam/lib/fpdf-lam.inc
+++ /dev/null
@@ -1,1802 +0,0 @@
-_dochecks();
- // Initialization of properties
- $this->page = 0;
- $this->n = 2;
- $this->buffer = '';
- $this->pages = array();
- $this->PageSizes = array();
- $this->state = 0;
- $this->fonts = array();
- $this->FontFiles = array();
- $this->diffs = array();
- $this->images = array();
- $this->links = array();
- $this->InHeader = false;
- $this->InFooter = false;
- $this->lasth = 0;
- $this->FontFamily = '';
- $this->FontStyle = '';
- $this->FontSizePt = 12;
- $this->underline = false;
- $this->DrawColor = '0 G';
- $this->FillColor = '0 g';
- $this->TextColor = '0 g';
- $this->ColorFlag = false;
- $this->ws = 0;
- // Font path
- if(defined('FPDF_FONTPATH'))
- {
- $this->fontpath = FPDF_FONTPATH;
- if(substr($this->fontpath,-1)!='/' && substr($this->fontpath,-1)!='\\')
- $this->fontpath .= '/';
- }
- elseif(is_dir(dirname(__FILE__).'/font'))
- $this->fontpath = dirname(__FILE__).'/font/';
- else
- $this->fontpath = '';
- // Core fonts
- $this->CoreFonts = array('courier', 'helvetica', 'times', 'symbol', 'zapfdingbats');
- // Scale factor
- if($unit=='pt')
- $this->k = 1;
- elseif($unit=='mm')
- $this->k = 72/25.4;
- elseif($unit=='cm')
- $this->k = 72/2.54;
- elseif($unit=='in')
- $this->k = 72;
- else
- $this->Error('Incorrect unit: '.$unit);
- // Page sizes
- $this->StdPageSizes = array('a3'=>array(841.89,1190.55), 'a4'=>array(595.28,841.89), 'a5'=>array(420.94,595.28),
- 'letter'=>array(612,792), 'legal'=>array(612,1008));
- $size = $this->_getpagesize($size);
- $this->DefPageSize = $size;
- $this->CurPageSize = $size;
- // Page orientation
- $orientation = strtolower($orientation);
- if($orientation=='p' || $orientation=='portrait')
- {
- $this->DefOrientation = 'P';
- $this->w = $size[0];
- $this->h = $size[1];
- }
- elseif($orientation=='l' || $orientation=='landscape')
- {
- $this->DefOrientation = 'L';
- $this->w = $size[1];
- $this->h = $size[0];
- }
- else
- $this->Error('Incorrect orientation: '.$orientation);
- $this->CurOrientation = $this->DefOrientation;
- $this->wPt = $this->w*$this->k;
- $this->hPt = $this->h*$this->k;
- // Page margins (1 cm)
- $margin = 28.35/$this->k;
- $this->SetMargins($margin,$margin);
- // Interior cell margin (1 mm)
- $this->cMargin = $margin/10;
- // Line width (0.2 mm)
- $this->LineWidth = .567/$this->k;
- // Automatic page break
- $this->SetAutoPageBreak(true,2*$margin);
- // Default display mode
- $this->SetDisplayMode('default');
- // Enable compression
- $this->SetCompression(true);
- // Set default PDF version number
- $this->PDFVersion = '1.3';
-}
-
-function SetMargins($left, $top, $right=null)
-{
- // Set left, top and right margins
- $this->lMargin = $left;
- $this->tMargin = $top;
- if($right===null)
- $right = $left;
- $this->rMargin = $right;
-}
-
-function SetLeftMargin($margin)
-{
- // Set left margin
- $this->lMargin = $margin;
- if($this->page>0 && $this->x<$margin)
- $this->x = $margin;
-}
-
-function SetTopMargin($margin)
-{
- // Set top margin
- $this->tMargin = $margin;
-}
-
-function SetRightMargin($margin)
-{
- // Set right margin
- $this->rMargin = $margin;
-}
-
-function SetAutoPageBreak($auto, $margin=0)
-{
- // Set auto page break mode and triggering margin
- $this->AutoPageBreak = $auto;
- $this->bMargin = $margin;
- $this->PageBreakTrigger = $this->h-$margin;
-}
-
-function SetDisplayMode($zoom, $layout='default')
-{
- // Set display mode in viewer
- if($zoom=='fullpage' || $zoom=='fullwidth' || $zoom=='real' || $zoom=='default' || !is_string($zoom))
- $this->ZoomMode = $zoom;
- else
- $this->Error('Incorrect zoom display mode: '.$zoom);
- if($layout=='single' || $layout=='continuous' || $layout=='two' || $layout=='default')
- $this->LayoutMode = $layout;
- else
- $this->Error('Incorrect layout display mode: '.$layout);
-}
-
-function SetCompression($compress)
-{
- // Set page compression
- if(function_exists('gzcompress'))
- $this->compress = $compress;
- else
- $this->compress = false;
-}
-
-function SetTitle($title, $isUTF8=false)
-{
- // Title of document
- if($isUTF8)
- $title = $this->_UTF8toUTF16($title);
- $this->title = $title;
-}
-
-function SetSubject($subject, $isUTF8=false)
-{
- // Subject of document
- if($isUTF8)
- $subject = $this->_UTF8toUTF16($subject);
- $this->subject = $subject;
-}
-
-function SetAuthor($author, $isUTF8=false)
-{
- // Author of document
- if($isUTF8)
- $author = $this->_UTF8toUTF16($author);
- $this->author = $author;
-}
-
-function SetKeywords($keywords, $isUTF8=false)
-{
- // Keywords of document
- if($isUTF8)
- $keywords = $this->_UTF8toUTF16($keywords);
- $this->keywords = $keywords;
-}
-
-function SetCreator($creator, $isUTF8=false)
-{
- // Creator of document
- if($isUTF8)
- $creator = $this->_UTF8toUTF16($creator);
- $this->creator = $creator;
-}
-
-function AliasNbPages($alias='{nb}')
-{
- // Define an alias for total number of pages
- $this->AliasNbPages = $alias;
-}
-
-function Error($msg)
-{
- // Fatal error
- die('FPDF error: '.$msg);
-}
-
-function Open()
-{
- // Begin document
- $this->state = 1;
-}
-
-function Close()
-{
- // Terminate document
- if($this->state==3)
- return;
- if($this->page==0)
- $this->AddPage();
- // Page footer
- $this->InFooter = true;
- $this->Footer();
- $this->InFooter = false;
- // Close page
- $this->_endpage();
- // Close document
- $this->_enddoc();
-}
-
-function AddPage($orientation='', $size='')
-{
- // Start a new page
- if($this->state==0)
- $this->Open();
- $family = $this->FontFamily;
- $style = $this->FontStyle.($this->underline ? 'U' : '');
- $fontsize = $this->FontSizePt;
- $lw = $this->LineWidth;
- $dc = $this->DrawColor;
- $fc = $this->FillColor;
- $tc = $this->TextColor;
- $cf = $this->ColorFlag;
- if($this->page>0)
- {
- // Page footer
- $this->InFooter = true;
- $this->Footer();
- $this->InFooter = false;
- // Close page
- $this->_endpage();
- }
- // Start new page
- $this->_beginpage($orientation,$size);
- // Set line cap style to square
- $this->_out('2 J');
- // Set line width
- $this->LineWidth = $lw;
- $this->_out(sprintf('%.2F w',$lw*$this->k));
- // Set font
- if($family)
- $this->SetFont($family,$style,$fontsize);
- // Set colors
- $this->DrawColor = $dc;
- if($dc!='0 G')
- $this->_out($dc);
- $this->FillColor = $fc;
- if($fc!='0 g')
- $this->_out($fc);
- $this->TextColor = $tc;
- $this->ColorFlag = $cf;
- // Page header
- $this->InHeader = true;
- $this->Header();
- $this->InHeader = false;
- // Restore line width
- if($this->LineWidth!=$lw)
- {
- $this->LineWidth = $lw;
- $this->_out(sprintf('%.2F w',$lw*$this->k));
- }
- // Restore font
- if($family)
- $this->SetFont($family,$style,$fontsize);
- // Restore colors
- if($this->DrawColor!=$dc)
- {
- $this->DrawColor = $dc;
- $this->_out($dc);
- }
- if($this->FillColor!=$fc)
- {
- $this->FillColor = $fc;
- $this->_out($fc);
- }
- $this->TextColor = $tc;
- $this->ColorFlag = $cf;
-}
-
-function Header()
-{
- // To be implemented in your own inherited class
-}
-
-function Footer()
-{
- // To be implemented in your own inherited class
-}
-
-function PageNo()
-{
- // Get current page number
- return $this->page;
-}
-
-function SetDrawColor($r, $g=null, $b=null)
-{
- // Set color for all stroking operations
- if(($r==0 && $g==0 && $b==0) || $g===null)
- $this->DrawColor = sprintf('%.3F G',$r/255);
- else
- $this->DrawColor = sprintf('%.3F %.3F %.3F RG',$r/255,$g/255,$b/255);
- if($this->page>0)
- $this->_out($this->DrawColor);
-}
-
-function SetFillColor($r, $g=null, $b=null)
-{
- // Set color for all filling operations
- if(($r==0 && $g==0 && $b==0) || $g===null)
- $this->FillColor = sprintf('%.3F g',$r/255);
- else
- $this->FillColor = sprintf('%.3F %.3F %.3F rg',$r/255,$g/255,$b/255);
- $this->ColorFlag = ($this->FillColor!=$this->TextColor);
- if($this->page>0)
- $this->_out($this->FillColor);
-}
-
-function SetTextColor($r, $g=null, $b=null)
-{
- // Set color for text
- if(($r==0 && $g==0 && $b==0) || $g===null)
- $this->TextColor = sprintf('%.3F g',$r/255);
- else
- $this->TextColor = sprintf('%.3F %.3F %.3F rg',$r/255,$g/255,$b/255);
- $this->ColorFlag = ($this->FillColor!=$this->TextColor);
-}
-
-function GetStringWidth($s)
-{
- // Get width of a string in the current font
- $s = (string)$s;
- $cw = &$this->CurrentFont['cw'];
- $w = 0;
- $l = strlen($s);
- for($i=0;$i<$l;$i++)
- $w += $cw[$s[$i]];
- return $w*$this->FontSize/1000;
-}
-
-function SetLineWidth($width)
-{
- // Set line width
- $this->LineWidth = $width;
- if($this->page>0)
- $this->_out(sprintf('%.2F w',$width*$this->k));
-}
-
-function Line($x1, $y1, $x2, $y2)
-{
- // Draw a line
- $this->_out(sprintf('%.2F %.2F m %.2F %.2F l S',$x1*$this->k,($this->h-$y1)*$this->k,$x2*$this->k,($this->h-$y2)*$this->k));
-}
-
-function Rect($x, $y, $w, $h, $style='')
-{
- // Draw a rectangle
- if($style=='F')
- $op = 'f';
- elseif($style=='FD' || $style=='DF')
- $op = 'B';
- else
- $op = 'S';
- $this->_out(sprintf('%.2F %.2F %.2F %.2F re %s',$x*$this->k,($this->h-$y)*$this->k,$w*$this->k,-$h*$this->k,$op));
-}
-
-function AddFont($family, $style='', $file='')
-{
- // Add a TrueType, OpenType or Type1 font
- $family = strtolower($family);
- if($file=='')
- $file = str_replace(' ','',$family).strtolower($style).'.php';
- $style = strtoupper($style);
- if($style=='IB')
- $style = 'BI';
- $fontkey = $family.$style;
- if(isset($this->fonts[$fontkey]))
- return;
- $info = $this->_loadfont($file);
- $info['i'] = count($this->fonts)+1;
- if(!empty($info['diff']))
- {
- // Search existing encodings
- $n = array_search($info['diff'],$this->diffs);
- if(!$n)
- {
- $n = count($this->diffs)+1;
- $this->diffs[$n] = $info['diff'];
- }
- $info['diffn'] = $n;
- }
- if(!empty($info['file']))
- {
- // Embedded font
- if($info['type']=='TrueType')
- $this->FontFiles[$info['file']] = array('length1'=>$info['originalsize']);
- else
- $this->FontFiles[$info['file']] = array('length1'=>$info['size1'], 'length2'=>$info['size2']);
- }
- $this->fonts[$fontkey] = $info;
-}
-
-function SetFont($family, $style='', $size=0)
-{
- // Select a font; size given in points
- if($family=='')
- $family = $this->FontFamily;
- else
- $family = strtolower($family);
- $style = strtoupper($style);
- if(strpos($style,'U')!==false)
- {
- $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 && $this->FontStyle==$style && $this->FontSizePt==$size)
- return;
- // Test if font is already loaded
- $fontkey = $family.$style;
- if(!isset($this->fonts[$fontkey]))
- {
- // Test if one of the core fonts
- if($family=='arial')
- $family = 'helvetica';
- if(in_array($family,$this->CoreFonts))
- {
- if($family=='symbol' || $family=='zapfdingbats')
- $style = '';
- $fontkey = $family.$style;
- if(!isset($this->fonts[$fontkey]))
- $this->AddFont($family,$style);
- }
- 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 /F%d %.2F Tf ET',$this->CurrentFont['i'],$this->FontSizePt));
-}
-
-function SetFontSize($size)
-{
- // Set font size in points
- if($this->FontSizePt==$size)
- return;
- $this->FontSizePt = $size;
- $this->FontSize = $size/$this->k;
- if($this->page>0)
- $this->_out(sprintf('BT /F%d %.2F Tf ET',$this->CurrentFont['i'],$this->FontSizePt));
-}
-
-function AddLink()
-{
- // Create a new internal link
- $n = count($this->links)+1;
- $this->links[$n] = array(0, 0);
- return $n;
-}
-
-function SetLink($link, $y=0, $page=-1)
-{
- // Set destination of internal link
- if($y==-1)
- $y = $this->y;
- if($page==-1)
- $page = $this->page;
- $this->links[$link] = array($page, $y);
-}
-
-function Link($x, $y, $w, $h, $link)
-{
- // Put a link on the page
- $this->PageLinks[$this->page][] = array($x*$this->k, $this->hPt-$y*$this->k, $w*$this->k, $h*$this->k, $link);
-}
-
-function Text($x, $y, $txt)
-{
- // Output a string
- $s = sprintf('BT %.2F %.2F Td (%s) Tj ET',$x*$this->k,($this->h-$y)*$this->k,$this->_escape($txt));
- if($this->underline && $txt!='')
- $s .= ' '.$this->_dounderline($x,$y,$txt);
- if($this->ColorFlag)
- $s = 'q '.$this->TextColor.' '.$s.' Q';
- $this->_out($s);
-}
-
-function AcceptPageBreak()
-{
- // Accept automatic page break or not
- return $this->AutoPageBreak;
-}
-
-function Cell($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='')
-{
- // Output a cell
- $k = $this->k;
- if($this->y+$h>$this->PageBreakTrigger && !$this->InHeader && !$this->InFooter && $this->AcceptPageBreak())
- {
- // Automatic page break
- $x = $this->x;
- $ws = $this->ws;
- if($ws>0)
- {
- $this->ws = 0;
- $this->_out('0 Tw');
- }
- $this->AddPage($this->CurOrientation,$this->CurPageSize);
- $this->x = $x;
- if($ws>0)
- {
- $this->ws = $ws;
- $this->_out(sprintf('%.3F Tw',$ws*$k));
- }
- }
- if($w==0)
- $w = $this->w-$this->rMargin-$this->x;
- $s = '';
- if($fill || $border==1)
- {
- if($fill)
- $op = ($border==1) ? 'B' : 'f';
- else
- $op = 'S';
- $s = sprintf('%.2F %.2F %.2F %.2F re %s ',$this->x*$k,($this->h-$this->y)*$k,$w*$k,-$h*$k,$op);
- }
- if(is_string($border))
- {
- $x = $this->x;
- $y = $this->y;
- if(strpos($border,'L')!==false)
- $s .= sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-$y)*$k,$x*$k,($this->h-($y+$h))*$k);
- if(strpos($border,'T')!==false)
- $s .= sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-$y)*$k);
- if(strpos($border,'R')!==false)
- $s .= sprintf('%.2F %.2F m %.2F %.2F l S ',($x+$w)*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-($y+$h))*$k);
- if(strpos($border,'B')!==false)
- $s .= sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-($y+$h))*$k,($x+$w)*$k,($this->h-($y+$h))*$k);
- }
- if($txt!=='')
- {
- if($align=='R')
- $dx = $w-$this->cMargin-$this->GetStringWidth($txt);
- elseif($align=='C')
- $dx = ($w-$this->GetStringWidth($txt))/2;
- else
- $dx = $this->cMargin;
- if($this->ColorFlag)
- $s .= 'q '.$this->TextColor.' ';
- $txt2 = str_replace(')','\\)',str_replace('(','\\(',str_replace('\\','\\\\',$txt)));
- $s .= sprintf('BT %.2F %.2F Td (%s) Tj ET',($this->x+$dx)*$k,($this->h-($this->y+.5*$h+.3*$this->FontSize))*$k,$txt2);
- if($this->underline)
- $s .= ' '.$this->_dounderline($this->x+$dx,$this->y+.5*$h+.3*$this->FontSize,$txt);
- if($this->ColorFlag)
- $s .= ' Q';
- if($link)
- $this->Link($this->x+$dx,$this->y+.5*$h-.5*$this->FontSize,$this->GetStringWidth($txt),$this->FontSize,$link);
- }
- if($s)
- $this->_out($s);
- $this->lasth = $h;
- if($ln>0)
- {
- // Go to next line
- $this->y += $h;
- if($ln==1)
- $this->x = $this->lMargin;
- }
- else
- $this->x += $w;
-}
-
-function MultiCell($w, $h, $txt, $border=0, $align='J', $fill=false)
-{
- // Output text with automatic or explicit line breaks
- $cw = &$this->CurrentFont['cw'];
- if($w==0)
- $w = $this->w-$this->rMargin-$this->x;
- $wmax = ($w-2*$this->cMargin)*1000/$this->FontSize;
- $s = str_replace("\r",'',$txt);
- $nb = strlen($s);
- if($nb>0 && $s[$nb-1]=="\n")
- $nb--;
- $b = 0;
- if($border)
- {
- if($border==1)
- {
- $border = 'LTRB';
- $b = 'LRT';
- $b2 = 'LR';
- }
- else
- {
- $b2 = '';
- if(strpos($border,'L')!==false)
- $b2 .= 'L';
- if(strpos($border,'R')!==false)
- $b2 .= 'R';
- $b = (strpos($border,'T')!==false) ? $b2.'T' : $b2;
- }
- }
- $sep = -1;
- $i = 0;
- $j = 0;
- $l = 0;
- $ns = 0;
- $nl = 1;
- while($i<$nb)
- {
- // Get next character
- $c = $s[$i];
- if($c=="\n")
- {
- // Explicit line break
- if($this->ws>0)
- {
- $this->ws = 0;
- $this->_out('0 Tw');
- }
- $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill);
- $i++;
- $sep = -1;
- $j = $i;
- $l = 0;
- $ns = 0;
- $nl++;
- if($border && $nl==2)
- $b = $b2;
- continue;
- }
- if($c==' ')
- {
- $sep = $i;
- $ls = $l;
- $ns++;
- }
- $l += $cw[$c];
- if($l>$wmax)
- {
- // Automatic line break
- if($sep==-1)
- {
- if($i==$j)
- $i++;
- if($this->ws>0)
- {
- $this->ws = 0;
- $this->_out('0 Tw');
- }
- $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill);
- }
- else
- {
- if($align=='J')
- {
- $this->ws = ($ns>1) ? ($wmax-$ls)/1000*$this->FontSize/($ns-1) : 0;
- $this->_out(sprintf('%.3F Tw',$this->ws*$this->k));
- }
- $this->Cell($w,$h,substr($s,$j,$sep-$j),$b,2,$align,$fill);
- $i = $sep+1;
- }
- $sep = -1;
- $j = $i;
- $l = 0;
- $ns = 0;
- $nl++;
- if($border && $nl==2)
- $b = $b2;
- }
- else
- $i++;
- }
- // Last chunk
- if($this->ws>0)
- {
- $this->ws = 0;
- $this->_out('0 Tw');
- }
- if($border && strpos($border,'B')!==false)
- $b .= 'B';
- $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill);
- $this->x = $this->lMargin;
-}
-
-function Write($h, $txt, $link='')
-{
- // Output text in flowing mode
- $cw = &$this->CurrentFont['cw'];
- $w = $this->w-$this->rMargin-$this->x;
- $wmax = ($w-2*$this->cMargin)*1000/$this->FontSize;
- $s = str_replace("\r",'',$txt);
- $nb = strlen($s);
- $sep = -1;
- $i = 0;
- $j = 0;
- $l = 0;
- $nl = 1;
- while($i<$nb)
- {
- // Get next character
- $c = $s[$i];
- if($c=="\n")
- {
- // Explicit line break
- $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link);
- $i++;
- $sep = -1;
- $j = $i;
- $l = 0;
- if($nl==1)
- {
- $this->x = $this->lMargin;
- $w = $this->w-$this->rMargin-$this->x;
- $wmax = ($w-2*$this->cMargin)*1000/$this->FontSize;
- }
- $nl++;
- continue;
- }
- if($c==' ')
- $sep = $i;
- $l += $cw[$c];
- if($l>$wmax)
- {
- // Automatic line break
- if($sep==-1)
- {
- if($this->x>$this->lMargin)
- {
- // Move to next line
- $this->x = $this->lMargin;
- $this->y += $h;
- $w = $this->w-$this->rMargin-$this->x;
- $wmax = ($w-2*$this->cMargin)*1000/$this->FontSize;
- $i++;
- $nl++;
- continue;
- }
- if($i==$j)
- $i++;
- $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link);
- }
- else
- {
- $this->Cell($w,$h,substr($s,$j,$sep-$j),0,2,'',0,$link);
- $i = $sep+1;
- }
- $sep = -1;
- $j = $i;
- $l = 0;
- if($nl==1)
- {
- $this->x = $this->lMargin;
- $w = $this->w-$this->rMargin-$this->x;
- $wmax = ($w-2*$this->cMargin)*1000/$this->FontSize;
- }
- $nl++;
- }
- else
- $i++;
- }
- // Last chunk
- if($i!=$j)
- $this->Cell($l/1000*$this->FontSize,$h,substr($s,$j),0,0,'',0,$link);
-}
-
-function Ln($h=null)
-{
- // Line feed; default value is last cell height
- $this->x = $this->lMargin;
- if($h===null)
- $this->y += $this->lasth;
- else
- $this->y += $h;
-}
-
-function Image($file, $x=null, $y=null, $w=0, $h=0, $type='', $link='')
-{
- // Put an image on the page
- if(!isset($this->images[$file]))
- {
- // First use of this image, get info
- if($type=='')
- {
- $pos = strrpos($file,'.');
- if(!$pos)
- $this->Error('Image file has no extension and no type was specified: '.$file);
- $type = substr($file,$pos+1);
- }
- $type = strtolower($type);
- if($type=='jpeg')
- $type = 'jpg';
- $mtd = '_parse'.$type;
- if(!method_exists($this,$mtd))
- $this->Error('Unsupported image type: '.$type);
- $info = $this->$mtd($file);
- $info['i'] = count($this->images)+1;
- $this->images[$file] = $info;
- }
- else
- $info = $this->images[$file];
-
- // Automatic width and height calculation if needed
- if($w==0 && $h==0)
- {
- // Put image at 96 dpi
- $w = -96;
- $h = -96;
- }
- if($w<0)
- $w = -$info['w']*72/$w/$this->k;
- if($h<0)
- $h = -$info['h']*72/$h/$this->k;
- if($w==0)
- $w = $h*$info['w']/$info['h'];
- if($h==0)
- $h = $w*$info['h']/$info['w'];
-
- // Flowing mode
- if($y===null)
- {
- if($this->y+$h>$this->PageBreakTrigger && !$this->InHeader && !$this->InFooter && $this->AcceptPageBreak())
- {
- // Automatic page break
- $x2 = $this->x;
- $this->AddPage($this->CurOrientation,$this->CurPageSize);
- $this->x = $x2;
- }
- $y = $this->y;
- $this->y += $h;
- }
-
- if($x===null)
- $x = $this->x;
- $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->h-($y+$h))*$this->k,$info['i']));
- if($link)
- $this->Link($x,$y,$w,$h,$link);
-}
-
-function GetX()
-{
- // Get x position
- return $this->x;
-}
-
-function SetX($x)
-{
- // Set x position
- if($x>=0)
- $this->x = $x;
- else
- $this->x = $this->w+$x;
-}
-
-function GetY()
-{
- // Get y position
- return $this->y;
-}
-
-function SetY($y)
-{
- // Set y position and reset x
- $this->x = $this->lMargin;
- if($y>=0)
- $this->y = $y;
- else
- $this->y = $this->h+$y;
-}
-
-function SetXY($x, $y)
-{
- // Set x and y positions
- $this->SetY($y);
- $this->SetX($x);
-}
-
-function Output($name='', $dest='')
-{
- // Output PDF to some destination
- if($this->state<3)
- $this->Close();
- $dest = strtoupper($dest);
- if($dest=='')
- {
- if($name=='')
- {
- $name = 'doc.pdf';
- $dest = 'I';
- }
- else
- $dest = 'F';
- }
- switch($dest)
- {
- case 'I':
- // Send to standard output
- $this->_checkoutput();
- if(PHP_SAPI!='cli')
- {
- // We send to a browser
- header('Content-Type: application/pdf');
- header('Content-Disposition: inline; filename="'.$name.'"');
- header('Cache-Control: private, max-age=0, must-revalidate');
- header('Pragma: public');
- }
- echo $this->buffer;
- break;
- case 'D':
- // Download file
- $this->_checkoutput();
- header('Content-Type: application/x-download');
- header('Content-Disposition: attachment; filename="'.$name.'"');
- header('Cache-Control: private, max-age=0, must-revalidate');
- header('Pragma: public');
- echo $this->buffer;
- break;
- case 'F':
- // Save to local file
- $f = fopen($name,'wb');
- if(!$f)
- $this->Error('Unable to create output file: '.$name);
- fwrite($f,$this->buffer,strlen($this->buffer));
- fclose($f);
- break;
- case 'S':
- // Return as a string
- return $this->buffer;
- default:
- $this->Error('Incorrect output destination: '.$dest);
- }
- return '';
-}
-
-/*******************************************************************************
-* *
-* Protected methods *
-* *
-*******************************************************************************/
-function _dochecks()
-{
- // Check availability of %F
- if(sprintf('%.1F',1.0)!='1.0')
- $this->Error('This version of PHP is not supported');
- // Check mbstring overloading
- if(ini_get('mbstring.func_overload') & 2)
- $this->Error('mbstring overloading must be disabled');
-}
-
-function _checkoutput()
-{
- if(PHP_SAPI!='cli')
- {
- if(headers_sent($file,$line))
- $this->Error("Some data has already been output, can't send PDF file (output started at $file:$line)");
- }
- if(ob_get_length())
- {
- // The output buffer is not empty
- if(preg_match('/^(\xEF\xBB\xBF)?\s*$/',ob_get_contents()))
- {
- // It contains only a UTF-8 BOM and/or whitespace, let's clean it
- ob_clean();
- }
- else
- $this->Error("Some data has already been output, can't send PDF file");
- }
-}
-
-function _getpagesize($size)
-{
- if(is_string($size))
- {
- $size = strtolower($size);
- if(!isset($this->StdPageSizes[$size]))
- $this->Error('Unknown page size: '.$size);
- $a = $this->StdPageSizes[$size];
- return array($a[0]/$this->k, $a[1]/$this->k);
- }
- else
- {
- if($size[0]>$size[1])
- return array($size[1], $size[0]);
- else
- return $size;
- }
-}
-
-function _beginpage($orientation, $size)
-{
- $this->page++;
- $this->pages[$this->page] = '';
- $this->state = 2;
- $this->x = $this->lMargin;
- $this->y = $this->tMargin;
- $this->FontFamily = '';
- // Check page size and orientation
- if($orientation=='')
- $orientation = $this->DefOrientation;
- else
- $orientation = strtoupper($orientation[0]);
- if($size=='')
- $size = $this->DefPageSize;
- else
- $size = $this->_getpagesize($size);
- if($orientation!=$this->CurOrientation || $size[0]!=$this->CurPageSize[0] || $size[1]!=$this->CurPageSize[1])
- {
- // New size or orientation
- if($orientation=='P')
- {
- $this->w = $size[0];
- $this->h = $size[1];
- }
- else
- {
- $this->w = $size[1];
- $this->h = $size[0];
- }
- $this->wPt = $this->w*$this->k;
- $this->hPt = $this->h*$this->k;
- $this->PageBreakTrigger = $this->h-$this->bMargin;
- $this->CurOrientation = $orientation;
- $this->CurPageSize = $size;
- }
- if($orientation!=$this->DefOrientation || $size[0]!=$this->DefPageSize[0] || $size[1]!=$this->DefPageSize[1])
- $this->PageSizes[$this->page] = array($this->wPt, $this->hPt);
-}
-
-function _endpage()
-{
- $this->state = 1;
-}
-
-function _loadfont($font)
-{
- // Load a font definition file from the font directory
- include($this->fontpath.$font);
- $a = get_defined_vars();
- if(!isset($a['name']))
- $this->Error('Could not include font definition file');
- return $a;
-}
-
-function _escape($s)
-{
- // Escape special characters in strings
- $s = str_replace('\\','\\\\',$s);
- $s = str_replace('(','\\(',$s);
- $s = str_replace(')','\\)',$s);
- $s = str_replace("\r",'\\r',$s);
- return $s;
-}
-
-function _textstring($s)
-{
- // Format a text string
- return '('.$this->_escape($s).')';
-}
-
-function _UTF8toUTF16($s)
-{
- // Convert UTF-8 to UTF-16BE with BOM
- $res = "\xFE\xFF";
- $nb = strlen($s);
- $i = 0;
- while($i<$nb)
- {
- $c1 = ord($s[$i++]);
- if($c1>=224)
- {
- // 3-byte character
- $c2 = ord($s[$i++]);
- $c3 = ord($s[$i++]);
- $res .= chr((($c1 & 0x0F)<<4) + (($c2 & 0x3C)>>2));
- $res .= chr((($c2 & 0x03)<<6) + ($c3 & 0x3F));
- }
- elseif($c1>=192)
- {
- // 2-byte character
- $c2 = ord($s[$i++]);
- $res .= chr(($c1 & 0x1C)>>2);
- $res .= chr((($c1 & 0x03)<<6) + ($c2 & 0x3F));
- }
- else
- {
- // Single-byte character
- $res .= "\0".chr($c1);
- }
- }
- return $res;
-}
-
-function _dounderline($x, $y, $txt)
-{
- // Underline text
- $up = $this->CurrentFont['up'];
- $ut = $this->CurrentFont['ut'];
- $w = $this->GetStringWidth($txt)+$this->ws*substr_count($txt,' ');
- return sprintf('%.2F %.2F %.2F %.2F re f',$x*$this->k,($this->h-($y-$up/1000*$this->FontSize))*$this->k,$w*$this->k,-$ut/1000*$this->FontSizePt);
-}
-
-function _parsejpg($file)
-{
- // Extract info from a JPEG file
- $a = getimagesize($file);
- if(!$a)
- $this->Error('Missing or incorrect image file: '.$file);
- if($a[2]!=2)
- $this->Error('Not a JPEG file: '.$file);
- if(!isset($a['channels']) || $a['channels']==3)
- $colspace = 'DeviceRGB';
- elseif($a['channels']==4)
- $colspace = 'DeviceCMYK';
- else
- $colspace = 'DeviceGray';
- $bpc = isset($a['bits']) ? $a['bits'] : 8;
- $data = file_get_contents($file);
- return array('w'=>$a[0], 'h'=>$a[1], 'cs'=>$colspace, 'bpc'=>$bpc, 'f'=>'DCTDecode', 'data'=>$data);
-}
-
-function _parsepng($file)
-{
- // Extract info from a PNG file
- $f = fopen($file,'rb');
- if(!$f)
- $this->Error('Can\'t open image file: '.$file);
- $info = $this->_parsepngstream($f,$file);
- fclose($f);
- return $info;
-}
-
-function _parsepngstream($f, $file)
-{
- // Check signature
- if($this->_readstream($f,8)!=chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10))
- $this->Error('Not a PNG file: '.$file);
-
- // Read header chunk
- $this->_readstream($f,4);
- if($this->_readstream($f,4)!='IHDR')
- $this->Error('Incorrect PNG file: '.$file);
- $w = $this->_readint($f);
- $h = $this->_readint($f);
- $bpc = ord($this->_readstream($f,1));
- if($bpc>8)
- $this->Error('16-bit depth not supported: '.$file);
- $ct = ord($this->_readstream($f,1));
- if($ct==0 || $ct==4)
- $colspace = 'DeviceGray';
- elseif($ct==2 || $ct==6)
- $colspace = 'DeviceRGB';
- elseif($ct==3)
- $colspace = 'Indexed';
- else
- $this->Error('Unknown color type: '.$file);
- if(ord($this->_readstream($f,1))!=0)
- $this->Error('Unknown compression method: '.$file);
- if(ord($this->_readstream($f,1))!=0)
- $this->Error('Unknown filter method: '.$file);
- if(ord($this->_readstream($f,1))!=0)
- $this->Error('Interlacing not supported: '.$file);
- $this->_readstream($f,4);
- $dp = '/Predictor 15 /Colors '.($colspace=='DeviceRGB' ? 3 : 1).' /BitsPerComponent '.$bpc.' /Columns '.$w;
-
- // Scan chunks looking for palette, transparency and image data
- $pal = '';
- $trns = '';
- $data = '';
- do
- {
- $n = $this->_readint($f);
- $type = $this->_readstream($f,4);
- if($type=='PLTE')
- {
- // Read palette
- $pal = $this->_readstream($f,$n);
- $this->_readstream($f,4);
- }
- elseif($type=='tRNS')
- {
- // Read transparency info
- $t = $this->_readstream($f,$n);
- if($ct==0)
- $trns = array(ord(substr($t,1,1)));
- elseif($ct==2)
- $trns = array(ord(substr($t,1,1)), ord(substr($t,3,1)), ord(substr($t,5,1)));
- else
- {
- $pos = strpos($t,chr(0));
- if($pos!==false)
- $trns = array($pos);
- }
- $this->_readstream($f,4);
- }
- elseif($type=='IDAT')
- {
- // Read image data block
- $data .= $this->_readstream($f,$n);
- $this->_readstream($f,4);
- }
- elseif($type=='IEND')
- break;
- else
- $this->_readstream($f,$n+4);
- }
- while($n);
-
- if($colspace=='Indexed' && empty($pal))
- $this->Error('Missing palette in '.$file);
- $info = array('w'=>$w, 'h'=>$h, 'cs'=>$colspace, 'bpc'=>$bpc, 'f'=>'FlateDecode', 'dp'=>$dp, 'pal'=>$pal, 'trns'=>$trns);
- if($ct>=4)
- {
- // Extract alpha channel
- if(!function_exists('gzuncompress'))
- $this->Error('Zlib not available, can\'t handle alpha channel: '.$file);
- $data = gzuncompress($data);
- $color = '';
- $alpha = '';
- if($ct==4)
- {
- // Gray image
- $len = 2*$w;
- for($i=0;$i<$h;$i++)
- {
- $pos = (1+$len)*$i;
- $color .= $data[$pos];
- $alpha .= $data[$pos];
- $line = substr($data,$pos+1,$len);
- $color .= preg_replace('/(.)./s','$1',$line);
- $alpha .= preg_replace('/.(.)/s','$1',$line);
- }
- }
- else
- {
- // RGB image
- $len = 4*$w;
- for($i=0;$i<$h;$i++)
- {
- $pos = (1+$len)*$i;
- $color .= $data[$pos];
- $alpha .= $data[$pos];
- $line = substr($data,$pos+1,$len);
- $color .= preg_replace('/(.{3})./s','$1',$line);
- $alpha .= preg_replace('/.{3}(.)/s','$1',$line);
- }
- }
- unset($data);
- $data = gzcompress($color);
- $info['smask'] = gzcompress($alpha);
- if($this->PDFVersion<'1.4')
- $this->PDFVersion = '1.4';
- }
- $info['data'] = $data;
- return $info;
-}
-
-function _readstream($f, $n)
-{
- // Read n bytes from stream
- $res = '';
- while($n>0 && !feof($f))
- {
- $s = fread($f,$n);
- if($s===false)
- $this->Error('Error while reading stream');
- $n -= strlen($s);
- $res .= $s;
- }
- if($n>0)
- $this->Error('Unexpected end of stream');
- return $res;
-}
-
-function _readint($f)
-{
- // Read a 4-byte integer from stream
- $a = unpack('Ni',$this->_readstream($f,4));
- return $a['i'];
-}
-
-function _parsegif($file)
-{
- // Extract info from a GIF file (via PNG conversion)
- if(!function_exists('imagepng'))
- $this->Error('GD extension is required for GIF support');
- if(!function_exists('imagecreatefromgif'))
- $this->Error('GD has no GIF read support');
- $im = imagecreatefromgif($file);
- if(!$im)
- $this->Error('Missing or incorrect image file: '.$file);
- imageinterlace($im,0);
- $f = @fopen('php://temp','rb+');
- if($f)
- {
- // Perform conversion in memory
- ob_start();
- imagepng($im);
- $data = ob_get_clean();
- imagedestroy($im);
- fwrite($f,$data);
- rewind($f);
- $info = $this->_parsepngstream($f,$file);
- fclose($f);
- }
- else
- {
- // Use temporary file
- $tmp = tempnam('.','gif');
- if(!$tmp)
- $this->Error('Unable to create a temporary file');
- if(!imagepng($im,$tmp))
- $this->Error('Error while saving to temporary file');
- imagedestroy($im);
- $info = $this->_parsepng($tmp);
- unlink($tmp);
- }
- return $info;
-}
-
-function _newobj()
-{
- // Begin a new object
- $this->n++;
- $this->offsets[$this->n] = strlen($this->buffer);
- $this->_out($this->n.' 0 obj');
-}
-
-function _putstream($s)
-{
- $this->_out('stream');
- $this->_out($s);
- $this->_out('endstream');
-}
-
-function _out($s)
-{
- // Add a line to the document
- if($this->state==2)
- $this->pages[$this->page] .= $s."\n";
- else
- $this->buffer .= $s."\n";
-}
-
-function _putpages()
-{
- $nb = $this->page;
- if(!empty($this->AliasNbPages))
- {
- // Replace number of pages
- for($n=1;$n<=$nb;$n++)
- $this->pages[$n] = str_replace($this->AliasNbPages,$nb,$this->pages[$n]);
- }
- if($this->DefOrientation=='P')
- {
- $wPt = $this->DefPageSize[0]*$this->k;
- $hPt = $this->DefPageSize[1]*$this->k;
- }
- else
- {
- $wPt = $this->DefPageSize[1]*$this->k;
- $hPt = $this->DefPageSize[0]*$this->k;
- }
- $filter = ($this->compress) ? '/Filter /FlateDecode ' : '';
- for($n=1;$n<=$nb;$n++)
- {
- // Page
- $this->_newobj();
- $this->_out('<_out('/Parent 1 0 R');
- if(isset($this->PageSizes[$n]))
- $this->_out(sprintf('/MediaBox [0 0 %.2F %.2F]',$this->PageSizes[$n][0],$this->PageSizes[$n][1]));
- $this->_out('/Resources 2 0 R');
- if(isset($this->PageLinks[$n]))
- {
- // Links
- $annots = '/Annots [';
- foreach($this->PageLinks[$n] as $pl)
- {
- $rect = sprintf('%.2F %.2F %.2F %.2F',$pl[0],$pl[1],$pl[0]+$pl[2],$pl[1]-$pl[3]);
- $annots .= '<_textstring($pl[4]).'>>>>';
- else
- {
- $l = $this->links[$pl[4]];
- $h = isset($this->PageSizes[$l[0]]) ? $this->PageSizes[$l[0]][1] : $hPt;
- $annots .= sprintf('/Dest [%d 0 R /XYZ 0 %.2F null]>>',1+2*$l[0],$h-$l[1]*$this->k);
- }
- }
- $this->_out($annots.']');
- }
- if($this->PDFVersion>'1.3')
- $this->_out('/Group <>');
- $this->_out('/Contents '.($this->n+1).' 0 R>>');
- $this->_out('endobj');
- // Page content
- $p = ($this->compress) ? gzcompress($this->pages[$n]) : $this->pages[$n];
- $this->_newobj();
- $this->_out('<<'.$filter.'/Length '.strlen($p).'>>');
- $this->_putstream($p);
- $this->_out('endobj');
- }
- // Pages root
- $this->offsets[1] = strlen($this->buffer);
- $this->_out('1 0 obj');
- $this->_out('<_out($kids.']');
- $this->_out('/Count '.$nb);
- $this->_out(sprintf('/MediaBox [0 0 %.2F %.2F]',$wPt,$hPt));
- $this->_out('>>');
- $this->_out('endobj');
-}
-
-function _putfonts()
-{
- $nf = $this->n;
- foreach($this->diffs as $diff)
- {
- // Encodings
- $this->_newobj();
- $this->_out('<>');
- $this->_out('endobj');
- }
- foreach($this->FontFiles as $file=>$info)
- {
- // Font file embedding
- $this->_newobj();
- $this->FontFiles[$file]['n'] = $this->n;
- $font = file_get_contents($this->fontpath.$file,true);
- if(!$font)
- $this->Error('Font file not found: '.$file);
- $compressed = (substr($file,-2)=='.z');
- if(!$compressed && isset($info['length2']))
- $font = substr($font,6,$info['length1']).substr($font,6+$info['length1']+6,$info['length2']);
- $this->_out('<_out('/Filter /FlateDecode');
- $this->_out('/Length1 '.$info['length1']);
- if(isset($info['length2']))
- $this->_out('/Length2 '.$info['length2'].' /Length3 0');
- $this->_out('>>');
- $this->_putstream($font);
- $this->_out('endobj');
- }
- foreach($this->fonts as $k=>$font)
- {
- // Font objects
- $this->fonts[$k]['n'] = $this->n+1;
- $type = $font['type'];
- $name = $font['name'];
- if($type=='Core')
- {
- // Core font
- $this->_newobj();
- $this->_out('<_out('/BaseFont /'.$name);
- $this->_out('/Subtype /Type1');
- if($name!='Symbol' && $name!='ZapfDingbats')
- $this->_out('/Encoding /WinAnsiEncoding');
- $this->_out('>>');
- $this->_out('endobj');
- }
- elseif($type=='Type1' || $type=='TrueType')
- {
- // Additional Type1 or TrueType/OpenType font
- $this->_newobj();
- $this->_out('<_out('/BaseFont /'.$name);
- $this->_out('/Subtype /'.$type);
- $this->_out('/FirstChar 32 /LastChar 255');
- $this->_out('/Widths '.($this->n+1).' 0 R');
- $this->_out('/FontDescriptor '.($this->n+2).' 0 R');
- if(isset($font['diffn']))
- $this->_out('/Encoding '.($nf+$font['diffn']).' 0 R');
- else
- $this->_out('/Encoding /WinAnsiEncoding');
- $this->_out('>>');
- $this->_out('endobj');
- // Widths
- $this->_newobj();
- $cw = &$font['cw'];
- $s = '[';
- for($i=32;$i<=255;$i++)
- $s .= $cw[chr($i)].' ';
- $this->_out($s.']');
- $this->_out('endobj');
- // Descriptor
- $this->_newobj();
- $s = '<$v)
- $s .= ' /'.$k.' '.$v;
- if(!empty($font['file']))
- $s .= ' /FontFile'.($type=='Type1' ? '' : '2').' '.$this->FontFiles[$font['file']]['n'].' 0 R';
- $this->_out($s.'>>');
- $this->_out('endobj');
- }
- else
- {
- // Allow for additional types
- $mtd = '_put'.strtolower($type);
- if(!method_exists($this,$mtd))
- $this->Error('Unsupported font type: '.$type);
- $this->$mtd($font);
- }
- }
-}
-
-function _putimages()
-{
- foreach(array_keys($this->images) as $file)
- {
- $this->_putimage($this->images[$file]);
- unset($this->images[$file]['data']);
- unset($this->images[$file]['smask']);
- }
-}
-
-function _putimage(&$info)
-{
- $this->_newobj();
- $info['n'] = $this->n;
- $this->_out('<_out('/Subtype /Image');
- $this->_out('/Width '.$info['w']);
- $this->_out('/Height '.$info['h']);
- if($info['cs']=='Indexed')
- $this->_out('/ColorSpace [/Indexed /DeviceRGB '.(strlen($info['pal'])/3-1).' '.($this->n+1).' 0 R]');
- else
- {
- $this->_out('/ColorSpace /'.$info['cs']);
- if($info['cs']=='DeviceCMYK')
- $this->_out('/Decode [1 0 1 0 1 0 1 0]');
- }
- $this->_out('/BitsPerComponent '.$info['bpc']);
- if(isset($info['f']))
- $this->_out('/Filter /'.$info['f']);
- if(isset($info['dp']))
- $this->_out('/DecodeParms <<'.$info['dp'].'>>');
- if(isset($info['trns']) && is_array($info['trns']))
- {
- $trns = '';
- for($i=0;$i_out('/Mask ['.$trns.']');
- }
- if(isset($info['smask']))
- $this->_out('/SMask '.($this->n+1).' 0 R');
- $this->_out('/Length '.strlen($info['data']).'>>');
- $this->_putstream($info['data']);
- $this->_out('endobj');
- // Soft mask
- if(isset($info['smask']))
- {
- $dp = '/Predictor 15 /Colors 1 /BitsPerComponent 8 /Columns '.$info['w'];
- $smask = array('w'=>$info['w'], 'h'=>$info['h'], 'cs'=>'DeviceGray', 'bpc'=>8, 'f'=>$info['f'], 'dp'=>$dp, 'data'=>$info['smask']);
- $this->_putimage($smask);
- }
- // Palette
- if($info['cs']=='Indexed')
- {
- $filter = ($this->compress) ? '/Filter /FlateDecode ' : '';
- $pal = ($this->compress) ? gzcompress($info['pal']) : $info['pal'];
- $this->_newobj();
- $this->_out('<<'.$filter.'/Length '.strlen($pal).'>>');
- $this->_putstream($pal);
- $this->_out('endobj');
- }
-}
-
-function _putxobjectdict()
-{
- foreach($this->images as $image)
- $this->_out('/I'.$image['i'].' '.$image['n'].' 0 R');
-}
-
-function _putresourcedict()
-{
- $this->_out('/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]');
- $this->_out('/Font <<');
- foreach($this->fonts as $font)
- $this->_out('/F'.$font['i'].' '.$font['n'].' 0 R');
- $this->_out('>>');
- $this->_out('/XObject <<');
- $this->_putxobjectdict();
- $this->_out('>>');
-}
-
-function _putresources()
-{
- $this->_putfonts();
- $this->_putimages();
- // Resource dictionary
- $this->offsets[2] = strlen($this->buffer);
- $this->_out('2 0 obj');
- $this->_out('<<');
- $this->_putresourcedict();
- $this->_out('>>');
- $this->_out('endobj');
-}
-
-function _putinfo()
-{
- $this->_out('/Producer '.$this->_textstring('FPDF '.FPDF_VERSION));
- if(!empty($this->title))
- $this->_out('/Title '.$this->_textstring($this->title));
- if(!empty($this->subject))
- $this->_out('/Subject '.$this->_textstring($this->subject));
- if(!empty($this->author))
- $this->_out('/Author '.$this->_textstring($this->author));
- if(!empty($this->keywords))
- $this->_out('/Keywords '.$this->_textstring($this->keywords));
- if(!empty($this->creator))
- $this->_out('/Creator '.$this->_textstring($this->creator));
- $this->_out('/CreationDate '.$this->_textstring('D:'.@date('YmdHis')));
-}
-
-function _putcatalog()
-{
- $this->_out('/Type /Catalog');
- $this->_out('/Pages 1 0 R');
- if($this->ZoomMode=='fullpage')
- $this->_out('/OpenAction [3 0 R /Fit]');
- elseif($this->ZoomMode=='fullwidth')
- $this->_out('/OpenAction [3 0 R /FitH null]');
- elseif($this->ZoomMode=='real')
- $this->_out('/OpenAction [3 0 R /XYZ null null 1]');
- elseif(!is_string($this->ZoomMode))
- $this->_out('/OpenAction [3 0 R /XYZ null null '.sprintf('%.2F',$this->ZoomMode/100).']');
- if($this->LayoutMode=='single')
- $this->_out('/PageLayout /SinglePage');
- elseif($this->LayoutMode=='continuous')
- $this->_out('/PageLayout /OneColumn');
- elseif($this->LayoutMode=='two')
- $this->_out('/PageLayout /TwoColumnLeft');
-}
-
-function _putheader()
-{
- $this->_out('%PDF-'.$this->PDFVersion);
-}
-
-function _puttrailer()
-{
- $this->_out('/Size '.($this->n+1));
- $this->_out('/Root '.$this->n.' 0 R');
- $this->_out('/Info '.($this->n-1).' 0 R');
-}
-
-function _enddoc()
-{
- $this->_putheader();
- $this->_putpages();
- $this->_putresources();
- // Info
- $this->_newobj();
- $this->_out('<<');
- $this->_putinfo();
- $this->_out('>>');
- $this->_out('endobj');
- // Catalog
- $this->_newobj();
- $this->_out('<<');
- $this->_putcatalog();
- $this->_out('>>');
- $this->_out('endobj');
- // Cross-ref
- $o = strlen($this->buffer);
- $this->_out('xref');
- $this->_out('0 '.($this->n+1));
- $this->_out('0000000000 65535 f ');
- for($i=1;$i<=$this->n;$i++)
- $this->_out(sprintf('%010d 00000 n ',$this->offsets[$i]));
- // Trailer
- $this->_out('trailer');
- $this->_out('<<');
- $this->_puttrailer();
- $this->_out('>>');
- $this->_out('startxref');
- $this->_out($o);
- $this->_out('%%EOF');
- $this->state = 3;
-}
-// End of class
-}
-
-// Handle special IE contype request
-if(isset($_SERVER['HTTP_USER_AGENT']) && $_SERVER['HTTP_USER_AGENT']=='contype')
-{
- header('Content-Type: application/pdf');
- exit;
-}
-
-?>
diff --git a/lam/lib/lamPDF.inc b/lam/lib/lamPDF.inc
deleted file mode 100644
index bcd50665..00000000
--- a/lam/lib/lamPDF.inc
+++ /dev/null
@@ -1,132 +0,0 @@
- => array(, , , )
- */
- private $fontList = array(
- 'Dejavu' => array('DejaVuSerif.php', 'DejaVuSerif-Bold.php', 'DejaVuSerif-Bold.php', 'DejaVuSerif.php')
- );
-
- /**
- * Creates a new lamPDF object.
- *
- * @param PDFStructure structure
- * @param String $fontName font name
- */
- function __construct($structure, $fontName) {
- $this->fontName = $fontName;
- if (!defined('FPDF_FONTPATH')) {
- define('FPDF_FONTPATH', dirname(__FILE__) . '/font/');
- }
- // Call constructor of superclass
- parent::__construct('P','mm','A4');
-
- $this->structure = $structure;
-
- // Open PDF file and write some basic information
- $this->Open();
- $this->AddFont($this->fontName, '', $this->fontList[$this->fontName][0]);
- $this->AddFont($this->fontName, 'B', $this->fontList[$this->fontName][1]);
- $this->AddFont($this->fontName, 'I', $this->fontList[$this->fontName][2]);
- $this->AddFont($this->fontName, 'BI', $this->fontList[$this->fontName][3]);
- $this->setFont($this->fontName,"",12);
- $this->setTitle($structure->getTitle());
- $this->setCreator("LDAP Account Manager");
- $this->setMargins('10.0','10.0','10.0');
- $this->setAutoPageBreak(true,'20.0');
- }
-
- /**
- * Creates the PDF page header.
- */
- function header() {
- if($this->structure->getLogo() != 'none') {
- $imageFile = substr(__FILE__,0,strlen(__FILE__)- 14) . "config/pdf/" . $_SESSION['config']->getName() . "/logos/" . $this->structure->getLogo();
- $imgProperties = getimagesize($imageFile);
- $this->Image($imageFile,10,15,($imgProperties[0] / $this->k) / 5, ($imgProperties[1] / $this->k) / 5,0,"JPG");
- }
- $this->SetY(23);
- $this->SetFont($this->fontName,"B",18);
- $this->Cell(170,5,$this->structure->getTitle(), 0, 1, "R", 0);
- $this->Ln(3);
- $this->SetLineWidth(0.4);
- $this->Line(10,38,200,38);
- $this->Line(10,40,200,40);
- $this->SetY(50);
- //set folding marks
- if ($this->structure->getFoldingMarks() == PDFStructure::FOLDING_STANDARD) {
- $this->SetLineWidth(0.2);
- $foldingMarks = array(97, 202);
- foreach ($foldingMarks as $mark) {
- $this->Line(0, $mark, 5, $mark);
- }
- }
- }
-
- /**
- * Creates the PDF page footer.
- */
- function footer() {
- $this->SetLineWidth(0.4);
- $this->Line(10,280,200,280);
- $this->Line(10,282,200,282);
- $this->SetY(286);
- $this->SetFont($this->fontName,"",7);
- $this->Cell(0,5,_("This document was automatically created by LDAP Account Manager") . ' (' . getFormattedTime('Y-m-d H:i:s T') . ')',0,0,"C",0);
- }
-}
-
-?>
\ No newline at end of file
diff --git a/lam/lib/lamtcpdf.inc b/lam/lib/lamtcpdf.inc
index 6fb36ebc..ec167a38 100644
--- a/lam/lib/lamtcpdf.inc
+++ b/lam/lib/lamtcpdf.inc
@@ -93,7 +93,7 @@ class LAMTCPDF extends \TCPDF {
*/
public function Footer() {
$this->SetY(-15);
- $this->SetFont($this->fontName, '', 7);
+ $this->SetFont($this->fontName, '', LAMPDF_FONT_SIZE);
$footerText = _("This document was automatically created by LDAP Account Manager") . ' (' . getFormattedTime('Y-m-d H:i:s T') . ')';
$this->Cell(0, 10, $footerText, 0, false, 'C', 0, '', 0, false, 'T', 'M');
}
diff --git a/lam/lib/pdf.inc b/lam/lib/pdf.inc
index 06e0a376..6eccd359 100644
--- a/lam/lib/pdf.inc
+++ b/lam/lib/pdf.inc
@@ -75,11 +75,10 @@ function createModulePDF($accounts, $pdf_structure="default", $returnAsString =
}
$pdfKeys = array_unique($pdfKeys);
return createPdfTcpdf($structure, $accounts, $pdfKeys, $account_type, $returnAsString);
- //return createPdfFpdf($structure, $accounts, $pdfKeys, $account_type, $returnAsString);
}
/**
- * This function creates the PDF output of one or more accounts using FPDF.
+ * This function creates the PDF output of one or more accounts using TCPDF.
*
* @param PDFstructure $structure PDF structure
* @param array $accounts A numbered array containing all accounts the PDF page should
@@ -96,56 +95,6 @@ function createPdfTcpdf($structure, $accounts, $pdfKeys, $account_type, $returnA
$fontName = 'DejaVuSerif';
$pdf = new LAMTCPDF($structure, $fontName);
- $pdf->AddPage();
- $pdf->SetFont($fontName, "B", 12);
- $pdf->Write(0, 'testB', '', 0);
- $pdf->SetFont($fontName, "", 12);
- $pdf->Write(0, 'test', '', 0);
- $out = $pdf->Output('out.pdf', 'S');
- if (!$returnAsString) {
- // use timestamp and random number from ldap.inc as filename so it should be unique.
- $filename = '../../tmp/' . getRandomNumber() . time() .'.pdf';
- // Save PDF
- $handle = fopen($filename, 'w');
- chmod($filename, 0640);
- fwrite($handle, $out);
- fclose($handle);
- // return PDF file name
- return $filename;
- }
- else {
- return $out;
- }
-}
-
-/**
- * This function creates the PDF output of one or more accounts using FPDF.
- *
- * @param PDFstructure $structure PDF structure
- * @param array $accounts A numbered array containing all accounts the PDF page should
- * be created for. The entries of the array must be AccountContainer objects.
- * @param string $pdf_structure The filename of the structure definition that should be used
- * to create the PDF page. If not submitted the 'default.user' structure definition
- * for the appropriate account type.
- * @param $returnAsString returns the PDF output as String value instead of writing it to a file
- * @return String PDF file name
- */
-function createPdfFpdf($structure, $accounts, $pdfKeys, $account_type, $returnAsString) {
- /** PDF generator class */
- include_once("fpdf-lam.inc");
- /** Unicode support for FPDF */
- include_once("ufpdf.php");
- /** LAM PDF generator class */
- include_once("lamPDF.inc");
-
- // The decimal separator must be a dot in order to write pdf-files
- setlocale(LC_NUMERIC, "C");
-
- $fontName = "Dejavu";
-
- // Create a new PDF file acording to the account type
- $pdf = new \lamPDF($structure, $fontName);
-
// Loop over each account and add a new page in the PDF file for it
foreach($accounts as $account) {
@@ -176,7 +125,7 @@ function createPdfFpdf($structure, $accounts, $pdfKeys, $account_type, $returnAs
$section_headline = $section->getTitle();
}
$pdf->setFont($fontName, "B", LAMPDF_FONT_SIZE_BIG);
- $pdf->Write(0,$section_headline . ":");
+ $pdf->Write(0, $section_headline, '', false, 'L', true);
$pdf->Ln(LAMPDF_LINEHEIGHT);
// entries
foreach ($section->getEntries() as $entry) {
@@ -203,19 +152,21 @@ function createPdfFpdf($structure, $accounts, $pdfKeys, $account_type, $returnAs
}
}
}
- // Close PDF
- $pdf->Close();
+
+ $out = $pdf->Output('out.pdf', 'S');
if (!$returnAsString) {
// use timestamp and random number from ldap.inc as filename so it should be unique.
$filename = '../../tmp/' . getRandomNumber() . time() .'.pdf';
// Save PDF
- $pdf->Output($filename);
+ $handle = fopen($filename, 'w');
chmod($filename, 0640);
+ fwrite($handle, $out);
+ fclose($handle);
// return PDF file name
return $filename;
}
else {
- return $pdf->Output('', 'S');
+ return $out;
}
}
@@ -233,22 +184,22 @@ function getSectionHeadline($entry) {
/**
* Prints a PDFLabelValue entry.
*
- * @param lamPDF $pdf PDF
+ * @param LAMTCPDF $pdf PDF
* @param PDFLabelValue $valueEntry entry
* @param string $fontName font name
*/
function printLabelValue(&$pdf, $valueEntry, $fontName) {
$pdf->SetFont($fontName, 'B', LAMPDF_FONT_SIZE);
- $pdf->Cell(LAMPDF_LABELWIDTH, LAMPDF_LINEHEIGHT, $valueEntry->getLabel() . ':', 0, 0, 'R', 0);
+ $pdf->MultiCell(LAMPDF_LABELWIDTH, LAMPDF_LINEHEIGHT, $valueEntry->getLabel() . ':', 0, 'R', false, 0, '', '', true, 0, false, true, 0, 'T');
$pdf->SetFont($fontName, '', LAMPDF_FONT_SIZE);
- $pdf->MultiCell(0, LAMPDF_LINEHEIGHT, $valueEntry->getValue(), 0, 'L', 0);
+ $pdf->MultiCell(0, LAMPDF_LINEHEIGHT, $valueEntry->getValue(), 0, 'L', false, 1, '', '', true, 0, false, true, 0, 'M');
$pdf->Ln(0);
}
/**
* Prints a PDFTable entry.
*
- * @param lamPDF $pdf PDF
+ * @param LAMTCPDF $pdf PDF
* @param PDFTable $table entry
* @param string $fontName font name
*/
@@ -268,7 +219,7 @@ function printTable(&$pdf, $table, $fontName) {
if ($cell->bold) {
$pdf->SetFont($fontName, 'B', LAMPDF_FONT_SIZE);
}
- $pdf->Cell($width, LAMPDF_LINEHEIGHT, $cell->content, 0, 0, $cell->align, 0);
+ $pdf->Cell($width, LAMPDF_LINEHEIGHT, $cell->content, 0, 0, $cell->align, 0, '', 1);
if ($cell->bold) {
$pdf->SetFont($fontName, '', LAMPDF_FONT_SIZE);
}
diff --git a/lam/lib/ufpdf.php b/lam/lib/ufpdf.php
deleted file mode 100644
index 598bf706..00000000
--- a/lam/lib/ufpdf.php
+++ /dev/null
@@ -1,819 +0,0 @@
- *
-* License: GPL *
-* *
-* UFPDF is a modification of FPDF to support Unicode through UTF-8. *
-* *
-* This file includes modifications from Andrea Rossato which fix line breaking *
-* in Write()/MultiCell(). *
-* *
-*******************************************************************************/
-
-if(!class_exists('UFPDF'))
-{
-define('UFPDF_VERSION','0.1');
-
-/**
- * Main UFPDF class for creating Unicode PDF documents
- *
- * @package PDF
- * @see FPDF
- */
-class UFPDF extends FPDF
-{
-
-/*******************************************************************************
-* *
-* Public methods *
-* *
-*******************************************************************************/
-function __construct($orientation='P',$unit='mm',$format='A4')
-{
- parent::__construct($orientation, $unit, $format);
-}
-
-function GetStringWidth($s)
-{
- //Get width of a string in the current font
- $s = (string)$s;
- $codepoints=$this->utf8_to_codepoints(trim($s));
- $cw=&$this->CurrentFont['cw'];
- $w=0;
- foreach($codepoints as $cp) {
- if (isset($cw[$cp])) {
- $w+=$cw[$cp];
- }
- else if (isset($cw[ord($cp)])) {
- $w+=$cw[ord($cp)];
- }
- else if (isset($cw[chr($cp)])) {
- $w+=$cw[chr($cp)];
- }
- //-- adjust width for incorrect hebrew chars
- if ($cp>1480 && $cp < 1550) $w -= $cw[$cp]/1.8;
- }
- return $w*$this->FontSize/1000;
-}
-
-function AddFont($family,$style='',$file='')
-{
- //Add a TrueType or Type1 font
- $family=strtolower($family);
- if($family=='arial')
- $family='helvetica';
- $style=strtoupper($style);
- if($style=='IB')
- $style='BI';
- if(isset($this->fonts[$family.$style]))
- $this->Error('Font already added: '.$family.' '.$style);
- if($file=='')
- $file=str_replace(' ','',$family).strtolower($style).'.php';
- if(defined('FPDF_FONTPATH'))
- $file=FPDF_FONTPATH.$file;
- include($file);
- if(!isset($name))
- $this->Error('Could not include font definition file');
- $i=count($this->fonts)+1;
- $this->fonts[$family.$style]=array('i'=>$i,'type'=>$type,'name'=>$name,'desc'=>$desc,'up'=>$up,'ut'=>$ut,'cw'=>$cw,'file'=>$file,'ctg'=>$ctg);
- if($file)
- {
- if($type=='TrueTypeUnicode')
- $this->FontFiles[$file]=array('length1'=>$originalsize);
- else
- $this->FontFiles[$file]=array('length1'=>$size1,'length2'=>$size2);
- }
-}
-
-function Text($x,$y,$txt)
-{
- //Output a string
- $s=sprintf('BT %.2f %.2f Td %s Tj ET',$x*$this->k,($this->h-$y)*$this->k,$this->_escapetext($txt));
- if($this->underline and $txt!='')
- $s.=' '.$this->_dounderlineU($x,$y,$this->GetStringWidth($txt),$txt);
- if($this->ColorFlag)
- $s='q '.$this->TextColor.' '.$s.' Q';
- $this->_out($s);
-}
-
-function AcceptPageBreak()
-{
- //Accept automatic page break or not
- return $this->AutoPageBreak;
-}
-
-function Cell($w,$h=0,$txt='',$border=0,$ln=0,$align='J',$fill=0,$link='')
-{
- //Output a cell
- $k=$this->k;
- if($this->y+$h>$this->PageBreakTrigger and !$this->InFooter and $this->AcceptPageBreak())
- {
- //Automatic page break
- $x=$this->x;
- $ws=$this->ws;
- if($ws>0)
- {
- $this->ws=0;
- $this->_out('0 Tw');
- }
- $this->AddPage($this->CurOrientation, $this->CurPageSize);
- $this->x=$x;
- if($ws>0)
- {
- $this->ws=$ws;
- $this->_out(sprintf('%.3f Tw',$ws*$k));
- }
- }
- if($w==0)
- $w=$this->w-$this->rMargin-$this->x;
- $s='';
- if($fill==1 or $border==1)
- {
- if($fill==1)
- $op=($border==1) ? 'B' : 'f';
- else
- $op='S';
- $s=sprintf('%.2f %.2f %.2f %.2f re %s ',$this->x*$k,($this->h-$this->y)*$k,$w*$k,-$h*$k,$op);
- }
- if(is_string($border))
- {
- $x=$this->x;
- $y=$this->y;
- if(is_int(strpos($border,'L')))
- $s.=sprintf('%.2f %.2f m %.2f %.2f l S ',$x*$k,($this->h-$y)*$k,$x*$k,($this->h-($y+$h))*$k);
- if(is_int(strpos($border,'T')))
- $s.=sprintf('%.2f %.2f m %.2f %.2f l S ',$x*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-$y)*$k);
- if(is_int(strpos($border,'R')))
- $s.=sprintf('%.2f %.2f m %.2f %.2f l S ',($x+$w)*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-($y+$h))*$k);
- if(is_int(strpos($border,'B')))
- $s.=sprintf('%.2f %.2f m %.2f %.2f l S ',$x*$k,($this->h-($y+$h))*$k,($x+$w)*$k,($this->h-($y+$h))*$k);
- }
- if($txt!='')
- {
- $width = $this->GetStringWidth($txt);
- if($align=='R')
- $dx=$w-$this->cMargin-$width;
- elseif($align=='C')
- $dx=($w-$width)/2;
- else
- $dx=$this->cMargin;
- if($this->ColorFlag)
- $s.='q '.$this->TextColor.' ';
- $txtstring=$this->_escapetext($txt);
- $s.=sprintf('BT %.2f %.2f Td %s Tj ET',($this->x+$dx)*$k,($this->h-($this->y+.5*$h+.3*$this->FontSize))*$k,$txtstring);
- if($this->underline)
- $s.=' '.$this->_dounderlineU($this->x+$dx,$this->y+.5*$h+.3*$this->FontSize,$width,$txt);
- if($this->ColorFlag)
- $s.=' Q';
- if($link)
- $this->Link($this->x+$dx,$this->y+.5*$h-.5*$this->FontSize,$width,$this->FontSize,$link);
- }
- if($s)
- $this->_out($s);
- $this->lasth=$h;
- if($ln>0)
- {
- //Go to next line
- $this->y+=$h;
- if($ln==1)
- $this->x=$this->lMargin;
- }
- else
- $this->x+=$w;
-}
-
-function MultiCell($w,$h,$txt,$border=0,$align='J',$fill=0)
-{
- //Output text with automatic or explicit line breaks
- $cw=&$this->CurrentFont['cw'];
- $cp=$this->utf8_to_codepoints(trim($txt));
- //print_r($cp);
- if($w==0)
- $w=$this->w-$this->rMargin-$this->x;
- $wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
- //echo $w;
- $s=str_replace("\r",'',$txt);
- $nb=$this->strlen($s);
- if($nb>0 and $s[$nb-1]=="\n")
- $nb--;
- $b=0;
- if($border)
- {
- if($border==1)
- {
- $border='LTRB';
- $b='LRT';
- $b2='LR';
- }
- else
- {
- $b2='';
- if(is_int(strpos($border,'L')))
- $b2.='L';
- if(is_int(strpos($border,'R')))
- $b2.='R';
- $b=is_int(strpos($border,'T')) ? $b2.'T' : $b2;
- }
- }
- $sep=-1;
- $i=0;
- $j=0;
- $l=0;
- $ns=0;
- $nl=1;
- $char = 0;
- while($i<$nb)
- {
- //Get next character
- $c = $this->code2utf($cp[$i]);
- if($c=="\n")
- {
- //Explicit line break
- if($this->ws>0)
- {
- $this->ws=0;
- $this->_out('0 Tw');
- }
- $this->Cell($w,$h,$this->utf8_substr($cp,$j,$i-$j,"UTF-8"),$b,2,$align,$fill);
- $i++;
- $sep=-1;
- $j=$i;
- $l=0;
- $ns=0;
- $nl++;
- if($border and $nl==2)
- $b=$b2;
- continue;
- }
- if($c==' ')
- {
- $sep=$i;
- $ls=$l;
- $ns++;
- }
- if (isset($cw[$cp[$i]])) {
- $l += $cw[$cp[$i]];
- }
-
- if($l>$wmax)
- {
- //Automatic line break
- if($sep==-1)
- {
- if($i==$j)
- $i++;
- if($this->ws>0)
- {
- $this->ws=0;
- $this->_out('0 Tw');
- }
- $this->Cell($w,$h,$this->utf8_substr($cp,$j,$i-$j,"UTF-8"),$b,2,$align,$fill);
- }
- else
- {
- if($align=='J')
- {
- $len_ligne = $this->GetStringWidth($this->utf8_substr($cp,$j,$sep-$j,"UTF-8"));
- $nb_carac = $this->strlen($this->utf8_substr($cp,$j,$sep-$j,"UTF-8"));
- $ecart = (($w-2) - $len_ligne) / $nb_carac;
- $this->_out(sprintf('BT %.3f Tc ET',$ecart*$this->k));
- //$this->ws=($ns>1) ? ($wmax-$ls)/1000*$this->FontSize/($ns-1) : 0;
- //$this->_out(sprintf('%.3f Tw',$this->ws*$this->k));
- //echo ($wmax-$ls)/1000*$this->FontSize/($ns-1)."=".($wmax-$ls)."
"; //$andrea = sprintf('%.3f Tw',$this->ws*$this->k);
- }
- $this->Cell($w,$h,$this->utf8_substr($cp,$j,$sep-$j,"UTF-8"),$b,2,$align,$fill);
- $i=$sep+1;
- }
- $sep=-1;
- $j=$i;
- $l=0;
- $ns=0;
- $nl++;
- if($border and $nl==2)
- $b=$b2;
- }
- else
- $i++;
- }
- //Last chunk
- if($this->ws>0)
- {
- $this->ws=0;
- $this->_out('0 Tw');
- }
- if($border and is_int(strpos($border,'B')))
- $b.='B';
- $this->Cell($w,$h,$this->utf8_substr($cp,$j,$i-$j,"UTF-8"),$b,2,$align,$fill);
- $this->x=$this->lMargin;
-}
-
-function Write($h,$txt,$link='')
-{
- //Output text in flowing mode
- $cw=&$this->CurrentFont['cw'];
- $cp=$this->utf8_to_codepoints(trim($txt));
- $w=$this->w-$this->rMargin-$this->x;
- $wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
- $s=str_replace("\r",'',$txt);
- $nb=$this->strlen($s);
- $sep=-1;
- $i=0;
- $j=0;
- $l=0;
- $nl=1;
- while($i<$nb)
- {
- //Get next character
- $c=$s{$i};
- $charw = $cw[$cp[$i]];
- if($c=="\n")
- {
- //Explicit line break
- $this->Cell($w,$h,$this->utf8_substr($cp,$j,$i-$j,"UTF-8"),0,2,'',0,$link);
- $i++;
- $sep=-1;
- $j=$i;
- $l=0;
- if($nl==1)
- {
- $this->x=$this->lMargin;
- $w=$this->w-$this->rMargin-$this->x;
- $wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
- }
- $nl++;
- continue;
- }
- if($c==' ')
- $sep=$i;
- $l+=$charw;
- if($l>$wmax)
- {
- //Automatic line break
- if($sep==-1)
- {
- if($this->x>$this->lMargin)
- {
- //Move to next line
- $this->x=$this->lMargin;
- $this->y+=$h;
- $w=$this->w-$this->rMargin-$this->x;
- $wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
- $i++;
- $nl++;
- continue;
- }
- if($i==$j)
- $i++;
- $this->Cell($w,$h,$this->utf8_substr($cp,$j,$i-$j,"UTF-8"),0,2,'',0,$link);
- }
- else
- {
- $this->Cell($w,$h,$this->utf8_substr($cp,$j,$sep-$j,"UTF-8"),0,2,'',0,$link);
- $i=$sep+1;
- }
- $sep=-1;
- $j=$i;
- $l=0;
- if($nl==1)
- {
- $this->x=$this->lMargin;
- $w=$this->w-$this->rMargin-$this->x;
- $wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
- }
- $nl++;
- }
- else
- $i++;
- }
- //Last chunk
- if($i!=$j)
- $this->Cell($l/1000*$this->FontSize,$h,$this->utf8_substr($cp,$j),0,0,'',0,$link);
-}
-
-function AliasNbPages($alias='{nb}')
-{
- //Define an alias for total number of pages
- $this->AliasNbPages=$this->utf8_to_utf16be($alias,false);
-}
-
-/*******************************************************************************
-* *
-* Protected methods *
-* *
-*******************************************************************************/
-
-function _puttruetypeunicode($font) {
- //Type0 Font
- $this->_newobj();
- $this->_out('<_out('/Subtype /Type0');
- $this->_out('/BaseFont /'. $font['name'] );
- $this->_out('/Encoding /Identity-H');
- $this->_out('/DescendantFonts ['. ($this->n + 1) .' 0 R]');
- $this->_out('>>');
- $this->_out('endobj');
-
- //CIDFont
- $this->_newobj();
- $this->_out('<_out('/Subtype /CIDFontType2');
- $this->_out('/BaseFont /'. $font['name']);
- $this->_out('/CIDSystemInfo <>');
- $this->_out('/FontDescriptor '. ($this->n + 1) .' 0 R');
- $c = 0;
- $widths = "";
- foreach ($font['cw'] as $i => $w) {
- $widths .= $i .' ['. $w.'] ';
- }
- $this->_out('/W ['. $widths .']');
- $this->_out('/CIDToGIDMap '. ($this->n + 2) .' 0 R');
- $this->_out('>>');
- $this->_out('endobj');
-
- //Font descriptor
- $this->_newobj();
- $this->_out('<_out('/FontName /'.$font['name']);
- $s = "";
- foreach ($font['desc'] as $k => $v) {
- $s .= ' /'. $k .' '. $v;
- }
- if ($font['file']) {
- $s .= ' /FontFile2 '. $this->FontFiles[$font['file']]['n'] .' 0 R';
- }
- $this->_out($s);
- $this->_out('>>');
- $this->_out('endobj');
-
- //Embed CIDToGIDMap
- $this->_newobj();
- if(defined('FPDF_FONTPATH'))
- $file=FPDF_FONTPATH.$font['ctg'];
- else
- $file=$font['ctg'];
- $size=filesize($file);
- if(!$size)
- $this->Error('Font file not found');
- $this->_out('<_out('/Filter /FlateDecode');
- $this->_out('>>');
- $f = fopen($file,'rb');
- $this->_putstream(fread($f,$size));
- fclose($f);
- $this->_out('endobj');
-}
-
-function _dounderlineU($x,$y,$width,$txt)
-{
- //Underline text
- $up=$this->CurrentFont['up'];
- $ut=$this->CurrentFont['ut'];
- $w=$width+$this->ws*substr_count($txt,' ');
- return sprintf('%.2f %.2f %.2f %.2f re f',$x*$this->k,($this->h-($y-$up/1000*$this->FontSize))*$this->k,$w*$this->k,-$ut/1000*$this->FontSizePt);
-}
-
-function _textstring($s)
-{
- //Convert to UTF-16BE
- $s = $this->utf8_to_utf16be($s);
- //Escape necessary characters
- return '('. strtr($s, array(')' => '\\)', '(' => '\\(', '\\' => '\\\\')) .')';
-}
-
-function _escapetext($s)
-{
- //Convert to UTF-16BE
- $s = $this->utf8_to_utf16be($s, false);
- //Escape necessary characters
- return '('. strtr($s, array(')' => '\\)', '(' => '\\(', '\\' => '\\\\')) .')';
-}
-
-function _putinfo()
-{
- $this->_out('/Producer '.$this->_textstring('UFPDF '. UFPDF_VERSION));
- if(!empty($this->title))
- $this->_out('/Title '.$this->_textstring($this->title));
- if(!empty($this->subject))
- $this->_out('/Subject '.$this->_textstring($this->subject));
- if(!empty($this->author))
- $this->_out('/Author '.$this->_textstring($this->author));
- if(!empty($this->keywords))
- $this->_out('/Keywords '.$this->_textstring($this->keywords));
- if(!empty($this->creator))
- $this->_out('/Creator '.$this->_textstring($this->creator));
- $this->_out('/CreationDate '.$this->_textstring('D:'.date('YmdHis')));
-}
-
-function _putpages()
-{
- $nb=$this->page;
- if(!empty($this->AliasNbPages))
- {
- $nbstr = $this->utf8_to_utf16be($nb,false);
- //Replace number of pages
- for($n=1;$n<=$nb;$n++) {
- $this->pages[$n]=str_replace($this->AliasNbPages,$nbstr,$this->pages[$n]);
- }
- }
- if($this->DefOrientation=='P')
- {
- $wPt=$this->DefPageSize[0]*$this->k;
- $hPt=$this->DefPageSize[1]*$this->k;
- }
- else
- {
- $wPt=$this->DefPageSize[1]*$this->k;
- $hPt=$this->DefPageSize[0]*$this->k;
- }
- $filter=($this->compress) ? '/Filter /FlateDecode ' : '';
- for($n=1;$n<=$nb;$n++)
- {
- //Page
- $this->_newobj();
- $this->_out('<_out('/Parent 1 0 R');
- if(isset($this->PageSizes[$n]))
- $this->_out(sprintf('/MediaBox [0 0 %.2F %.2F]',$this->PageSizes[$n][0],$this->PageSizes[$n][1]));
- $this->_out('/Resources 2 0 R');
- if(isset($this->PageLinks[$n]))
- {
- //Links
- $annots='/Annots [';
- foreach($this->PageLinks[$n] as $pl)
- {
- $rect=sprintf('%.2f %.2f %.2f %.2f',$pl[0],$pl[1],$pl[0]+$pl[2],$pl[1]-$pl[3]);
- $annots.='<_textstring($pl[4]).'>>>>';
- else
- {
- $l=$this->links[$pl[4]];
- $h=isset($this->PageSizes[$l[0]]) ? $this->PageSizes[$l[0]][1] : $hPt;
- $annots.=sprintf('/Dest [%d 0 R /XYZ 0 %.2F null]>>',1+2*$l[0],$h-$l[1]*$this->k);
- }
- }
- $this->_out($annots.']');
- }
- $this->_out('/Contents '.($this->n+1).' 0 R>>');
- $this->_out('endobj');
- //Page content
- $p=($this->compress) ? gzcompress($this->pages[$n]) : $this->pages[$n];
- $this->_newobj();
- $this->_out('<<'.$filter.'/Length '.strlen($p).'>>');
- $this->_putstream($p);
- $this->_out('endobj');
- }
- //Pages root
- $this->offsets[1]=strlen($this->buffer);
- $this->_out('1 0 obj');
- $this->_out('<_out($kids.']');
- $this->_out('/Count '.$nb);
- $this->_out(sprintf('/MediaBox [0 0 %.2f %.2f]',$wPt,$hPt));
- $this->_out('>>');
- $this->_out('endobj');
-}
-
-// UTF-8 to UTF-16BE conversion.
-// Correctly handles all illegal UTF-8 sequences.
-function utf8_to_utf16be(&$txt, $bom = true) {
- $l = strlen($txt);
- $txt .= " ";
- $out = $bom ? "\xFE\xFF" : '';
- for ($i = 0; $i < $l; ++$i) {
- $c = ord($txt{$i});
- // ASCII
- if ($c < 0x80) {
- $out .= "\x00". $txt{$i};
- }
- // Lost continuation byte
- else if ($c < 0xC0) {
- $out .= "\xFF\xFD";
- continue;
- }
- // Multibyte sequence leading byte
- else {
- if ($c < 0xE0) {
- $s = 2;
- }
- else if ($c < 0xF0) {
- $s = 3;
- }
- else if ($c < 0xF8) {
- $s = 4;
- }
- // 5/6 byte sequences not possible for Unicode.
- else {
- $out .= "\xFF\xFD";
- while (ord($txt{$i + 1}) >= 0x80 && ord($txt{$i + 1}) < 0xC0) { ++$i; }
- continue;
- }
-
- $q = array($c);
- // Fetch rest of sequence
- while (ord($txt{$i + 1}) >= 0x80 && ord($txt{$i + 1}) < 0xC0) { ++$i; $q[] = ord($txt{$i}); }
-
- // Check length
- if (count($q) != $s) {
- $out .= "\xFF\xFD";
- continue;
- }
-
- switch ($s) {
- case 2:
- $cp = (($q[0] ^ 0xC0) << 6) | ($q[1] ^ 0x80);
- // Overlong sequence
- if ($cp < 0x80) {
- $out .= "\xFF\xFD";
- }
- else {
- $out .= chr($cp >> 8);
- $out .= chr($cp & 0xFF);
- }
- continue;
-
- case 3:
- $cp = (($q[0] ^ 0xE0) << 12) | (($q[1] ^ 0x80) << 6) | ($q[2] ^ 0x80);
- // Overlong sequence
- if ($cp < 0x800) {
- $out .= "\xFF\xFD";
- }
- // Check for UTF-8 encoded surrogates (caused by a bad UTF-8 encoder)
- else if ($c > 0xD800 && $c < 0xDFFF) {
- $out .= "\xFF\xFD";
- }
- else {
- $out .= chr($cp >> 8);
- $out .= chr($cp & 0xFF);
- }
- continue;
-
- case 4:
- $cp = (($q[0] ^ 0xF0) << 18) | (($q[1] ^ 0x80) << 12) | (($q[2] ^ 0x80) << 6) | ($q[3] ^ 0x80);
- // Overlong sequence
- if ($cp < 0x10000) {
- $out .= "\xFF\xFD";
- }
- // Outside of the Unicode range
- else if ($cp >= 0x10FFFF) {
- $out .= "\xFF\xFD";
- }
- else {
- // Use surrogates
- $cp -= 0x10000;
- $s1 = 0xD800 | ($cp >> 10);
- $s2 = 0xDC00 | ($cp & 0x3FF);
-
- $out .= chr($s1 >> 8);
- $out .= chr($s1 & 0xFF);
- $out .= chr($s2 >> 8);
- $out .= chr($s2 & 0xFF);
- }
- continue;
- }
- }
- }
- return $out;
-}
-
-function code2utf($num){
- if($num<128)return chr($num);
- if($num<2048)return chr(($num>>6)+192).chr(($num&63)+128);
- if($num<65536)return chr(($num>>12)+224).chr((($num>>6)&63)+128).chr(($num&63)+128);
- if($num<2097152)return chr(($num>>18)+240).chr((($num>>12)&63)+128).chr((($num>>6)&63)+128). chr(($num&63)+128);
- return '';
-}
-
-function strlen($s) {
- return strlen(utf8_decode($s));
-}
-
-function utf8_substr($str,$start)
-{
- $rs = '';
- if( func_num_args() >= 3 ) {
- $end = func_get_arg( 2 );
- for ($i=$start; $i < ($start+$end); $i++)
- $rs .= $this->code2utf($str[$i]);
-
- } else {
- for ($i=$start; $i < count($str); $i++)
- $rs .= $this->code2utf($str[$i]);
- }
-
- return $rs;
-}
-
-// UTF-8 to codepoint array conversion.
-// Correctly handles all illegal UTF-8 sequences.
-function utf8_to_codepoints($txt) {
- $l = strlen($txt);
- $txt .= " ";
- $out = array();
- for ($i = 0; $i < $l; ++$i) {
- $c = ord($txt{$i});
- // ASCII
- if ($c < 0x80) {
- $out[] = ord($txt{$i});
- }
- // Lost continuation byte
- else if ($c < 0xC0) {
- $out[] = 0xFFFD;
- continue;
- }
- // Multibyte sequence leading byte
- else {
- if ($c < 0xE0) {
- $s = 2;
- }
- else if ($c < 0xF0) {
- $s = 3;
- }
- else if ($c < 0xF8) {
- $s = 4;
- }
- // 5/6 byte sequences not possible for Unicode.
- else {
- $out[] = 0xFFFD;
- while (ord($txt{$i + 1}) >= 0x80 && ord($txt{$i + 1}) < 0xC0) { ++$i; }
- continue;
- }
-
- $q = array($c);
- // Fetch rest of sequence
- while (ord($txt{$i + 1}) >= 0x80 && ord($txt{$i + 1}) < 0xC0) { ++$i; $q[] = ord($txt{$i}); }
-
- // Check length
- if (count($q) != $s) {
- $out[] = 0xFFFD;
- continue;
- }
-
- switch ($s) {
- case 2:
- $cp = (($q[0] ^ 0xC0) << 6) | ($q[1] ^ 0x80);
- // Overlong sequence
- if ($cp < 0x80) {
- $out[] = 0xFFFD;
- }
- else {
- $out[] = $cp;
- }
- continue;
-
- case 3:
- $cp = (($q[0] ^ 0xE0) << 12) | (($q[1] ^ 0x80) << 6) | ($q[2] ^ 0x80);
- // Overlong sequence
- if ($cp < 0x800) {
- $out[] = 0xFFFD;
- }
- // Check for UTF-8 encoded surrogates (caused by a bad UTF-8 encoder)
- else if ($c > 0xD800 && $c < 0xDFFF) {
- $out[] = 0xFFFD;
- }
- else {
- $out[] = $cp;
- }
- continue;
-
- case 4:
- $cp = (($q[0] ^ 0xF0) << 18) | (($q[1] ^ 0x80) << 12) | (($q[2] ^ 0x80) << 6) | ($q[3] ^ 0x80);
- // Overlong sequence
- if ($cp < 0x10000) {
- $out[] = 0xFFFD;
- }
- // Outside of the Unicode range
- else if ($cp >= 0x10FFFF) {
- $out[] = 0xFFFD;
- }
- else {
- $out[] = $cp;
- }
- continue;
- }
- }
- }
- return $out;
-}
-
-//End of class
-}
-
-}
-?>