[Svn-src-all:829] [version-2_5-dev 19716] #403(インクルードしているライブラリ群をバージョンアップする)

Seasoft admin @ mail.ec-cube.net
2010年 12月 11日 (土) 12:15:21 JST


Subversion committed to /home/svn/open 19716
http://svn.ec-cube.net/open_trac/changeset/19716
$B(#(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!($(B
$B("99?7<T!!(B:  Seasoft                                      $B("(B
$B("99?7F|;~(B:  2010-12-11 12:15:20 +0900 ($BEZ(B, 11 12$B7n(B 2010)$B("(B
$B(&(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(!(%(B

Log:
--------------------------------------------------------
#403($B%$%s%/%k!<%I$7$F$$$k%i%$%V%i%j72$r%P!<%8%g%s%"%C%W$9$k(B)
  * FPDF$B4XO"(B (PHP4$B$K$D$$$F!"F0:n4D6-L5$/L$3NG'(B)

Changed:                      [U:$B=$@5!$(BA:$BDI2C!$(BD:$B:o=|(B]
--------------------------------------------------------
U   branches/version-2_5-dev/data/class/SC_Fpdf.php
A   branches/version-2_5-dev/data/module/fpdf/
A   branches/version-2_5-dev/data/module/fpdf/filters/
A   branches/version-2_5-dev/data/module/fpdf/filters/FilterASCII85.php
A   branches/version-2_5-dev/data/module/fpdf/filters/FilterASCII85_FPDI.php
A   branches/version-2_5-dev/data/module/fpdf/filters/FilterLZW.php
A   branches/version-2_5-dev/data/module/fpdf/filters/FilterLZW_FPDI.php
A   branches/version-2_5-dev/data/module/fpdf/font/
A   branches/version-2_5-dev/data/module/fpdf/fpdf.php
A   branches/version-2_5-dev/data/module/fpdf/fpdf_tpl.php
A   branches/version-2_5-dev/data/module/fpdf/fpdi.php
A   branches/version-2_5-dev/data/module/fpdf/fpdi2tcpdf_bridge.php
A   branches/version-2_5-dev/data/module/fpdf/fpdi_pdf_parser.php
A   branches/version-2_5-dev/data/module/fpdf/japanese.php
A   branches/version-2_5-dev/data/module/fpdf/pdf_context.php
A   branches/version-2_5-dev/data/module/fpdf/pdf_parser.php
D   branches/version-2_5-dev/data/pdf/decoders/
D   branches/version-2_5-dev/data/pdf/font/
D   branches/version-2_5-dev/data/pdf/fpdf.php
D   branches/version-2_5-dev/data/pdf/fpdf_tpl.php
D   branches/version-2_5-dev/data/pdf/fpdi.php
D   branches/version-2_5-dev/data/pdf/fpdi_pdf_parser.php
D   branches/version-2_5-dev/data/pdf/japanese.php
D   branches/version-2_5-dev/data/pdf/pdf_context.php
D   branches/version-2_5-dev/data/pdf/pdf_parser.php
D   branches/version-2_5-dev/data/pdf/wrapper_functions.php

$BJQ99(B: branches/version-2_5-dev/data/class/SC_Fpdf.php
===================================================================
--- branches/version-2_5-dev/data/class/SC_Fpdf.php	2010-12-10 13:27:59 UTC (rev 19715)
+++ branches/version-2_5-dev/data/class/SC_Fpdf.php	2010-12-11 03:15:20 UTC (rev 19716)
@@ -27,7 +27,8 @@
  *----------------------------------------------------------------------
  */
 
-require(DATA_PATH . 'pdf/japanese.php');
+require(DATA_PATH . 'module/fpdf/fpdf.php');
+require(DATA_PATH . 'module/fpdf/japanese.php');
 define('PDF_TEMPLATE_DIR', DATA_PATH . 'pdf/');
 
 class SC_Fpdf {

$BDI2C(B: branches/version-2_5-dev/data/module/fpdf/filters/FilterASCII85.php
===================================================================
--- branches/version-2_5-dev/data/module/fpdf/filters/FilterASCII85.php	                        (rev 0)
+++ branches/version-2_5-dev/data/module/fpdf/filters/FilterASCII85.php	2010-12-11 03:15:20 UTC (rev 19716)
@@ -0,0 +1,101 @@
+<?php
+//
+//  FPDI - Version 1.4
+//
+//    Copyright 2004-2010 Setasign - Jan Slabon
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+if (!defined('ORD_z'))
+	define('ORD_z',ord('z'));
+if (!defined('ORD_exclmark'))
+	define('ORD_exclmark', ord('!'));
+if (!defined('ORD_u'))	
+	define('ORD_u', ord('u'));
+if (!defined('ORD_tilde'))
+	define('ORD_tilde', ord('~'));
+
+if (!class_exists('FilterASCII85', false)) {
+
+    class FilterASCII85 {
+        
+        function error($msg) {
+            die($msg);
+        }
+        
+        function decode($in) {
+            $out = '';
+            $state = 0;
+            $chn = null;
+            
+            $l = strlen($in);
+            
+            for ($k = 0; $k < $l; ++$k) {
+                $ch = ord($in[$k]) & 0xff;
+                
+                if ($ch == ORD_tilde) {
+                    break;
+                }
+                if (preg_match('/^\s$/',chr($ch))) {
+                    continue;
+                }
+                if ($ch == ORD_z && $state == 0) {
+                    $out .= chr(0).chr(0).chr(0).chr(0);
+                    continue;
+                }
+                if ($ch < ORD_exclmark || $ch > ORD_u) {
+                    return $this->error('Illegal character in ASCII85Decode.');
+                }
+                
+                $chn[$state++] = $ch - ORD_exclmark;
+                
+                if ($state == 5) {
+                    $state = 0;
+                    $r = 0;
+                    for ($j = 0; $j < 5; ++$j)
+                        $r = $r * 85 + $chn[$j];
+                    $out .= chr($r >> 24);
+                    $out .= chr($r >> 16);
+                    $out .= chr($r >> 8);
+                    $out .= chr($r);
+                }
+            }
+            $r = 0;
+            
+            if ($state == 1)
+                return $this->error('Illegal length in ASCII85Decode.');
+            if ($state == 2) {
+                $r = $chn[0] * 85 * 85 * 85 * 85 + ($chn[1]+1) * 85 * 85 * 85;
+                $out .= chr($r >> 24);
+            }
+            else if ($state == 3) {
+                $r = $chn[0] * 85 * 85 * 85 * 85 + $chn[1] * 85 * 85 * 85  + ($chn[2]+1) * 85 * 85;
+                $out .= chr($r >> 24);
+                $out .= chr($r >> 16);
+            }
+            else if ($state == 4) {
+                $r = $chn[0] * 85 * 85 * 85 * 85 + $chn[1] * 85 * 85 * 85  + $chn[2] * 85 * 85  + ($chn[3]+1) * 85 ;
+                $out .= chr($r >> 24);
+                $out .= chr($r >> 16);
+                $out .= chr($r >> 8);
+            }
+    
+            return $out;
+        }
+        
+        function encode($in) {
+            return $this->error("ASCII85 encoding not implemented.");
+        }
+    }
+}

$BDI2C(B: branches/version-2_5-dev/data/module/fpdf/filters/FilterASCII85_FPDI.php
===================================================================
--- branches/version-2_5-dev/data/module/fpdf/filters/FilterASCII85_FPDI.php	                        (rev 0)
+++ branches/version-2_5-dev/data/module/fpdf/filters/FilterASCII85_FPDI.php	2010-12-11 03:15:20 UTC (rev 19716)
@@ -0,0 +1,33 @@
+<?php
+//
+//  FPDI - Version 1.4
+//
+//    Copyright 2004-2010 Setasign - Jan Slabon
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+require_once('FilterASCII85.php');
+
+class FilterASCII85_FPDI extends FilterASCII85 {
+
+    var $fpdi;
+    
+    function FilterASCII85_FPDI(&$fpdi) {
+        $this->fpdi =& $fpdi;
+    }
+
+    function error($msg) {
+        $this->fpdi->error($msg);
+    }
+}
\ No newline at end of file

$BDI2C(B: branches/version-2_5-dev/data/module/fpdf/filters/FilterLZW.php
===================================================================
--- branches/version-2_5-dev/data/module/fpdf/filters/FilterLZW.php	                        (rev 0)
+++ branches/version-2_5-dev/data/module/fpdf/filters/FilterLZW.php	2010-12-11 03:15:20 UTC (rev 19716)
@@ -0,0 +1,157 @@
+<?php
+//
+//  FPDI - Version 1.4
+//
+//    Copyright 2004-2010 Setasign - Jan Slabon
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+if (!class_exists('FilterLZW', false)) {
+
+    class FilterLZW {
+        
+        var $sTable = array();
+        var $data = null;
+        var $dataLength = 0;
+        var $tIdx;
+        var $bitsToGet = 9;
+        var $bytePointer;
+        var $bitPointer;
+        var $nextData = 0;
+        var $nextBits = 0;
+        var $andTable = array(511, 1023, 2047, 4095);
+    
+        function error($msg) {
+            die($msg);
+        }
+        
+        /**
+         * Method to decode LZW compressed data.
+         *
+         * @param string data    The compressed data.
+         */
+        function decode($data) {
+    
+            if($data[0] == 0x00 && $data[1] == 0x01) {
+                $this->error('LZW flavour not supported.');
+            }
+    
+            $this->initsTable();
+    
+            $this->data = $data;
+            $this->dataLength = strlen($data);
+    
+            // Initialize pointers
+            $this->bytePointer = 0;
+            $this->bitPointer = 0;
+    
+            $this->nextData = 0;
+            $this->nextBits = 0;
+    
+            $oldCode = 0;
+    
+            $string = '';
+            $uncompData = '';
+    
+            while (($code = $this->getNextCode()) != 257) {
+                if ($code == 256) {
+                    $this->initsTable();
+                    $code = $this->getNextCode();
+    
+                    if ($code == 257) {
+                        break;
+                    }
+    
+                    $uncompData .= $this->sTable[$code];
+                    $oldCode = $code;
+    
+                } else {
+    
+                    if ($code < $this->tIdx) {
+                        $string = $this->sTable[$code];
+                        $uncompData .= $string;
+    
+                        $this->addStringToTable($this->sTable[$oldCode], $string[0]);
+                        $oldCode = $code;
+                    } else {
+                        $string = $this->sTable[$oldCode];
+                        $string = $string.$string[0];
+                        $uncompData .= $string;
+    
+                        $this->addStringToTable($string);
+                        $oldCode = $code;
+                    }
+                }
+            }
+            
+            return $uncompData;
+        }
+    
+    
+        /**
+         * Initialize the string table.
+         */
+        function initsTable() {
+            $this->sTable = array();
+    
+            for ($i = 0; $i < 256; $i++)
+                $this->sTable[$i] = chr($i);
+    
+            $this->tIdx = 258;
+            $this->bitsToGet = 9;
+        }
+    
+        /**
+         * Add a new string to the string table.
+         */
+        function addStringToTable ($oldString, $newString='') {
+            $string = $oldString.$newString;
+    
+            // Add this new String to the table
+            $this->sTable[$this->tIdx++] = $string;
+    
+            if ($this->tIdx == 511) {
+                $this->bitsToGet = 10;
+            } else if ($this->tIdx == 1023) {
+                $this->bitsToGet = 11;
+            } else if ($this->tIdx == 2047) {
+                $this->bitsToGet = 12;
+            }
+        }
+    
+        // Returns the next 9, 10, 11 or 12 bits
+        function getNextCode() {
+            if ($this->bytePointer == $this->dataLength) {
+                return 257;
+            }
+    
+            $this->nextData = ($this->nextData << 8) | (ord($this->data[$this->bytePointer++]) & 0xff);
+            $this->nextBits += 8;
+    
+            if ($this->nextBits < $this->bitsToGet) {
+                $this->nextData = ($this->nextData << 8) | (ord($this->data[$this->bytePointer++]) & 0xff);
+                $this->nextBits += 8;
+            }
+    
+            $code = ($this->nextData >> ($this->nextBits - $this->bitsToGet)) & $this->andTable[$this->bitsToGet-9];
+            $this->nextBits -= $this->bitsToGet;
+    
+            return $code;
+        }
+        
+        function encode($in) {
+            $this->error("LZW encoding not implemented.");
+        }
+    }
+}

$BDI2C(B: branches/version-2_5-dev/data/module/fpdf/filters/FilterLZW_FPDI.php
===================================================================
--- branches/version-2_5-dev/data/module/fpdf/filters/FilterLZW_FPDI.php	                        (rev 0)
+++ branches/version-2_5-dev/data/module/fpdf/filters/FilterLZW_FPDI.php	2010-12-11 03:15:20 UTC (rev 19716)
@@ -0,0 +1,33 @@
+<?php
+//
+//  FPDI - Version 1.4
+//
+//    Copyright 2004-2010 Setasign - Jan Slabon
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+require_once('FilterLZW.php');
+
+class FilterLZW_FPDI extends FilterLZW {
+
+    var $fpdi;
+
+    function FilterLZW_FPDI(&$fpdi) {
+        $this->fpdi =& $fpdi;
+    }
+    
+    function error($msg) {
+        $this->fpdi->error($msg);
+    }
+}
\ No newline at end of file

$B%3%T!<$K$h$kDI2C(B: branches/version-2_5-dev/data/module/fpdf/fpdf.php ($B%3%T!<85(B: $B%j%S%8%g%s(B 19715, branches/version-2_5-dev/data/pdf/fpdf.php)
===================================================================
--- branches/version-2_5-dev/data/module/fpdf/fpdf.php	                        (rev 0)
+++ branches/version-2_5-dev/data/module/fpdf/fpdf.php	2010-12-11 03:15:20 UTC (rev 19716)
@@ -0,0 +1,1732 @@
+<?php
+/*******************************************************************************
+* FPDF                                                                         *
+*                                                                              *
+* Version: 1.6                                                                 *
+* Date:    2008-08-03                                                          *
+* Author:  Olivier PLATHEY                                                     *
+*******************************************************************************/
+
+define('FPDF_VERSION','1.6');
+
+class FPDF
+{
+var $page;               //current page number
+var $n;                  //current object number
+var $offsets;            //array of object offsets
+var $buffer;             //buffer holding in-memory PDF
+var $pages;              //array containing pages
+var $state;              //current document state
+var $compress;           //compression flag
+var $k;                  //scale factor (number of points in user unit)
+var $DefOrientation;     //default orientation
+var $CurOrientation;     //current orientation
+var $PageFormats;        //available page formats
+var $DefPageFormat;      //default page format
+var $CurPageFormat;      //current page format
+var $PageSizes;          //array storing non-default page sizes
+var $wPt,$hPt;           //dimensions of current page in points
+var $w,$h;               //dimensions of current page in user unit
+var $lMargin;            //left margin
+var $tMargin;            //top margin
+var $rMargin;            //right margin
+var $bMargin;            //page break margin
+var $cMargin;            //cell margin
+var $x,$y;               //current position in user unit
+var $lasth;              //height of last printed cell
+var $LineWidth;          //line width in user unit
+var $CoreFonts;          //array of standard font names
+var $fonts;              //array of used fonts
+var $FontFiles;          //array of font files
+var $diffs;              //array of encoding differences
+var $FontFamily;         //current font family
+var $FontStyle;          //current font style
+var $underline;          //underlining flag
+var $CurrentFont;        //current font info
+var $FontSizePt;         //current font size in points
+var $FontSize;           //current font size in user unit
+var $DrawColor;          //commands for drawing color
+var $FillColor;          //commands for filling color
+var $TextColor;          //commands for text color
+var $ColorFlag;          //indicates whether fill and text colors are different
+var $ws;                 //word spacing
+var $images;             //array of used images
+var $PageLinks;          //array of links in pages
+var $links;              //array of internal links
+var $AutoPageBreak;      //automatic page breaking
+var $PageBreakTrigger;   //threshold used to trigger page breaks
+var $InHeader;           //flag set when processing header
+var $InFooter;           //flag set when processing footer
+var $ZoomMode;           //zoom display mode
+var $LayoutMode;         //layout display mode
+var $title;              //title
+var $subject;            //subject
+var $author;             //author
+var $keywords;           //keywords
+var $creator;            //creator
+var $AliasNbPages;       //alias for total number of pages
+var $PDFVersion;         //PDF version number
+
+/*******************************************************************************
+*                                                                              *
+*                               Public methods                                 *
+*                                                                              *
+*******************************************************************************/
+function FPDF($orientation='P', $unit='mm', $format='A4')
+{
+	//Some checks
+	$this->_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;
+	//Standard fonts
+	$this->CoreFonts=array('courier'=>'Courier', 'courierB'=>'Courier-Bold', 'courierI'=>'Courier-Oblique', 'courierBI'=>'Courier-BoldOblique',
+		'helvetica'=>'Helvetica', 'helveticaB'=>'Helvetica-Bold', 'helveticaI'=>'Helvetica-Oblique', 'helveticaBI'=>'Helvetica-BoldOblique',
+		'times'=>'Times-Roman', 'timesB'=>'Times-Bold', 'timesI'=>'Times-Italic', 'timesBI'=>'Times-BoldItalic',
+		'symbol'=>'Symbol', 'zapfdingbats'=>'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 format
+	$this->PageFormats=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));
+	if(is_string($format))
+		$format=$this->_getpageformat($format);
+	$this->DefPageFormat=$format;
+	$this->CurPageFormat=$format;
+	//Page orientation
+	$orientation=strtolower($orientation);
+	if($orientation=='p' || $orientation=='portrait')
+	{
+		$this->DefOrientation='P';
+		$this->w=$this->DefPageFormat[0];
+		$this->h=$this->DefPageFormat[1];
+	}
+	elseif($orientation=='l' || $orientation=='landscape')
+	{
+		$this->DefOrientation='L';
+		$this->w=$this->DefPageFormat[1];
+		$this->h=$this->DefPageFormat[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);
+	//Full width display mode
+	$this->SetDisplayMode('fullwidth');
+	//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='continuous')
+{
+	//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('<b>FPDF error:</b> '.$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='', $format='')
+{
+	//Start a new page
+	if($this->state==0)
+		$this->Open();
+	$family=$this->FontFamily;
+	$style=$this->FontStyle.($this->underline ? 'U' : '');
+	$size=$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,$format);
+	//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,$size);
+	//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,$size);
+	//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 or Type1 font
+	$family=strtolower($family);
+	if($file=='')
+		$file=str_replace(' ','',$family).strtolower($style).'.php';
+	if($family=='arial')
+		$family='helvetica';
+	$style=strtoupper($style);
+	if($style=='IB')
+		$style='BI';
+	$fontkey=$family.$style;
+	if(isset($this->fonts[$fontkey]))
+		return;
+	include($this->_getfontpath().$file);
+	if(!isset($name))
+		$this->Error('Could not include font definition file');
+	$i=count($this->fonts)+1;
+	$this->fonts[$fontkey]=array('i'=>$i, 'type'=>$type, 'name'=>$name, 'desc'=>$desc, 'up'=>$up, 'ut'=>$ut, 'cw'=>$cw, 'enc'=>$enc, 'file'=>$file);
+	if($diff)
+	{
+		//Search existing encodings
+		$d=0;
+		$nb=count($this->diffs);
+		for($i=1;$i<=$nb;$i++)
+		{
+			if($this->diffs[$i]==$diff)
+			{
+				$d=$i;
+				break;
+			}
+		}
+		if($d==0)
+		{
+			$d=$nb+1;
+			$this->diffs[$d]=$diff;
+		}
+		$this->fonts[$fontkey]['diff']=$d;
+	}
+	if($file)
+	{
+		if($type=='TrueType')
+			$this->FontFiles[$file]=array('length1'=>$originalsize);
+		else
+			$this->FontFiles[$file]=array('length1'=>$size1, 'length2'=>$size2);
+	}
+}
+
+function SetFont($family, $style='', $size=0)
+{
+	//Select a font; size given in points
+	global $fpdf_charwidths;
+
+	$family=strtolower($family);
+	if($family=='')
+		$family=$this->FontFamily;
+	if($family=='arial')
+		$family='helvetica';
+	elseif($family=='symbol' || $family=='zapfdingbats')
+		$style='';
+	$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 used for the first time
+	$fontkey=$family.$style;
+	if(!isset($this->fonts[$fontkey]))
+	{
+		//Check if one of the standard fonts
+		if(isset($this->CoreFonts[$fontkey]))
+		{
+			if(!isset($fpdf_charwidths[$fontkey]))
+			{
+				//Load metric file
+				$file=$family;
+				if($family=='times' || $family=='helvetica')
+					$file.=strtolower($style);
+				include($this->_getfontpath().$file.'.php');
+				if(!isset($fpdf_charwidths[$fontkey]))
+					$this->Error('Could not include font metric file');
+			}
+			$i=count($this->fonts)+1;
+			$name=$this->CoreFonts[$fontkey];
+			$cw=$fpdf_charwidths[$fontkey];
+			$this->fonts[$fontkey]=array('i'=>$i, 'type'=>'core', 'name'=>$name, 'up'=>-100, 'ut'=>50, 'cw'=>$cw);
+		}
+		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->CurPageFormat);
+		$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 72 dpi
+		$w=$info['w']/$this->k;
+		$h=$info['h']/$this->k;
+	}
+	elseif($w==0)
+		$w=$h*$info['w']/$info['h'];
+	elseif($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->CurPageFormat);
+			$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
+			if(ob_get_length())
+				$this->Error('Some data has already been output, can\'t send PDF file');
+			if(php_sapi_name()!='cli')
+			{
+				//We send to a browser
+				header('Content-Type: application/pdf');
+				if(headers_sent())
+					$this->Error('Some data has already been output, can\'t send PDF file');
+				header('Content-Length: '.strlen($this->buffer));
+				header('Content-Disposition: inline; filename="'.$name.'"');
+				header('Cache-Control: private, max-age=0, must-revalidate');
+				header('Pragma: public');
+				ini_set('zlib.output_compression','0');
+			}
+			echo $this->buffer;
+			break;
+		case 'D':
+			//Download file
+			if(ob_get_length())
+				$this->Error('Some data has already been output, can\'t send PDF file');
+			header('Content-Type: application/x-download');
+			if(headers_sent())
+				$this->Error('Some data has already been output, can\'t send PDF file');
+			header('Content-Length: '.strlen($this->buffer));
+			header('Content-Disposition: attachment; filename="'.$name.'"');
+			header('Cache-Control: private, max-age=0, must-revalidate');
+			header('Pragma: public');
+			ini_set('zlib.output_compression','0');
+			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');
+	//Disable runtime magic quotes
+	if(get_magic_quotes_runtime())
+		@set_magic_quotes_runtime(0);
+}
+
+function _getpageformat($format)
+{
+	$format=strtolower($format);
+	if(!isset($this->PageFormats[$format]))
+		$this->Error('Unknown page format: '.$format);
+	$a=$this->PageFormats[$format];
+	return array($a[0]/$this->k, $a[1]/$this->k);
+}
+
+function _getfontpath()
+{
+	if(!defined('FPDF_FONTPATH') && is_dir(dirname(__FILE__).'/font'))
+		define('FPDF_FONTPATH',dirname(__FILE__).'/font/');
+	return defined('FPDF_FONTPATH') ? FPDF_FONTPATH : '';
+}
+
+function _beginpage($orientation, $format)
+{
+	$this->page++;
+	$this->pages[$this->page]='';
+	$this->state=2;
+	$this->x=$this->lMargin;
+	$this->y=$this->tMargin;
+	$this->FontFamily='';
+	//Check page size
+	if($orientation=='')
+		$orientation=$this->DefOrientation;
+	else
+		$orientation=strtoupper($orientation[0]);
+	if($format=='')
+		$format=$this->DefPageFormat;
+	else
+	{
+		if(is_string($format))
+			$format=$this->_getpageformat($format);
+	}
+	if($orientation!=$this->CurOrientation || $format[0]!=$this->CurPageFormat[0] || $format[1]!=$this->CurPageFormat[1])
+	{
+		//New size
+		if($orientation=='P')
+		{
+			$this->w=$format[0];
+			$this->h=$format[1];
+		}
+		else
+		{
+			$this->w=$format[1];
+			$this->h=$format[0];
+		}
+		$this->wPt=$this->w*$this->k;
+		$this->hPt=$this->h*$this->k;
+		$this->PageBreakTrigger=$this->h-$this->bMargin;
+		$this->CurOrientation=$orientation;
+		$this->CurPageFormat=$format;
+	}
+	if($orientation!=$this->DefOrientation || $format[0]!=$this->DefPageFormat[0] || $format[1]!=$this->DefPageFormat[1])
+		$this->PageSizes[$this->page]=array($this->wPt, $this->hPt);
+}
+
+function _endpage()
+{
+	$this->state=1;
+}
+
+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;
+	//Read whole file
+	$f=fopen($file,'rb');
+	$data='';
+	while(!feof($f))
+		$data.=fread($f,8192);
+	fclose($f);
+	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);
+	//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)
+		$colspace='DeviceGray';
+	elseif($ct==2)
+		$colspace='DeviceRGB';
+	elseif($ct==3)
+		$colspace='Indexed';
+	else
+		$this->Error('Alpha channel not supported: '.$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);
+	$parms='/DecodeParms <</Predictor 15 /Colors '.($ct==2 ? 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);
+	fclose($f);
+	return array('w'=>$w, 'h'=>$h, 'cs'=>$colspace, 'bpc'=>$bpc, 'f'=>'FlateDecode', 'parms'=>$parms, 'pal'=>$pal, 'trns'=>$trns, 'data'=>$data);
+}
+
+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);
+	$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->DefPageFormat[0]*$this->k;
+		$hPt=$this->DefPageFormat[1]*$this->k;
+	}
+	else
+	{
+		$wPt=$this->DefPageFormat[1]*$this->k;
+		$hPt=$this->DefPageFormat[0]*$this->k;
+	}
+	$filter=($this->compress) ? '/Filter /FlateDecode ' : '';
+	for($n=1;$n<=$nb;$n++)
+	{
+		//Page
+		$this->_newobj();
+		$this->_out('<</Type /Page');
+		$this->_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.='<</Type /Annot /Subtype /Link /Rect ['.$rect.'] /Border [0 0 0] ';
+				if(is_string($pl[4]))
+					$annots.='/A <</S /URI /URI '.$this->_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('<</Type /Pages');
+	$kids='/Kids [';
+	for($i=0;$i<$nb;$i++)
+		$kids.=(3+2*$i).' 0 R ';
+	$this->_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('<</Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences ['.$diff.']>>');
+		$this->_out('endobj');
+	}
+	foreach($this->FontFiles as $file=>$info)
+	{
+		//Font file embedding
+		$this->_newobj();
+		$this->FontFiles[$file]['n']=$this->n;
+		$font='';
+		$f=fopen($this->_getfontpath().$file,'rb',1);
+		if(!$f)
+			$this->Error('Font file not found');
+		while(!feof($f))
+			$font.=fread($f,8192);
+		fclose($f);
+		$compressed=(substr($file,-2)=='.z');
+		if(!$compressed && isset($info['length2']))
+		{
+			$header=(ord($font[0])==128);
+			if($header)
+			{
+				//Strip first binary header
+				$font=substr($font,6);
+			}
+			if($header && ord($font[$info['length1']])==128)
+			{
+				//Strip second binary header
+				$font=substr($font,0,$info['length1']).substr($font,$info['length1']+6);
+			}
+		}
+		$this->_out('<</Length '.strlen($font));
+		if($compressed)
+			$this->_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')
+		{
+			//Standard font
+			$this->_newobj();
+			$this->_out('<</Type /Font');
+			$this->_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 font
+			$this->_newobj();
+			$this->_out('<</Type /Font');
+			$this->_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($font['enc'])
+			{
+				if(isset($font['diff']))
+					$this->_out('/Encoding '.($nf+$font['diff']).' 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='<</Type /FontDescriptor /FontName /'.$name;
+			foreach($font['desc'] as $k=>$v)
+				$s.=' /'.$k.' '.$v;
+			$file=$font['file'];
+			if($file)
+				$s.=' /FontFile'.($type=='Type1' ? '' : '2').' '.$this->FontFiles[$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()
+{
+	$filter=($this->compress) ? '/Filter /FlateDecode ' : '';
+	reset($this->images);
+	while(list($file,$info)=each($this->images))
+	{
+		$this->_newobj();
+		$this->images[$file]['n']=$this->n;
+		$this->_out('<</Type /XObject');
+		$this->_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['parms']))
+			$this->_out($info['parms']);
+		if(isset($info['trns']) && is_array($info['trns']))
+		{
+			$trns='';
+			for($i=0;$i<count($info['trns']);$i++)
+				$trns.=$info['trns'][$i].' '.$info['trns'][$i].' ';
+			$this->_out('/Mask ['.$trns.']');
+		}
+		$this->_out('/Length '.strlen($info['data']).'>>');
+		$this->_putstream($info['data']);
+		unset($this->images[$file]['data']);
+		$this->_out('endobj');
+		//Palette
+		if($info['cs']=='Indexed')
+		{
+			$this->_newobj();
+			$pal=($this->compress) ? gzcompress($info['pal']) : $info['pal'];
+			$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 '.($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;
+}
+
+?>

$B%3%T!<$K$h$kDI2C(B: branches/version-2_5-dev/data/module/fpdf/fpdf_tpl.php ($B%3%T!<85(B: $B%j%S%8%g%s(B 19715, branches/version-2_5-dev/data/pdf/fpdf_tpl.php)
===================================================================
--- branches/version-2_5-dev/data/module/fpdf/fpdf_tpl.php	                        (rev 0)
+++ branches/version-2_5-dev/data/module/fpdf/fpdf_tpl.php	2010-12-11 03:15:20 UTC (rev 19716)
@@ -0,0 +1,449 @@
+<?php
+//
+//  FPDF_TPL - Version 1.2
+//
+//    Copyright 2004-2010 Setasign - Jan Slabon
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+class FPDF_TPL extends FPDF {
+    /**
+     * Array of Tpl-Data
+     * @var array
+     */
+    var $tpls = array();
+
+    /**
+     * Current Template-ID
+     * @var int
+     */
+    var $tpl = 0;
+    
+    /**
+     * "In Template"-Flag
+     * @var boolean
+     */
+    var $_intpl = false;
+    
+    /**
+     * Nameprefix of Templates used in Resources-Dictonary
+     * @var string A String defining the Prefix used as Template-Object-Names. Have to beginn with an /
+     */
+    var $tplprefix = "/TPL";
+
+    /**
+     * Resources used By Templates and Pages
+     * @var array
+     */
+    var $_res = array();
+    
+    /**
+     * Last used Template data
+     *
+     * @var array
+     */
+    var $lastUsedTemplateData = array();
+    
+    /**
+     * Start a Template
+     *
+     * This method starts a template. You can give own coordinates to build an own sized
+     * Template. Pay attention, that the margins are adapted to the new templatesize.
+     * If you want to write outside the template, for example to build a clipped Template,
+     * you have to set the Margins and "Cursor"-Position manual after beginTemplate-Call.
+     *
+     * If no parameter is given, the template uses the current page-size.
+     * The Method returns an ID of the current Template. This ID is used later for using this template.
+     * Warning: A created Template is used in PDF at all events. Still if you don't use it after creation!
+     *
+     * @param int $x The x-coordinate given in user-unit
+     * @param int $y The y-coordinate given in user-unit
+     * @param int $w The width given in user-unit
+     * @param int $h The height given in user-unit
+     * @return int The ID of new created Template
+     */
+    function beginTemplate($x = null, $y = null, $w = null, $h = null) {
+    	if (is_subclass_of($this, 'TCPDF')) {
+    		$this->Error('This method is only usable with FPDF. Use TCPDF methods startTemplate() instead.');
+    		return;
+    	}
+    	
+        if ($this->page <= 0)
+            $this->error("You have to add a page to fpdf first!");
+
+        if ($x == null)
+            $x = 0;
+        if ($y == null)
+            $y = 0;
+        if ($w == null)
+            $w = $this->w;
+        if ($h == null)
+            $h = $this->h;
+
+        // Save settings
+        $this->tpl++;
+        $tpl =& $this->tpls[$this->tpl];
+        $tpl = array(
+            'o_x' => $this->x,
+            'o_y' => $this->y,
+            'o_AutoPageBreak' => $this->AutoPageBreak,
+            'o_bMargin' => $this->bMargin,
+            'o_tMargin' => $this->tMargin,
+            'o_lMargin' => $this->lMargin,
+            'o_rMargin' => $this->rMargin,
+            'o_h' => $this->h,
+            'o_w' => $this->w,
+            'buffer' => '',
+            'x' => $x,
+            'y' => $y,
+            'w' => $w,
+            'h' => $h
+        );
+
+        $this->SetAutoPageBreak(false);
+        
+        // Define own high and width to calculate possitions correct
+        $this->h = $h;
+        $this->w = $w;
+
+        $this->_intpl = true;
+        $this->SetXY($x + $this->lMargin, $y + $this->tMargin);
+        $this->SetRightMargin($this->w - $w + $this->rMargin);
+
+        return $this->tpl;
+    }
+    
+    /**
+     * End Template
+     *
+     * This method ends a template and reset initiated variables on beginTemplate.
+     *
+     * @return mixed If a template is opened, the ID is returned. If not a false is returned.
+     */
+    function endTemplate() {
+    	if (is_subclass_of($this, 'TCPDF')) {
+        	$args = func_get_args();
+        	return call_user_func_array(array($this, 'TCPDF::endTemplate'), $args);
+        }
+        
+        if ($this->_intpl) {
+            $this->_intpl = false; 
+            $tpl =& $this->tpls[$this->tpl];
+            $this->SetXY($tpl['o_x'], $tpl['o_y']);
+            $this->tMargin = $tpl['o_tMargin'];
+            $this->lMargin = $tpl['o_lMargin'];
+            $this->rMargin = $tpl['o_rMargin'];
+            $this->h = $tpl['o_h'];
+            $this->w = $tpl['o_w'];
+            $this->SetAutoPageBreak($tpl['o_AutoPageBreak'], $tpl['o_bMargin']);
+            
+            return $this->tpl;
+        } else {
+            return false;
+        }
+    }
+    
+    /**
+     * Use a Template in current Page or other Template
+     *
+     * You can use a template in a page or in another template.
+     * You can give the used template a new size like you use the Image()-method.
+     * All parameters are optional. The width or height is calculated automaticaly
+     * if one is given. If no parameter is given the origin size as defined in
+     * beginTemplate() is used.
+     * The calculated or used width and height are returned as an array.
+     *
+     * @param int $tplidx A valid template-Id
+     * @param int $_x The x-position
+     * @param int $_y The y-position
+     * @param int $_w The new width of the template
+     * @param int $_h The new height of the template
+     * @retrun array The height and width of the template
+     */
+    function useTemplate($tplidx, $_x = null, $_y = null, $_w = 0, $_h = 0) {
+        if ($this->page <= 0)
+        	$this->error('You have to add a page first!');
+        
+        if (!isset($this->tpls[$tplidx]))
+            $this->error('Template does not exist!');
+            
+        if ($this->_intpl) {
+            $this->_res['tpl'][$this->tpl]['tpls'][$tplidx] =& $this->tpls[$tplidx];
+        }
+        
+        $tpl =& $this->tpls[$tplidx];
+        $w = $tpl['w'];
+        $h = $tpl['h'];
+        
+        if ($_x == null)
+            $_x = 0;
+        if ($_y == null)
+            $_y = 0;
+            
+        $_x += $tpl['x'];
+        $_y += $tpl['y'];
+        
+        $wh = $this->getTemplateSize($tplidx, $_w, $_h);
+        $_w = $wh['w'];
+        $_h = $wh['h'];
+    
+        $tData = array(
+            'x' => $this->x,
+            'y' => $this->y,
+            'w' => $_w,
+            'h' => $_h,
+            'scaleX' => ($_w / $w),
+            'scaleY' => ($_h / $h),
+            'tx' => $_x,
+            'ty' =>  ($this->h - $_y - $_h),
+            'lty' => ($this->h - $_y - $_h) - ($this->h - $h) * ($_h / $h)
+        );
+        
+        $this->_out(sprintf('q %.4F 0 0 %.4F %.4F %.4F cm', $tData['scaleX'], $tData['scaleY'], $tData['tx'] * $this->k, $tData['ty'] * $this->k)); // Translate 
+        $this->_out(sprintf('%s%d Do Q', $this->tplprefix, $tplidx));
+
+        // reset font in the outer graphic state
+        if ($this->FontFamily) {
+	        $family = $this->FontFamily;
+	        $this->FontFamily = '';
+	        $this->SetFont($family);
+        }
+        
+        $this->lastUsedTemplateData = $tData;
+        
+        return array('w' => $_w, 'h' => $_h);
+    }
+    
+    /**
+     * Get The calculated Size of a Template
+     *
+     * If one size is given, this method calculates the other one.
+     *
+     * @param int $tplidx A valid template-Id
+     * @param int $_w The width of the template
+     * @param int $_h The height of the template
+     * @return array The height and width of the template
+     */
+    function getTemplateSize($tplidx, $_w = 0, $_h = 0) {
+        if (!$this->tpls[$tplidx])
+            return false;
+
+        $tpl =& $this->tpls[$tplidx];
+        $w = $tpl['w'];
+        $h = $tpl['h'];
+        
+        if ($_w == 0 and $_h == 0) {
+            $_w = $w;
+            $_h = $h;
+        }
+
+    	if($_w == 0)
+    		$_w = $_h * $w / $h;
+    	if($_h == 0)
+    		$_h = $_w * $h / $w;
+    		
+        return array("w" => $_w, "h" => $_h);
+    }
+    
+    /**
+     * See FPDF/TCPDF-Documentation ;-)
+     */
+    public function SetFont($family, $style = '', $size = 0) {
+        if (is_subclass_of($this, 'TCPDF')) {
+        	$args = func_get_args();
+        	return call_user_func_array(array($this, 'TCPDF::SetFont'), $args);
+        }
+        
+        /**
+         * force the resetting of font changes in a template
+         */
+        if ($this->_intpl)
+            $this->FontFamily = '';
+            
+        parent::SetFont($family, $style, $size);
+       
+        $fontkey = $this->FontFamily . $this->FontStyle;
+        
+        if ($this->_intpl) {
+            $this->_res['tpl'][$this->tpl]['fonts'][$fontkey] =& $this->fonts[$fontkey];
+        } else {
+            $this->_res['page'][$this->page]['fonts'][$fontkey] =& $this->fonts[$fontkey];
+        }
+    }
+    
+    /**
+     * See FPDF/TCPDF-Documentation ;-)
+     */
+    function Image($file, $x = null, $y = null, $w = 0, $h = 0, $type = '', $link = '') {
+        if (is_subclass_of($this, 'TCPDF')) {
+        	$args = func_get_args();
+			return call_user_func_array(array($this, 'TCPDF::Image'), $args);
+        }
+        
+        $ret = parent::Image($file, $x, $y, $w, $h, $type, $link);
+        if ($this->_intpl) {
+            $this->_res['tpl'][$this->tpl]['images'][$file] =& $this->images[$file];
+        } else {
+            $this->_res['page'][$this->page]['images'][$file] =& $this->images[$file];
+        }
+        
+        return $ret;
+    }
+    
+    /**
+     * See FPDF-Documentation ;-)
+     *
+     * AddPage is not available when you're "in" a template.
+     */
+    function AddPage($orientation = '', $format = '') {
+    	if (is_subclass_of($this, 'TCPDF')) {
+        	$args = func_get_args();
+        	return call_user_func_array(array($this, 'TCPDF::AddPage'), $args);
+        }
+        
+        if ($this->_intpl)
+            $this->Error('Adding pages in templates isn\'t possible!');
+            
+        parent::AddPage($orientation, $format);
+    }
+
+    /**
+     * Preserve adding Links in Templates ...won't work
+     */
+    function Link($x, $y, $w, $h, $link) {
+        if (is_subclass_of($this, 'TCPDF')) {
+        	$args = func_get_args();
+			return call_user_func_array(array($this, 'TCPDF::Link'), $args);
+        }
+        
+        if ($this->_intpl)
+            $this->Error('Using links in templates aren\'t possible!');
+            
+        parent::Link($x, $y, $w, $h, $link);
+    }
+    
+    function AddLink() {
+    	if (is_subclass_of($this, 'TCPDF')) {
+        	$args = func_get_args();
+			return call_user_func_array(array($this, 'TCPDF::AddLink'), $args);
+        }
+        
+        if ($this->_intpl)
+            $this->Error('Adding links in templates aren\'t possible!');
+        return parent::AddLink();
+    }
+    
+    function SetLink($link, $y = 0, $page = -1) {
+    	if (is_subclass_of($this, 'TCPDF')) {
+        	$args = func_get_args();
+			return call_user_func_array(array($this, 'TCPDF::SetLink'), $args);
+        }
+        
+        if ($this->_intpl)
+            $this->Error('Setting links in templates aren\'t possible!');
+        parent::SetLink($link, $y, $page);
+    }
+    
+    /**
+     * Private Method that writes the form xobjects
+     */
+    function _putformxobjects() {
+        $filter=($this->compress) ? '/Filter /FlateDecode ' : '';
+	    reset($this->tpls);
+        foreach($this->tpls AS $tplidx => $tpl) {
+
+            $p=($this->compress) ? gzcompress($tpl['buffer']) : $tpl['buffer'];
+    		$this->_newobj();
+    		$this->tpls[$tplidx]['n'] = $this->n;
+    		$this->_out('<<'.$filter.'/Type /XObject');
+            $this->_out('/Subtype /Form');
+            $this->_out('/FormType 1');
+            $this->_out(sprintf('/BBox [%.2F %.2F %.2F %.2F]',
+                // llx
+                $tpl['x'] * $this->k,
+                // lly
+                -$tpl['y'] * $this->k,
+                // urx
+                ($tpl['w'] + $tpl['x']) * $this->k,
+                // ury
+                ($tpl['h'] - $tpl['y']) * $this->k
+            ));
+            
+            if ($tpl['x'] != 0 || $tpl['y'] != 0) {
+                $this->_out(sprintf('/Matrix [1 0 0 1 %.5F %.5F]',
+                     -$tpl['x'] * $this->k * 2, $tpl['y'] * $this->k * 2
+                ));
+            }
+            
+            $this->_out('/Resources ');
+
+            $this->_out('<</ProcSet [/PDF /Text /ImageB /ImageC /ImageI]');
+        	if (isset($this->_res['tpl'][$tplidx]['fonts']) && count($this->_res['tpl'][$tplidx]['fonts'])) {
+            	$this->_out('/Font <<');
+                foreach($this->_res['tpl'][$tplidx]['fonts'] as $font)
+            		$this->_out('/F' . $font['i'] . ' ' . $font['n'] . ' 0 R');
+            	$this->_out('>>');
+            }
+        	if(isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images']) || 
+        	   isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls']))
+        	{
+                $this->_out('/XObject <<');
+                if (isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images'])) {
+                    foreach($this->_res['tpl'][$tplidx]['images'] as $image)
+              			$this->_out('/I' . $image['i'] . ' ' . $image['n'] . ' 0 R');
+                }
+                if (isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) {
+                    foreach($this->_res['tpl'][$tplidx]['tpls'] as $i => $tpl)
+                        $this->_out($this->tplprefix . $i . ' ' . $tpl['n'] . ' 0 R');
+                }
+                $this->_out('>>');
+        	}
+        	$this->_out('>>');
+        	
+        	$this->_out('/Length ' . strlen($p) . ' >>');
+    		$this->_putstream($p);
+    		$this->_out('endobj');
+        }
+    }
+    
+    /**
+     * Overwritten to add _putformxobjects() after _putimages()
+     *
+     */
+    function _putimages() {
+        parent::_putimages();
+        $this->_putformxobjects();
+    }
+    
+    function _putxobjectdict() {
+        parent::_putxobjectdict();
+        
+        if (count($this->tpls)) {
+            foreach($this->tpls as $tplidx => $tpl) {
+                $this->_out(sprintf('%s%d %d 0 R', $this->tplprefix, $tplidx, $tpl['n']));
+            }
+        }
+    }
+
+    /**
+     * Private Method
+     */
+    function _out($s) {
+        if ($this->state == 2 && $this->_intpl) {
+            $this->tpls[$this->tpl]['buffer'] .= $s . "\n";
+        } else {
+            parent::_out($s);
+        }
+    }
+}

$B%3%T!<$K$h$kDI2C(B: branches/version-2_5-dev/data/module/fpdf/fpdi.php ($B%3%T!<85(B: $B%j%S%8%g%s(B 19715, branches/version-2_5-dev/data/pdf/fpdi.php)
===================================================================
--- branches/version-2_5-dev/data/module/fpdf/fpdi.php	                        (rev 0)
+++ branches/version-2_5-dev/data/module/fpdf/fpdi.php	2010-12-11 03:15:20 UTC (rev 19716)
@@ -0,0 +1,542 @@
+<?php
+//
+//  FPDI - Version 1.4
+//
+//    Copyright 2004-2010 Setasign - Jan Slabon
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+define('FPDI_VERSION', '1.4');
+
+// Check for TCPDF and remap TCPDF to FPDF
+if (class_exists('TCPDF', false)) {
+    require_once('fpdi2tcpdf_bridge.php');
+}
+
+require_once('fpdf_tpl.php');
+require_once('fpdi_pdf_parser.php');
+
+
+class FPDI extends FPDF_TPL {
+    /**
+     * Actual filename
+     * @var string
+     */
+    var $current_filename;
+
+    /**
+     * Parser-Objects
+     * @var array
+     */
+    var $parsers;
+    
+    /**
+     * Current parser
+     * @var object
+     */
+    var $current_parser;
+    
+    /**
+     * object stack
+     * @var array
+     */
+    var $_obj_stack;
+    
+    /**
+     * done object stack
+     * @var array
+     */
+    var $_don_obj_stack;
+
+    /**
+     * Current Object Id.
+     * @var integer
+     */
+    var $_current_obj_id;
+    
+    /**
+     * The name of the last imported page box
+     * @var string
+     */
+    var $lastUsedPageBox;
+    
+    /**
+     * Cache for imported pages/template ids
+     * @var array
+     */
+    var $_importedPages = array();
+    
+    /**
+     * Set a source-file
+     *
+     * @param string $filename a valid filename
+     * @return int number of available pages
+     */
+    function setSourceFile($filename) {
+        $this->current_filename = $filename;
+        
+        if (!isset($this->parsers[$filename]))
+            $this->parsers[$filename] = $this->_getPdfParser($filename);
+        $this->current_parser =& $this->parsers[$filename];
+        
+        return $this->parsers[$filename]->getPageCount();
+    }
+    
+    /**
+     * Returns a PDF parser object
+     *
+     * @param string $filename
+     * @return fpdi_pdf_parser
+     */
+    function _getPdfParser($filename) {
+    	return new fpdi_pdf_parser($filename, $this);
+    }
+    
+    /**
+     * Get the current PDF version
+     *
+     * @return string
+     */
+    function getPDFVersion() {
+		return $this->PDFVersion;
+	}
+    
+	/**
+     * Set the PDF version
+     *
+     * @return string
+     */
+	function setPDFVersion($version = '1.3') {
+		$this->PDFVersion = $version;
+	}
+	
+    /**
+     * Import a page
+     *
+     * @param int $pageno pagenumber
+     * @return int Index of imported page - to use with fpdf_tpl::useTemplate()
+     */
+    function importPage($pageno, $boxName = '/CropBox') {
+        if ($this->_intpl) {
+            return $this->error('Please import the desired pages before creating a new template.');
+        }
+        
+        $fn = $this->current_filename;
+        
+        // check if page already imported
+        $pageKey = $fn . ((int)$pageno) . $boxName;
+        if (isset($this->_importedPages[$pageKey]))
+            return $this->_importedPages[$pageKey];
+        
+        $parser =& $this->parsers[$fn];
+        $parser->setPageno($pageno);
+
+        if (!in_array($boxName, $parser->availableBoxes))
+            return $this->Error(sprintf('Unknown box: %s', $boxName));
+        $pageboxes = $parser->getPageBoxes($pageno, $this->k);
+        
+        /**
+         * MediaBox
+         * CropBox: Default -> MediaBox
+         * BleedBox: Default -> CropBox
+         * TrimBox: Default -> CropBox
+         * ArtBox: Default -> CropBox
+         */
+        if (!isset($pageboxes[$boxName]) && ($boxName == '/BleedBox' || $boxName == '/TrimBox' || $boxName == '/ArtBox'))
+            $boxName = '/CropBox';
+        if (!isset($pageboxes[$boxName]) && $boxName == '/CropBox')
+            $boxName = '/MediaBox';
+        
+        if (!isset($pageboxes[$boxName]))
+            return false;
+        $this->lastUsedPageBox = $boxName;
+        
+        $box = $pageboxes[$boxName];
+        
+        $this->tpl++;
+        $this->tpls[$this->tpl] = array();
+        $tpl =& $this->tpls[$this->tpl];
+        $tpl['parser'] =& $parser;
+        $tpl['resources'] = $parser->getPageResources();
+        $tpl['buffer'] = $parser->getContent();
+        $tpl['box'] = $box;
+        
+        // To build an array that can be used by PDF_TPL::useTemplate()
+        $this->tpls[$this->tpl] = array_merge($this->tpls[$this->tpl], $box);
+        
+        // An imported page will start at 0,0 everytime. Translation will be set in _putformxobjects()
+        $tpl['x'] = 0;
+        $tpl['y'] = 0;
+        
+        // handle rotated pages
+        $rotation = $parser->getPageRotation($pageno);
+        $tpl['_rotationAngle'] = 0;
+        if (isset($rotation[1]) && ($angle = $rotation[1] % 360) != 0) {
+        	$steps = $angle / 90;
+                
+            $_w = $tpl['w'];
+            $_h = $tpl['h'];
+            $tpl['w'] = $steps % 2 == 0 ? $_w : $_h;
+            $tpl['h'] = $steps % 2 == 0 ? $_h : $_w;
+            
+            if ($angle < 0)
+            	$angle += 360;
+            
+        	$tpl['_rotationAngle'] = $angle * -1;
+        }
+        
+        $this->_importedPages[$pageKey] = $this->tpl;
+        
+        return $this->tpl;
+    }
+    
+    function getLastUsedPageBox() {
+        return $this->lastUsedPageBox;
+    }
+    
+    function useTemplate($tplidx, $_x = null, $_y = null, $_w = 0, $_h = 0, $adjustPageSize = false) {
+        if ($adjustPageSize == true && is_null($_x) && is_null($_y)) {
+            $size = $this->getTemplateSize($tplidx, $_w, $_h);
+            $format = array($size['w'], $size['h']);
+            if (is_subclass_of($this, 'TCPDF')) {
+            	$this->setPageFormat($format, $format[0] > $format[1] ? 'L' : 'P');
+            } else {
+            	if ($format[0] != $this->CurPageFormat[0] || $format[1] != $this->CurPageFormat[1]) {
+	                $this->w = $format[0];
+	                $this->h = $format[1];
+	                $this->wPt = $this->w * $this->k;
+	        		$this->hPt = $this->h * $this->k;
+	        		$this->PageBreakTrigger = $this->h - $this->bMargin;
+	        		$this->CurPageFormat = $format;
+	        		$this->PageSizes[$this->page] = array($this->wPt, $this->hPt);
+	            }
+            } 
+        }
+        
+        $this->_out('q 0 J 1 w 0 j 0 G 0 g'); // reset standard values
+        $s = parent::useTemplate($tplidx, $_x, $_y, $_w, $_h);
+        $this->_out('Q');
+        
+        return $s;
+    }
+    
+    /**
+     * Private method, that rebuilds all needed objects of source files
+     */
+    function _putimportedobjects() {
+        if (is_array($this->parsers) && count($this->parsers) > 0) {
+            foreach($this->parsers AS $filename => $p) {
+                $this->current_parser =& $this->parsers[$filename];
+                if (isset($this->_obj_stack[$filename]) && is_array($this->_obj_stack[$filename])) {
+                    while(($n = key($this->_obj_stack[$filename])) !== null) {
+                        $nObj = $this->current_parser->pdf_resolve_object($this->current_parser->c, $this->_obj_stack[$filename][$n][1]);
+						
+                        $this->_newobj($this->_obj_stack[$filename][$n][0]);
+                        
+                        if ($nObj[0] == PDF_TYPE_STREAM) {
+							$this->pdf_write_value($nObj);
+                        } else {
+                            $this->pdf_write_value($nObj[1]);
+                        }
+                        
+                        $this->_out('endobj');
+                        $this->_obj_stack[$filename][$n] = null; // free memory
+                        unset($this->_obj_stack[$filename][$n]);
+                        reset($this->_obj_stack[$filename]);
+                    }
+                }
+            }
+        }
+    }
+    
+    
+    /**
+     * Private Method that writes the form xobjects
+     */
+    function _putformxobjects() {
+        $filter=($this->compress) ? '/Filter /FlateDecode ' : '';
+	    reset($this->tpls);
+        foreach($this->tpls AS $tplidx => $tpl) {
+            $p=($this->compress) ? gzcompress($tpl['buffer']) : $tpl['buffer'];
+    		$this->_newobj();
+    		$cN = $this->n; // TCPDF/Protection: rem current "n"
+    		
+    		$this->tpls[$tplidx]['n'] = $this->n;
+    		$this->_out('<<' . $filter . '/Type /XObject');
+            $this->_out('/Subtype /Form');
+            $this->_out('/FormType 1');
+            
+            $this->_out(sprintf('/BBox [%.2F %.2F %.2F %.2F]', 
+                (isset($tpl['box']['llx']) ? $tpl['box']['llx'] : $tpl['x']) * $this->k,
+                (isset($tpl['box']['lly']) ? $tpl['box']['lly'] : -$tpl['y']) * $this->k,
+                (isset($tpl['box']['urx']) ? $tpl['box']['urx'] : $tpl['w'] + $tpl['x']) * $this->k,
+                (isset($tpl['box']['ury']) ? $tpl['box']['ury'] : $tpl['h'] - $tpl['y']) * $this->k
+            ));
+            
+            $c = 1;
+            $s = 0;
+            $tx = 0;
+            $ty = 0;
+            
+            if (isset($tpl['box'])) {
+                $tx = -$tpl['box']['llx'];
+                $ty = -$tpl['box']['lly']; 
+                
+                if ($tpl['_rotationAngle'] <> 0) {
+                    $angle = $tpl['_rotationAngle'] * M_PI/180;
+                    $c=cos($angle);
+                    $s=sin($angle);
+                    
+                    switch($tpl['_rotationAngle']) {
+                        case -90:
+                           $tx = -$tpl['box']['lly'];
+                           $ty = $tpl['box']['urx'];
+                           break;
+                        case -180:
+                            $tx = $tpl['box']['urx'];
+                            $ty = $tpl['box']['ury'];
+                            break;
+                        case -270:
+                        	$tx = $tpl['box']['ury'];
+                            $ty = -$tpl['box']['llx'];
+                            break;
+                    }
+                }
+            } else if ($tpl['x'] != 0 || $tpl['y'] != 0) {
+                $tx = -$tpl['x']*2;
+                $ty = $tpl['y']*2;
+            }
+            
+            $tx *= $this->k;
+            $ty *= $this->k;
+            
+            if ($c != 1 || $s != 0 || $tx != 0 || $ty != 0) {
+                $this->_out(sprintf('/Matrix [%.5F %.5F %.5F %.5F %.5F %.5F]',
+                    $c, $s, -$s, $c, $tx, $ty
+                ));
+            }
+            
+            $this->_out('/Resources ');
+
+            if (isset($tpl['resources'])) {
+                $this->current_parser =& $tpl['parser'];
+                $this->pdf_write_value($tpl['resources']); // "n" will be changed
+            } else {
+                $this->_out('<</ProcSet [/PDF /Text /ImageB /ImageC /ImageI]');
+            	if (isset($this->_res['tpl'][$tplidx]['fonts']) && count($this->_res['tpl'][$tplidx]['fonts'])) {
+                	$this->_out('/Font <<');
+                    foreach($this->_res['tpl'][$tplidx]['fonts'] as $font)
+                		$this->_out('/F' . $font['i'] . ' ' . $font['n'] . ' 0 R');
+                	$this->_out('>>');
+                }
+            	if(isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images']) || 
+            	   isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls']))
+            	{
+                    $this->_out('/XObject <<');
+                    if (isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images'])) {
+                        foreach($this->_res['tpl'][$tplidx]['images'] as $image)
+                  			$this->_out('/I' . $image['i'] . ' ' . $image['n'] . ' 0 R');
+                    }
+                    if (isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) {
+                        foreach($this->_res['tpl'][$tplidx]['tpls'] as $i => $tpl)
+                            $this->_out($this->tplprefix . $i . ' ' . $tpl['n'] . ' 0 R');
+                    }
+                    $this->_out('>>');
+            	}
+            	$this->_out('>>');
+            }
+
+            $nN = $this->n; // TCPDF: rem new "n"
+            $this->n = $cN; // TCPDF: reset to current "n"
+            $this->_out('/Length ' . strlen($p) . ' >>');
+    		$this->_putstream($p);
+    		$this->_out('endobj');
+    		$this->n = $nN; // TCPDF: reset to new "n"
+        }
+        
+        $this->_putimportedobjects();
+    }
+
+    /**
+     * Rewritten to handle existing own defined objects
+     */
+    function _newobj($obj_id = false, $onlynewobj = false) {
+        if (!$obj_id) {
+            $obj_id = ++$this->n;
+        }
+
+        //Begin a new object
+        if (!$onlynewobj) {
+            $this->offsets[$obj_id] = is_subclass_of($this, 'TCPDF') ? $this->bufferlen : strlen($this->buffer);
+            $this->_out($obj_id . ' 0 obj');
+            $this->_current_obj_id = $obj_id; // for later use with encryption
+        }
+        
+        return $obj_id;
+    }
+
+    /**
+     * Writes a value
+     * Needed to rebuild the source document
+     *
+     * @param mixed $value A PDF-Value. Structure of values see cases in this method
+     */
+    function pdf_write_value(&$value)
+    {
+        if (is_subclass_of($this, 'TCPDF')) {
+            parent::pdf_write_value($value);
+        }
+        
+        switch ($value[0]) {
+
+    		case PDF_TYPE_TOKEN:
+                $this->_straightOut($value[1] . ' ');
+    			break;
+		    case PDF_TYPE_NUMERIC:
+    		case PDF_TYPE_REAL:
+                if (is_float($value[1]) && $value[1] != 0) {
+    			    $this->_straightOut(rtrim(rtrim(sprintf('%F', $value[1]), '0'), '.') . ' ');
+    			} else {
+        			$this->_straightOut($value[1] . ' ');
+    			}
+    			break;
+    			
+    		case PDF_TYPE_ARRAY:
+
+    			// An array. Output the proper
+    			// structure and move on.
+
+    			$this->_straightOut('[');
+                for ($i = 0; $i < count($value[1]); $i++) {
+    				$this->pdf_write_value($value[1][$i]);
+    			}
+
+    			$this->_out(']');
+    			break;
+
+    		case PDF_TYPE_DICTIONARY:
+
+    			// A dictionary.
+    			$this->_straightOut('<<');
+
+    			reset ($value[1]);
+
+    			while (list($k, $v) = each($value[1])) {
+    				$this->_straightOut($k . ' ');
+    				$this->pdf_write_value($v);
+    			}
+
+    			$this->_straightOut('>>');
+    			break;
+
+    		case PDF_TYPE_OBJREF:
+
+    			// An indirect object reference
+    			// Fill the object stack if needed
+    			$cpfn =& $this->current_parser->filename;
+    			
+    			if (!isset($this->_don_obj_stack[$cpfn][$value[1]])) {
+    			    $this->_newobj(false, true);
+    			    $this->_obj_stack[$cpfn][$value[1]] = array($this->n, $value);
+                    $this->_don_obj_stack[$cpfn][$value[1]] = array($this->n, $value); // Value is maybee obsolete!!!
+                }
+                $objid = $this->_don_obj_stack[$cpfn][$value[1]][0];
+
+    			$this->_out($objid . ' 0 R');
+    			break;
+
+    		case PDF_TYPE_STRING:
+
+    			// A string.
+                $this->_straightOut('(' . $value[1] . ')');
+
+    			break;
+
+    		case PDF_TYPE_STREAM:
+
+    			// A stream. First, output the
+    			// stream dictionary, then the
+    			// stream data itself.
+                $this->pdf_write_value($value[1]);
+    			$this->_out('stream');
+    			$this->_out($value[2][1]);
+    			$this->_out('endstream');
+    			break;
+    			
+            case PDF_TYPE_HEX:
+                $this->_straightOut('<' . $value[1] . '>');
+                break;
+
+            case PDF_TYPE_BOOLEAN:
+    		    $this->_straightOut($value[1] ? 'true ' : 'false ');
+    		    break;
+            
+    		case PDF_TYPE_NULL:
+                // The null object.
+
+    			$this->_straightOut('null ');
+    			break;
+    	}
+    }
+    
+    
+    /**
+     * Modified so not each call will add a newline to the output.
+     */
+    function _straightOut($s) {
+        if (!is_subclass_of($this, 'TCPDF')) {
+            if($this->state==2)
+        		$this->pages[$this->page] .= $s;
+        	else
+        		$this->buffer .= $s;
+        } else {
+            if ($this->state == 2) {
+				if (isset($this->footerlen[$this->page]) AND ($this->footerlen[$this->page] > 0)) {
+					// puts data before page footer
+					$page = substr($this->getPageBuffer($this->page), 0, -$this->footerlen[$this->page]);
+					$footer = substr($this->getPageBuffer($this->page), -$this->footerlen[$this->page]);
+					$this->setPageBuffer($this->page, $page . ' ' . $s . "\n" . $footer);
+				} else {
+					$this->setPageBuffer($this->page, $s, true);
+				}
+			} else {
+				$this->setBuffer($s);
+			}
+        }
+    }
+
+    /**
+     * rewritten to close opened parsers
+     *
+     */
+    function _enddoc() {
+        parent::_enddoc();
+        $this->_closeParsers();
+    }
+    
+    /**
+     * close all files opened by parsers
+     */
+    function _closeParsers() {
+        if ($this->state > 2 && count($this->parsers) > 0) {
+          	foreach ($this->parsers as $k => $_){
+            	$this->parsers[$k]->closeFile();
+            	$this->parsers[$k] = null;
+            	unset($this->parsers[$k]);
+            }
+            return true;
+        }
+        return false;
+    }
+}
\ No newline at end of file

$BDI2C(B: branches/version-2_5-dev/data/module/fpdf/fpdi2tcpdf_bridge.php
===================================================================
--- branches/version-2_5-dev/data/module/fpdf/fpdi2tcpdf_bridge.php	                        (rev 0)
+++ branches/version-2_5-dev/data/module/fpdf/fpdi2tcpdf_bridge.php	2010-12-11 03:15:20 UTC (rev 19716)
@@ -0,0 +1,163 @@
+<?php
+//
+//  FPDI - Version 1.4
+//
+//    Copyright 2004-2010 Setasign - Jan Slabon
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+/**
+ * This class is used as a bridge between TCPDF and FPDI
+ * and will create the possibility to use both FPDF and TCPDF
+ * via one FPDI version.
+ * 
+ * We'll simply remap TCPDF to FPDF again.
+ * 
+ * It'll be loaded and extended by FPDF_TPL.
+ */
+class FPDF extends TCPDF {
+    
+	function _putstream($s) {
+		$this->_out($this->_getstream($s));
+	}
+	
+	function _getxobjectdict() {
+        $out = parent::_getxobjectdict();
+        if (count($this->tpls)) {
+            foreach($this->tpls as $tplidx => $tpl) {
+                $out .= sprintf('%s%d %d 0 R', $this->tplprefix, $tplidx, $tpl['n']);
+            }
+        }
+        
+        return $out;
+    }
+	
+    /**
+     * Encryption of imported data by FPDI
+     *
+     * @param array $value
+     */
+    function pdf_write_value(&$value) {
+        switch ($value[0]) {
+    		case PDF_TYPE_STRING:
+				if ($this->encrypted) {
+				    $value[1] = $this->_unescape($value[1]);
+                    $value[1] = $this->_RC4($this->_objectkey($this->_current_obj_id), $value[1]);
+                 	$value[1] = $this->_escape($value[1]);
+                } 
+    			break;
+    			
+			case PDF_TYPE_STREAM:
+			    if ($this->encrypted) {
+			        $value[2][1] = $this->_RC4($this->_objectkey($this->_current_obj_id), $value[2][1]);
+                }
+                break;
+                
+            case PDF_TYPE_HEX:
+            	if ($this->encrypted) {
+                	$value[1] = $this->hex2str($value[1]);
+                	$value[1] = $this->_RC4($this->_objectkey($this->_current_obj_id), $value[1]);
+                    
+                	// remake hexstring of encrypted string
+    				$value[1] = $this->str2hex($value[1]);
+                }
+                break;
+    	}
+    }
+    
+    /**
+     * Unescapes a PDF string
+     *
+     * @param string $s
+     * @return string
+     */
+    function _unescape($s) {
+        $out = '';
+        for ($count = 0, $n = strlen($s); $count < $n; $count++) {
+            if ($s[$count] != '\\' || $count == $n-1) {
+                $out .= $s[$count];
+            } else {
+                switch ($s[++$count]) {
+                    case ')':
+                    case '(':
+                    case '\\':
+                        $out .= $s[$count];
+                        break;
+                    case 'f':
+                        $out .= chr(0x0C);
+                        break;
+                    case 'b':
+                        $out .= chr(0x08);
+                        break;
+                    case 't':
+                        $out .= chr(0x09);
+                        break;
+                    case 'r':
+                        $out .= chr(0x0D);
+                        break;
+                    case 'n':
+                        $out .= chr(0x0A);
+                        break;
+                    case "\r":
+                        if ($count != $n-1 && $s[$count+1] == "\n")
+                            $count++;
+                        break;
+                    case "\n":
+                        break;
+                    default:
+                        // Octal-Values
+                        if (ord($s[$count]) >= ord('0') &&
+                            ord($s[$count]) <= ord('9')) {
+                            $oct = ''. $s[$count];
+                                
+                            if (ord($s[$count+1]) >= ord('0') &&
+                                ord($s[$count+1]) <= ord('9')) {
+                                $oct .= $s[++$count];
+                                
+                                if (ord($s[$count+1]) >= ord('0') &&
+                                    ord($s[$count+1]) <= ord('9')) {
+                                    $oct .= $s[++$count];    
+                                }                            
+                            }
+                            
+                            $out .= chr(octdec($oct));
+                        } else {
+                            $out .= $s[$count];
+                        }
+                }
+            }
+        }
+        return $out;
+    }
+    
+    /**
+     * Hexadecimal to string
+     *
+     * @param string $hex
+     * @return string
+     */
+    function hex2str($hex) {
+    	return pack('H*', str_replace(array("\r", "\n", ' '), '', $hex));
+    }
+    
+    /**
+     * String to hexadecimal
+     *
+     * @param string $str
+     * @return string
+     */
+    function str2hex($str) {
+        return current(unpack('H*', $str));
+    }
+}
\ No newline at end of file

$B%3%T!<$K$h$kDI2C(B: branches/version-2_5-dev/data/module/fpdf/fpdi_pdf_parser.php ($B%3%T!<85(B: $B%j%S%8%g%s(B 19715, branches/version-2_5-dev/data/pdf/fpdi_pdf_parser.php)
===================================================================
--- branches/version-2_5-dev/data/module/fpdf/fpdi_pdf_parser.php	                        (rev 0)
+++ branches/version-2_5-dev/data/module/fpdf/fpdi_pdf_parser.php	2010-12-11 03:15:20 UTC (rev 19716)
@@ -0,0 +1,406 @@
+<?php
+//
+//  FPDI - Version 1.4
+//
+//    Copyright 2004-2010 Setasign - Jan Slabon
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+require_once('pdf_parser.php');
+
+class fpdi_pdf_parser extends pdf_parser {
+
+    /**
+     * Pages
+     * Index beginns at 0
+     *
+     * @var array
+     */
+    var $pages;
+    
+    /**
+     * Page count
+     * @var integer
+     */
+    var $page_count;
+    
+    /**
+     * actual page number
+     * @var integer
+     */
+    var $pageno;
+    
+    /**
+     * PDF Version of imported Document
+     * @var string
+     */
+    var $pdfVersion;
+    
+    /**
+     * FPDI Reference
+     * @var object
+     */
+    var $fpdi;
+    
+    /**
+     * Available BoxTypes
+     *
+     * @var array
+     */
+    var $availableBoxes = array('/MediaBox', '/CropBox', '/BleedBox', '/TrimBox', '/ArtBox');
+        
+    /**
+     * Constructor
+     *
+     * @param string $filename  Source-Filename
+     * @param object $fpdi      Object of type fpdi
+     */
+    function fpdi_pdf_parser($filename, &$fpdi) {
+        $this->fpdi =& $fpdi;
+		
+        parent::pdf_parser($filename);
+
+        // resolve Pages-Dictonary
+        $pages = $this->pdf_resolve_object($this->c, $this->root[1][1]['/Pages']);
+
+        // Read pages
+        $this->read_pages($this->c, $pages, $this->pages);
+        
+        // count pages;
+        $this->page_count = count($this->pages);
+    }
+    
+    /**
+     * Overwrite parent::error()
+     *
+     * @param string $msg  Error-Message
+     */
+    function error($msg) {
+    	$this->fpdi->error($msg);	
+    }
+    
+    /**
+     * Get pagecount from sourcefile
+     *
+     * @return int
+     */
+    function getPageCount() {
+        return $this->page_count;
+    }
+
+
+    /**
+     * Set pageno
+     *
+     * @param int $pageno Pagenumber to use
+     */
+    function setPageno($pageno) {
+        $pageno = ((int) $pageno) - 1;
+
+        if ($pageno < 0 || $pageno >= $this->getPageCount()) {
+            $this->fpdi->error('Pagenumber is wrong!');
+        }
+
+        $this->pageno = $pageno;
+    }
+    
+    /**
+     * Get page-resources from current page
+     *
+     * @return array
+     */
+    function getPageResources() {
+        return $this->_getPageResources($this->pages[$this->pageno]);
+    }
+    
+    /**
+     * Get page-resources from /Page
+     *
+     * @param array $obj Array of pdf-data
+     */
+    function _getPageResources ($obj) { // $obj = /Page
+    	$obj = $this->pdf_resolve_object($this->c, $obj);
+
+        // If the current object has a resources
+    	// dictionary associated with it, we use
+    	// it. Otherwise, we move back to its
+    	// parent object.
+        if (isset ($obj[1][1]['/Resources'])) {
+    		$res = $this->pdf_resolve_object($this->c, $obj[1][1]['/Resources']);
+    		if ($res[0] == PDF_TYPE_OBJECT)
+                return $res[1];
+            return $res;
+    	} else {
+    		if (!isset ($obj[1][1]['/Parent'])) {
+    			return false;
+    		} else {
+                $res = $this->_getPageResources($obj[1][1]['/Parent']);
+                if ($res[0] == PDF_TYPE_OBJECT)
+                    return $res[1];
+                return $res;
+    		}
+    	}
+    }
+
+
+    /**
+     * Get content of current page
+     *
+     * If more /Contents is an array, the streams are concated
+     *
+     * @return string
+     */
+    function getContent() {
+        $buffer = '';
+        
+        if (isset($this->pages[$this->pageno][1][1]['/Contents'])) {
+            $contents = $this->_getPageContent($this->pages[$this->pageno][1][1]['/Contents']);
+            foreach($contents AS $tmp_content) {
+                $buffer .= $this->_rebuildContentStream($tmp_content) . ' ';
+            }
+        }
+        
+        return $buffer;
+    }
+    
+    
+    /**
+     * Resolve all content-objects
+     *
+     * @param array $content_ref
+     * @return array
+     */
+    function _getPageContent($content_ref) {
+        $contents = array();
+        
+        if ($content_ref[0] == PDF_TYPE_OBJREF) {
+            $content = $this->pdf_resolve_object($this->c, $content_ref);
+            if ($content[1][0] == PDF_TYPE_ARRAY) {
+                $contents = $this->_getPageContent($content[1]);
+            } else {
+                $contents[] = $content;
+            }
+        } else if ($content_ref[0] == PDF_TYPE_ARRAY) {
+            foreach ($content_ref[1] AS $tmp_content_ref) {
+                $contents = array_merge($contents,$this->_getPageContent($tmp_content_ref));
+            }
+        }
+
+        return $contents;
+    }
+
+
+    /**
+     * Rebuild content-streams
+     *
+     * @param array $obj
+     * @return string
+     */
+    function _rebuildContentStream($obj) {
+        $filters = array();
+        
+        if (isset($obj[1][1]['/Filter'])) {
+            $_filter = $obj[1][1]['/Filter'];
+
+            if ($_filter[0] == PDF_TYPE_OBJREF) {
+                $tmpFilter = $this->pdf_resolve_object($this->c, $_filter);
+                $_filter = $tmpFilter[1];
+            }
+            
+            if ($_filter[0] == PDF_TYPE_TOKEN) {
+                $filters[] = $_filter;
+            } else if ($_filter[0] == PDF_TYPE_ARRAY) {
+                $filters = $_filter[1];
+            }
+        }
+
+        $stream = $obj[2][1];
+
+        foreach ($filters AS $_filter) {
+            switch ($_filter[1]) {
+                case '/FlateDecode':
+                	// $stream .= "\x0F\x0D"; // in an errorious stream this suffix could work
+                	if (function_exists('gzuncompress')) {
+                        $stream = (strlen($stream) > 0) ? @gzuncompress($stream) : '';
+                    } else {
+                        $this->error(sprintf('To handle %s filter, please compile php with zlib support.',$_filter[1]));
+                    }
+                    
+                    if ($stream === false) {
+                    	$this->error('Error while decompressing stream.');
+                    }
+                break;
+                case '/LZWDecode':
+                    include_once('filters/FilterLZW_FPDI.php');
+                    $decoder = new FilterLZW_FPDI($this->fpdi);
+                    $stream = $decoder->decode($stream);
+                    break;
+                case '/ASCII85Decode':
+                    include_once('filters/FilterASCII85_FPDI.php');
+                    $decoder = new FilterASCII85_FPDI($this->fpdi);
+                    $stream = $decoder->decode($stream);
+                    break;
+                case null:
+                    $stream = $stream;
+                break;
+                default:
+                    $this->error(sprintf('Unsupported Filter: %s',$_filter[1]));
+            }
+        }
+        
+        return $stream;
+    }
+    
+    
+    /**
+     * Get a Box from a page
+     * Arrayformat is same as used by fpdf_tpl
+     *
+     * @param array $page a /Page
+     * @param string $box_index Type of Box @see $availableBoxes
+     * @param float Scale factor from user space units to points
+     * @return array
+     */
+    function getPageBox($page, $box_index, $k) {
+        $page = $this->pdf_resolve_object($this->c, $page);
+        $box = null;
+        if (isset($page[1][1][$box_index]))
+            $box =& $page[1][1][$box_index];
+        
+        if (!is_null($box) && $box[0] == PDF_TYPE_OBJREF) {
+            $tmp_box = $this->pdf_resolve_object($this->c, $box);
+            $box = $tmp_box[1];
+        }
+            
+        if (!is_null($box) && $box[0] == PDF_TYPE_ARRAY) {
+            $b =& $box[1];
+            return array('x' => $b[0][1]/$k,
+                         'y' => $b[1][1]/$k,
+                         'w' => abs($b[0][1]-$b[2][1])/$k,
+                         'h' => abs($b[1][1]-$b[3][1])/$k,
+                         'llx' => min($b[0][1], $b[2][1])/$k,
+                         'lly' => min($b[1][1], $b[3][1])/$k,
+                         'urx' => max($b[0][1], $b[2][1])/$k,
+                         'ury' => max($b[1][1], $b[3][1])/$k,
+                         );
+        } else if (!isset ($page[1][1]['/Parent'])) {
+            return false;
+        } else {
+            return $this->getPageBox($this->pdf_resolve_object($this->c, $page[1][1]['/Parent']), $box_index, $k);
+        }
+    }
+
+    /**
+     * Get all page boxes by page no
+     * 
+     * @param int The page number
+     * @param float Scale factor from user space units to points
+     * @return array
+     */
+     function getPageBoxes($pageno, $k) {
+        return $this->_getPageBoxes($this->pages[$pageno-1], $k);
+    }
+    
+    /**
+     * Get all boxes from /Page
+     *
+     * @param array a /Page
+     * @return array
+     */
+    function _getPageBoxes($page, $k) {
+        $boxes = array();
+
+        foreach($this->availableBoxes AS $box) {
+            if ($_box = $this->getPageBox($page, $box, $k)) {
+                $boxes[$box] = $_box;
+            }
+        }
+
+        return $boxes;
+    }
+
+    /**
+     * Get the page rotation by pageno
+     *
+     * @param integer $pageno
+     * @return array
+     */
+    function getPageRotation($pageno) {
+        return $this->_getPageRotation($this->pages[$pageno-1]);
+    }
+    
+    function _getPageRotation($obj) { // $obj = /Page
+    	$obj = $this->pdf_resolve_object($this->c, $obj);
+    	if (isset ($obj[1][1]['/Rotate'])) {
+    		$res = $this->pdf_resolve_object($this->c, $obj[1][1]['/Rotate']);
+    		if ($res[0] == PDF_TYPE_OBJECT)
+                return $res[1];
+            return $res;
+    	} else {
+    		if (!isset ($obj[1][1]['/Parent'])) {
+    			return false;
+    		} else {
+                $res = $this->_getPageRotation($obj[1][1]['/Parent']);
+                if ($res[0] == PDF_TYPE_OBJECT)
+                    return $res[1];
+                return $res;
+    		}
+    	}
+    }
+    
+    /**
+     * Read all /Page(es)
+     *
+     * @param object pdf_context
+     * @param array /Pages
+     * @param array the result-array
+     */
+    function read_pages(&$c, &$pages, &$result) {
+        // Get the kids dictionary
+    	$_kids = $this->pdf_resolve_object ($c, $pages[1][1]['/Kids']);
+        
+        if (!is_array($_kids))
+            $this->error('Cannot find /Kids in current /Page-Dictionary');
+            
+        if ($_kids[1][0] == PDF_TYPE_ARRAY) {
+            $kids = $_kids[1][1];
+        } else {
+            $kids = $_kids[1];
+        }
+        
+        foreach ($kids as $v) {
+    		$pg = $this->pdf_resolve_object ($c, $v);
+            if ($pg[1][1]['/Type'][1] === '/Pages') {
+                // If one of the kids is an embedded
+    			// /Pages array, resolve it as well.
+                $this->read_pages($c, $pg, $result);
+    		} else {
+    			$result[] = $pg;
+    		}
+    	}
+    }
+
+    
+    
+    /**
+     * Get PDF-Version
+     *
+     * And reset the PDF Version used in FPDI if needed
+     */
+    function getPDFVersion() {
+        parent::getPDFVersion();
+        $this->fpdi->setPDFVersion(max($this->fpdi->getPDFVersion(), $this->pdfVersion));
+    }
+    
+}
\ No newline at end of file

$B%3%T!<$K$h$kDI2C(B: branches/version-2_5-dev/data/module/fpdf/japanese.php ($B%3%T!<85(B: $B%j%S%8%g%s(B 19715, branches/version-2_5-dev/data/pdf/japanese.php)
===================================================================
--- branches/version-2_5-dev/data/module/fpdf/japanese.php	                        (rev 0)
+++ branches/version-2_5-dev/data/module/fpdf/japanese.php	2010-12-11 03:15:20 UTC (rev 19716)
@@ -0,0 +1,537 @@
+<?php
+require('fpdi.php');
+
+$SJIS_widths=array(' '=>278,'!'=>299,'"'=>353,'#'=>614,'$'=>614,'%'=>721,'&'=>735,'\''=>216,
+    '('=>323,')'=>323,'*'=>449,'+'=>529,','=>219,'-'=>306,'.'=>219,'/'=>453,'0'=>614,'1'=>614,
+    '2'=>614,'3'=>614,'4'=>614,'5'=>614,'6'=>614,'7'=>614,'8'=>614,'9'=>614,':'=>219,';'=>219,
+    '<'=>529,'='=>529,'>'=>529,'?'=>486,'@'=>744,'A'=>646,'B'=>604,'C'=>617,'D'=>681,'E'=>567,
+    'F'=>537,'G'=>647,'H'=>738,'I'=>320,'J'=>433,'K'=>637,'L'=>566,'M'=>904,'N'=>710,'O'=>716,
+    'P'=>605,'Q'=>716,'R'=>623,'S'=>517,'T'=>601,'U'=>690,'V'=>668,'W'=>990,'X'=>681,'Y'=>634,
+    'Z'=>578,'['=>316,'\\'=>614,']'=>316,'^'=>529,'_'=>500,'`'=>387,'a'=>509,'b'=>566,'c'=>478,
+    'd'=>565,'e'=>503,'f'=>337,'g'=>549,'h'=>580,'i'=>275,'j'=>266,'k'=>544,'l'=>276,'m'=>854,
+    'n'=>579,'o'=>550,'p'=>578,'q'=>566,'r'=>410,'s'=>444,'t'=>340,'u'=>575,'v'=>512,'w'=>760,
+    'x'=>503,'y'=>529,'z'=>453,'{'=>326,'|'=>380,'}'=>326,'~'=>387);
+
+class PDF_Japanese extends FPDI
+{
+function AddCIDFont($family,$style,$name,$cw,$CMap,$registry)
+{
+    $fontkey=strtolower($family).strtoupper($style);
+    if(isset($this->fonts[$fontkey]))
+        $this->Error("CID font already added: $family $style");
+    $i=count($this->fonts)+1;
+    $this->fonts[$fontkey]=array('i'=>$i,'type'=>'Type0','name'=>$name,'up'=>-120,'ut'=>40,'cw'=>$cw,'CMap'=>$CMap,'registry'=>$registry);
+}
+
+function AddCIDFonts($family,$name,$cw,$CMap,$registry)
+{
+    $this->AddCIDFont($family,'',$name,$cw,$CMap,$registry);
+    $this->AddCIDFont($family,'B',$name.',Bold',$cw,$CMap,$registry);
+    $this->AddCIDFont($family,'I',$name.',Italic',$cw,$CMap,$registry);
+    $this->AddCIDFont($family,'BI',$name.',BoldItalic',$cw,$CMap,$registry);
+}
+
+function AddSJISFont($family='SJIS')
+{
+    //Add SJIS font with proportional Latin
+    $name='KozMinPro-Regular-Acro';
+    //$name='Gothic'; // $BJQ99(B
+    $cw=$GLOBALS['SJIS_widths'];
+    $CMap='90msp-RKSJ-H';
+    $registry=array('ordering'=>'Japan1','supplement'=>2);
+    $this->AddCIDFonts($family,$name,$cw,$CMap,$registry);
+}
+
+function AddSJIShwFont($family='SJIS-hw')
+{
+    //Add SJIS font with half-width Latin
+    $name='KozMinPro-Regular-Acro';
+    for($i=32;$i<=126;$i++)
+        $cw[chr($i)]=500;
+    $CMap='90ms-RKSJ-H';
+    $registry=array('ordering'=>'Japan1','supplement'=>2);
+    $this->AddCIDFonts($family,$name,$cw,$CMap,$registry);
+}
+
+function GetStringWidth($s)
+{
+    if($this->CurrentFont['type']=='Type0')
+        return $this->GetSJISStringWidth($s);
+    else
+        return parent::GetStringWidth($s);
+}
+
+function GetSJISStringWidth($s)
+{
+    //SJIS version of GetStringWidth()
+    $l=0;
+    $cw=&$this->CurrentFont['cw'];
+    $nb=strlen($s);
+    $i=0;
+    while($i<$nb)
+    {
+        $o=ord($s{$i});
+        if($o<128)
+        {
+            //ASCII
+            $l+=$cw[$s{$i}];
+            $i++;
+        }
+        elseif($o>=161 and $o<=223)
+        {
+            //Half-width katakana
+            $l+=500;
+            $i++;
+        }
+        else
+        {
+            //Full-width character
+            $l+=1000;
+            $i+=2;
+        }
+    }
+    return $l*$this->FontSize/1000;
+}
+
+function MultiCell($w,$h,$txt,$border=0,$align='L',$fill=0,$ln=2)
+{
+    if($this->CurrentFont['type']=='Type0')
+        $this->SJISMultiCell($w,$h,$txt,$border,$align,$fill,$ln);
+    else
+        parent::MultiCell($w,$h,$txt,$border,$align,$fill,$ln);
+}
+
+function SJISMultiCell($w,$h,$txt,$border=0,$align='L',$fill=0,$ln=2)
+{
+    //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 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;
+    $nl=1;
+    $this->rise_h = 0; //$B9b$57W;;MQ(B
+
+    while($i<$nb)
+    {
+        //Get next character
+        $c=$s{$i};
+        $o=ord($c);
+        if($o==10)
+        {
+            //Explicit line break
+            $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill);
+            $i++;
+            $sep=-1;
+            $j=$i;
+            $l=0;
+            $nl++;
+            $this->rise_h += $h; //$B9b$57W;;MQ(B
+            if($border and $nl==2)
+                $b=$b2;
+            continue;
+        }
+        if($o<128)
+        {
+            //ASCII
+            $l+=$cw[$c];
+            $n=1;
+            if($o==32)
+                $sep=$i;
+        }
+        elseif($o>=161 and $o<=223)
+        {
+            //Half-width katakana
+            $l+=500;
+            $n=1;
+            $sep=$i;
+        }
+        else
+        {
+            //Full-width character
+            $l+=1000;
+            $n=2;
+            $sep=$i;
+        }
+        if($l>$wmax)
+        {
+            //Automatic line break
+            if($sep==-1 or $i==$j)
+            {
+                if($i==$j)
+                    $i+=$n;
+                $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill);
+            }
+            else
+            {
+                $this->Cell($w,$h,substr($s,$j,$sep-$j),$b,2,$align,$fill);
+                $i=($s[$sep]==' ') ? $sep+1 : $sep;
+            }
+            $this->rise_h += $h; //$B9b$57W;;MQ(B
+            $sep=-1;
+            $j=$i;
+            $l=0;
+            $nl++;
+            if($border and $nl==2)
+                $b=$b2;
+        }
+        else
+        {
+            $i+=$n;
+            if($o>=128)
+                $sep=$i;
+        }
+    }
+    //Last chunk
+    if($border and is_int(strpos($border,'B')))
+        $b.='B';
+    $this->Cell($w,$h,substr($s,$j,$i-$j),$b,$ln,$align,$fill);
+    $this->rise_h += $h; //$BA}2CJ,$N9b$5$r7W;;(B
+    //$B2~9T$J$7 @ _Dj$+$D!"9b$5$,5,Dj$N9b$50J>e$G$"$l$P(BY$B<4$r @ _Dj$7$J$*$9!#(B
+    if($ln == 0 and $h < $this->rise_h) {
+      $this->y = $this->y - $this->rise_h + $h;
+    }
+
+    //$this->x=$this->lMargin;
+}
+
+function Write($h,$txt,$link='')
+{
+    if($this->CurrentFont['type']=='Type0')
+        $this->SJISWrite($h,$txt,$link);
+    else
+        parent::Write($h,$txt,$link);
+}
+
+function SJISWrite($h,$txt,$link)
+{
+    //SJIS version of Write()
+    $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};
+        $o=ord($c);
+        if($o==10)
+        {
+            //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)
+            {
+                //Go to left margin
+                $this->x=$this->lMargin;
+                $w=$this->w-$this->rMargin-$this->x;
+                $wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
+            }
+            $nl++;
+            continue;
+        }
+        if($o<128)
+        {
+            //ASCII
+            $l+=$cw[$c];
+            $n=1;
+            if($o==32)
+                $sep=$i;
+        }
+        elseif($o>=161 and $o<=223)
+        {
+            //Half-width katakana
+            $l+=500;
+            $n=1;
+            $sep=$i;
+        }
+        else
+        {
+            //Full-width character
+            $l+=1000;
+            $n=2;
+            $sep=$i;
+        }
+        if($l>$wmax)
+        {
+            //Automatic line break
+            if($sep==-1 or $i==$j)
+            {
+                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+=$n;
+                    $nl++;
+                    continue;
+                }
+                if($i==$j)
+                    $i+=$n;
+                $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=($s[$sep]==' ') ? $sep+1 : $sep;
+            }
+            $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+=$n;
+            if($o>=128)
+                $sep=$i;
+        }
+    }
+    //Last chunk
+    if($i!=$j)
+        $this->Cell($l/1000*$this->FontSize,$h,substr($s,$j,$i-$j),0,0,'',0,$link);
+}
+
+function _putfonts()
+{
+    $nf=$this->n;
+    foreach($this->diffs as $diff)
+    {
+        //Encodings
+        $this->_newobj();
+        $this->_out('<</Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences ['.$diff.']>>');
+        $this->_out('endobj');
+    }
+    $mqr=get_magic_quotes_runtime();
+    set_magic_quotes_runtime(0);
+    foreach($this->FontFiles as $file=>$info)
+    {
+        //Font file embedding
+        $this->_newobj();
+        $this->FontFiles[$file]['n']=$this->n;
+        if(defined('FPDF_FONTPATH'))
+            $file=FPDF_FONTPATH.$file;
+        $size=filesize($file);
+        if(!$size)
+            $this->Error('Font file not found');
+        $this->_out('<</Length '.$size);
+        if(substr($file,-2)=='.z')
+            $this->_out('/Filter /FlateDecode');
+        $this->_out('/Length1 '.$info['length1']);
+        if(isset($info['length2']))
+            $this->_out('/Length2 '.$info['length2'].' /Length3 0');
+        $this->_out('>>');
+        $f=fopen($file,'rb');
+        $this->_putstream(fread($f,$size));
+        fclose($f);
+        $this->_out('endobj');
+    }
+    set_magic_quotes_runtime($mqr);
+    foreach($this->fonts as $k=>$font)
+    {
+        //Font objects
+        $this->_newobj();
+        $this->fonts[$k]['n']=$this->n;
+        $this->_out('<</Type /Font');
+        if($font['type']=='Type0')
+            $this->_putType0($font);
+        else
+        {
+            $name=$font['name'];
+            $this->_out('/BaseFont /'.$name);
+            if($font['type']=='core')
+            {
+                //Standard font
+                $this->_out('/Subtype /Type1');
+                if($name!='Symbol' and $name!='ZapfDingbats')
+                    $this->_out('/Encoding /WinAnsiEncoding');
+            }
+            else
+            {
+                //Additional font
+                $this->_out('/Subtype /'.$font['type']);
+                $this->_out('/FirstChar 32');
+                $this->_out('/LastChar 255');
+                $this->_out('/Widths '.($this->n+1).' 0 R');
+                $this->_out('/FontDescriptor '.($this->n+2).' 0 R');
+                if($font['enc'])
+                {
+                    if(isset($font['diff']))
+                        $this->_out('/Encoding '.($nf+$font['diff']).' 0 R');
+                    else
+                        $this->_out('/Encoding /WinAnsiEncoding');
+                }
+            }
+            $this->_out('>>');
+            $this->_out('endobj');
+            if($font['type']!='core')
+            {
+                //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='<</Type /FontDescriptor /FontName /'.$name;
+                foreach($font['desc'] as $k=>$v)
+                    $s.=' /'.$k.' '.$v;
+                $file=$font['file'];
+                if($file)
+                    $s.=' /FontFile'.($font['type']=='Type1' ? '' : '2').' '.$this->FontFiles[$file]['n'].' 0 R';
+                $this->_out($s.'>>');
+                $this->_out('endobj');
+            }
+        }
+    }
+}
+
+function _putType0($font)
+{
+    //Type0
+    $this->_out('/Subtype /Type0');
+    $this->_out('/BaseFont /'.$font['name'].'-'.$font['CMap']);
+    $this->_out('/Encoding /'.$font['CMap']);
+    $this->_out('/DescendantFonts ['.($this->n+1).' 0 R]');
+    $this->_out('>>');
+    $this->_out('endobj');
+    //CIDFont
+    $this->_newobj();
+    $this->_out('<</Type /Font');
+    $this->_out('/Subtype /CIDFontType0');
+    $this->_out('/BaseFont /'.$font['name']);
+    $this->_out('/CIDSystemInfo <</Registry (Adobe) /Ordering ('.$font['registry']['ordering'].') /Supplement '.$font['registry']['supplement'].'>>');
+    $this->_out('/FontDescriptor '.($this->n+1).' 0 R');
+    $W='/W [1 [';
+    foreach($font['cw'] as $w)
+        $W.=$w.' ';
+    $this->_out($W.'] 231 325 500 631 [500] 326 389 500]');
+    $this->_out('>>');
+    $this->_out('endobj');
+    //Font descriptor
+    $this->_newobj();
+    $this->_out('<</Type /FontDescriptor');
+    $this->_out('/FontName /'.$font['name']);
+    $this->_out('/Flags 6');
+    $this->_out('/FontBBox [0 -200 1000 900]');
+    $this->_out('/ItalicAngle 0');
+    $this->_out('/Ascent 800');
+    $this->_out('/Descent -200');
+    $this->_out('/CapHeight 800');
+    $this->_out('/StemV 60');
+    $this->_out('>>');
+    $this->_out('endobj');
+}
+
+//Load data
+function LoadData($file)
+{
+    //Read file lines
+    $lines=file($file);
+    $data=array();
+    foreach($lines as $line)
+        $data[]=explode(';',chop($line));
+    return $data;
+}
+
+//Colored table
+function FancyTable($header,$data,$w)
+{
+    //Colors, line width and bold font
+    $this->SetFillColor(216,216,216);
+    $this->SetTextColor(0);
+    $this->SetDrawColor(0,0,0);
+    $this->SetLineWidth(.3);
+    $this->SetFont('','B');
+    //Header
+    for($i=0;$i<count($header);$i++)
+        $this->Cell($w[$i],7,$header[$i],1,0,'C',1);
+    $this->Ln();
+    //Color and font restoration
+    $this->SetFillColor(235,235,235);
+    $this->SetTextColor(0);
+    $this->SetFont('');
+    //Data
+    $fill=0;
+    foreach($data as $row)
+    {
+    $h = 4;
+    $i = 0;
+    $this->Cell(5, $h, '', 0, 0, '', 0, '');
+    foreach($row as $col) {
+        if($i > 3) { $i = 0; }
+        if ($i != 0) {
+            //$this->MultiCell($w[$i],$h,number_format($col),1,'R',$fill, 0);
+            $this->MultiCell($w[$i],$h,$col,1,'R',$fill, 0);
+        } else {
+            $this->MultiCell($w[$i],$h,$col,1,'L',$fill, 0);
+        }
+        $h = $this->rise_h;
+        $i++;
+    }
+    $this->Ln();
+        $fill=!$fill;
+
+    }
+    $this->Cell(5, $h, '', 0, 0, '', 0, '');
+    $this->Cell(array_sum($w),0,'','T');
+}
+
+function Footer()
+{
+    //$B2<C<$+$i(B1.5 cm $B$K0\F0(B
+    $this->SetY(-15);
+    //$B%U%)%s%H$r @ _Dj!#(B Arial italic 8
+    $this->SetFont('Arial','I',8);
+    //$B8=:_$N%Z!<%8HV9f$HAm%Z!<%8?t$r=PNO(B
+    #$this->Cell(0,10,''.$this->PageNo().' / {nb}',0,0,'C');
+}
+
+}
+?>

$Beb%&ecHe&>ea%)eb0e#kpA%9ij(B branches/version-2_5-dev/data/module/fpdf/pdf_context.php ($B%3%T!<85(B: $B%j%S%8%g%s(B 19715, branches/version-2_5-dev/data/pdf/pdf_context.php)
===================================================================
--- branches/version-2_5-dev/data/module/fpdf/pdf_context.php	                        (rev 0)
+++ branches/version-2_5-dev/data/module/fpdf/pdf_context.php	2010-12-11 03:15:20 UTC (rev 19716)
@@ -0,0 +1,100 @@
+<?php
+//
+//  FPDI - Version 1.4
+//
+//    Copyright 2004-2010 Setasign - Jan Slabon
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+if (!class_exists('pdf_context', false)) {
+    
+    class pdf_context {
+    
+        /**
+         * Modi
+         *
+         * @var integer 0 = file | 1 = string
+         */
+        var $_mode = 0;
+        
+    	var $file;
+    	var $buffer;
+    	var $offset;
+    	var $length;
+    
+    	var $stack;
+    
+    	// Constructor
+    
+    	function pdf_context(&$f) {
+    		$this->file =& $f;
+    		if (is_string($this->file))
+    		    $this->_mode = 1;
+    		$this->reset();
+    	}
+    
+    	// Optionally move the file
+    	// pointer to a new location
+    	// and reset the buffered data
+    
+    	function reset($pos = null, $l = 100) {
+    	    if ($this->_mode == 0) {
+            	if (!is_null ($pos)) {
+        			fseek ($this->file, $pos);
+        		}
+        
+        		$this->buffer = $l > 0 ? fread($this->file, $l) : '';
+        		$this->length = strlen($this->buffer);
+        		if ($this->length < $l)
+                    $this->increase_length($l - $this->length);
+    	    } else {
+    	        $this->buffer = $this->file;
+    	        $this->length = strlen($this->buffer);
+    	    }
+    		$this->offset = 0;
+    		$this->stack = array();
+    	}
+    
+    	// Make sure that there is at least one
+    	// character beyond the current offset in
+    	// the buffer to prevent the tokenizer
+    	// from attempting to access data that does
+    	// not exist
+    
+    	function ensure_content() {
+    		if ($this->offset >= $this->length - 1) {
+    			return $this->increase_length();
+    		} else {
+    			return true;
+    		}
+    	}
+    
+    	// Forcefully read more data into the buffer
+    
+    	function increase_length($l = 100) {
+    		if ($this->_mode == 0 && feof($this->file)) {
+    			return false;
+    		} else if ($this->_mode == 0) {
+    		    $totalLength = $this->length + $l;
+    		    do {
+                    $this->buffer .= fread($this->file, $totalLength-$this->length);
+                } while ((($this->length = strlen($this->buffer)) != $totalLength) && !feof($this->file));
+    			
+    			return true;
+    		} else {
+    	        return false;
+    		}
+    	}
+    }
+}
\ No newline at end of file

$B%3%T!<$K$h$kDI2C(B: branches/version-2_5-dev/data/module/fpdf/pdf_parser.php ($B%3%T!<85(B: $B%j%S%8%g%s(B 19715, branches/version-2_5-dev/data/pdf/pdf_parser.php)
===================================================================
--- branches/version-2_5-dev/data/module/fpdf/pdf_parser.php	                        (rev 0)
+++ branches/version-2_5-dev/data/module/fpdf/pdf_parser.php	2010-12-11 03:15:20 UTC (rev 19716)
@@ -0,0 +1,719 @@
+<?php
+//
+//  FPDI - Version 1.4
+//
+//    Copyright 2004-2010 Setasign - Jan Slabon
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+
+if (!defined ('PDF_TYPE_NULL'))
+    define ('PDF_TYPE_NULL', 0);
+if (!defined ('PDF_TYPE_NUMERIC'))
+    define ('PDF_TYPE_NUMERIC', 1);
+if (!defined ('PDF_TYPE_TOKEN'))
+    define ('PDF_TYPE_TOKEN', 2);
+if (!defined ('PDF_TYPE_HEX'))
+    define ('PDF_TYPE_HEX', 3);
+if (!defined ('PDF_TYPE_STRING'))
+    define ('PDF_TYPE_STRING', 4);
+if (!defined ('PDF_TYPE_DICTIONARY'))
+    define ('PDF_TYPE_DICTIONARY', 5);
+if (!defined ('PDF_TYPE_ARRAY'))
+    define ('PDF_TYPE_ARRAY', 6);
+if (!defined ('PDF_TYPE_OBJDEC'))
+    define ('PDF_TYPE_OBJDEC', 7);
+if (!defined ('PDF_TYPE_OBJREF'))
+    define ('PDF_TYPE_OBJREF', 8);
+if (!defined ('PDF_TYPE_OBJECT'))
+    define ('PDF_TYPE_OBJECT', 9);
+if (!defined ('PDF_TYPE_STREAM'))
+    define ('PDF_TYPE_STREAM', 10);
+if (!defined ('PDF_TYPE_BOOLEAN'))
+    define ('PDF_TYPE_BOOLEAN', 11);
+if (!defined ('PDF_TYPE_REAL'))
+    define ('PDF_TYPE_REAL', 12);
+    
+require_once('pdf_context.php');
+
+if (!class_exists('pdf_parser', false)) {
+    
+    class pdf_parser {
+    	
+    	/**
+         * Filename
+         * @var string
+         */
+        var $filename;
+        
+        /**
+         * File resource
+         * @var resource
+         */
+        var $f;
+        
+        /**
+         * PDF Context
+         * @var object pdf_context-Instance
+         */
+        var $c;
+        
+        /**
+         * xref-Data
+         * @var array
+         */
+        var $xref;
+    
+        /**
+         * root-Object
+         * @var array
+         */
+        var $root;
+    	
+        /**
+         * PDF version of the loaded document
+         * @var string
+         */
+        var $pdfVersion;
+        
+        /**
+	     * For reading encrypted documents and xref/objectstreams are in use
+	     *
+	     * @var boolean
+	     */
+	    var $readPlain = true;
+	    
+        /**
+         * Constructor
+         *
+         * @param string $filename  Source-Filename
+         */
+    	function pdf_parser($filename) {
+            $this->filename = $filename;
+            
+            $this->f = @fopen($this->filename, 'rb');
+    
+            if (!$this->f)
+                $this->error(sprintf('Cannot open %s !', $filename));
+    
+            $this->getPDFVersion();
+    
+            $this->c = new pdf_context($this->f);
+            
+            // Read xref-Data
+            $this->xref = array();
+            $this->pdf_read_xref($this->xref, $this->pdf_find_xref());
+            
+            // Check for Encryption
+            $this->getEncryption();
+    
+            // Read root
+            $this->pdf_read_root();
+        }
+        
+        /**
+         * Close the opened file
+         */
+        function closeFile() {
+        	if (isset($this->f) && is_resource($this->f)) {
+        	    fclose($this->f);	
+        		unset($this->f);
+        	}	
+        }
+        
+        /**
+         * Print Error and die
+         *
+         * @param string $msg  Error-Message
+         */
+        function error($msg) {
+        	die('<b>PDF-Parser Error:</b> '.$msg);	
+        }
+        
+        /**
+         * Check Trailer for Encryption
+         */
+        function getEncryption() {
+            if (isset($this->xref['trailer'][1]['/Encrypt'])) {
+            	$this->error('File is encrypted!');
+            }
+        }
+        
+    	/**
+         * Find/Return /Root
+         *
+         * @return array
+         */
+        function pdf_find_root() {
+            if ($this->xref['trailer'][1]['/Root'][0] != PDF_TYPE_OBJREF) {
+                $this->error('Wrong Type of Root-Element! Must be an indirect reference');
+            }
+            
+            return $this->xref['trailer'][1]['/Root'];
+        }
+    
+        /**
+         * Read the /Root
+         */
+        function pdf_read_root() {
+            // read root
+            $this->root = $this->pdf_resolve_object($this->c, $this->pdf_find_root());
+        }
+        
+        /**
+         * Get PDF-Version
+         *
+         * And reset the PDF Version used in FPDI if needed
+         */
+        function getPDFVersion() {
+            fseek($this->f, 0);
+            preg_match('/\d\.\d/',fread($this->f,16),$m);
+            if (isset($m[0]))
+                $this->pdfVersion = $m[0];
+            return $this->pdfVersion;
+        }
+        
+        /**
+         * Find the xref-Table
+         */
+        function pdf_find_xref() {
+           	$toRead = 1500;
+                    
+            $stat = fseek ($this->f, -$toRead, SEEK_END);
+            if ($stat === -1) {
+                fseek ($this->f, 0);
+            }
+           	$data = fread($this->f, $toRead);
+            
+            $pos = strlen($data) - strpos(strrev($data), strrev('startxref')); 
+            $data = substr($data, $pos);
+            
+            if (!preg_match('/\s*(\d+).*$/s', $data, $matches)) {
+                $this->error('Unable to find pointer to xref table');
+        	}
+    
+        	return (int) $matches[1];
+        }
+    
+        /**
+         * Read xref-table
+         *
+         * @param array $result Array of xref-table
+         * @param integer $offset of xref-table
+         */
+        function pdf_read_xref(&$result, $offset) {
+            $o_pos = $offset-min(20, $offset);
+        	fseek($this->f, $o_pos); // set some bytes backwards to fetch errorious docs
+                
+            $data = fread($this->f, 100);
+            
+            $xrefPos = strrpos($data, 'xref');
+    
+            if ($xrefPos === false) {
+                fseek($this->f, $offset);
+                $c = new pdf_context($this->f);
+                $xrefStreamObjDec = $this->pdf_read_value($c);
+                
+                if (is_array($xrefStreamObjDec) && isset($xrefStreamObjDec[0]) && $xrefStreamObjDec[0] == PDF_TYPE_OBJDEC) {
+                    $this->error(sprintf('This document (%s) probably uses a compression technique which is not supported by the free parser shipped with FPDI.', $this->filename));
+                } else {            
+                    $this->error('Unable to find xref table.');
+                }
+            }
+            
+            if (!isset($result['xref_location'])) {
+                $result['xref_location'] = $o_pos+$xrefPos;
+                $result['max_object'] = 0;
+        	}
+    
+        	$cylces = -1;
+            $bytesPerCycle = 100;
+            
+        	fseek($this->f, $o_pos = $o_pos+$xrefPos+4); // set the handle directly after the "xref"-keyword
+            $data = fread($this->f, $bytesPerCycle);
+            
+            while (($trailerPos = strpos($data, 'trailer', max($bytesPerCycle*$cylces++, 0))) === false && !feof($this->f)) {
+                $data .= fread($this->f, $bytesPerCycle);
+            }
+            
+            if ($trailerPos === false) {
+                $this->error('Trailer keyword not found after xref table');
+            }
+            
+            $data = substr($data, 0, $trailerPos);
+            
+            // get Line-Ending
+            preg_match_all("/(\r\n|\n|\r)/", substr($data, 0, 100), $m); // check the first 100 bytes for linebreaks
+    
+            $differentLineEndings = count(array_unique($m[0]));
+            if ($differentLineEndings > 1) {
+                $lines = preg_split("/(\r\n|\n|\r)/", $data, -1, PREG_SPLIT_NO_EMPTY);
+            } else {
+                $lines = explode($m[0][1], $data);
+            }
+            
+            $data = $differentLineEndings = $m = null;
+            unset($data, $differentLineEndings, $m);
+            
+            $linesCount = count($lines);
+            
+            $start = 1;
+            
+            for ($i = 0; $i < $linesCount; $i++) {
+                $line = trim($lines[$i]);
+                if ($line) {
+                    $pieces = explode(' ', $line);
+                    $c = count($pieces);
+                    switch($c) {
+                        case 2:
+                            $start = (int)$pieces[0];
+                            $end   = $start+(int)$pieces[1];
+                            if ($end > $result['max_object'])
+                                $result['max_object'] = $end;
+                            break;
+                        case 3:
+                            if (!isset($result['xref'][$start]))
+                                $result['xref'][$start] = array();
+                            
+                            if (!array_key_exists($gen = (int) $pieces[1], $result['xref'][$start])) {
+                    	        $result['xref'][$start][$gen] = $pieces[2] == 'n' ? (int) $pieces[0] : null;
+                    	    }
+                            $start++;
+                            break;
+                        default:
+                            $this->error('Unexpected data in xref table');
+                    }
+                }
+            }
+            
+            $lines = $pieces = $line = $start = $end = $gen = null;
+            unset($lines, $pieces, $line, $start, $end, $gen);
+            
+            fseek($this->f, $o_pos+$trailerPos+7);
+            
+            $c = new pdf_context($this->f);
+    	    $trailer = $this->pdf_read_value($c);
+    	    
+    	    $c = null;
+    	    unset($c);
+    	    
+    	    if (!isset($result['trailer'])) {
+                $result['trailer'] = $trailer;          
+    	    }
+    	    
+    	    if (isset($trailer[1]['/Prev'])) {
+    	        $this->pdf_read_xref($result, $trailer[1]['/Prev'][1]);
+    	    } 
+    	    
+    	    $trailer = null;
+    	    unset($trailer);
+            
+            return true;
+        }
+        
+        /**
+         * Reads an Value
+         *
+         * @param object $c pdf_context
+         * @param string $token a Token
+         * @return mixed
+         */
+        function pdf_read_value(&$c, $token = null) {
+        	if (is_null($token)) {
+        	    $token = $this->pdf_read_token($c);
+        	}
+        	
+            if ($token === false) {
+        	    return false;
+        	}
+    
+        	switch ($token) {
+                case	'<':
+        			// This is a hex string.
+        			// Read the value, then the terminator
+    
+                    $pos = $c->offset;
+    
+        			while(1) {
+    
+                        $match = strpos ($c->buffer, '>', $pos);
+    				
+        				// If you can't find it, try
+        				// reading more data from the stream
+    
+        				if ($match === false) {
+        					if (!$c->increase_length()) {
+        						return false;
+        					} else {
+                            	continue;
+                        	}
+        				}
+    
+        				$result = substr ($c->buffer, $c->offset, $match - $c->offset);
+        				$c->offset = $match + 1;
+        				
+        				return array (PDF_TYPE_HEX, $result);
+                    }
+                    
+                    break;
+        		case	'<<':
+        			// This is a dictionary.
+    
+        			$result = array();
+    
+        			// Recurse into this function until we reach
+        			// the end of the dictionary.
+        			while (($key = $this->pdf_read_token($c)) !== '>>') {
+        				if ($key === false) {
+        					return false;
+        				}
+        				
+        				if (($value =   $this->pdf_read_value($c)) === false) {
+        					return false;
+        				}
+        				
+        				// Catch missing value
+        				if ($value[0] == PDF_TYPE_TOKEN && $value[1] == '>>') {
+        				    $result[$key] = array(PDF_TYPE_NULL);
+        				    break;
+        				}
+        				
+        				$result[$key] = $value;
+        			}
+    				
+        			return array (PDF_TYPE_DICTIONARY, $result);
+    
+        		case	'[':
+        			// This is an array.
+    
+        			$result = array();
+    
+        			// Recurse into this function until we reach
+        			// the end of the array.
+        			while (($token = $this->pdf_read_token($c)) !== ']') {
+                        if ($token === false) {
+        					return false;
+        				}
+    					
+        				if (($value = $this->pdf_read_value($c, $token)) === false) {
+                            return false;
+        				}
+    					
+        				$result[] = $value;
+        			}
+        			
+                    return array (PDF_TYPE_ARRAY, $result);
+    
+        		case	'('		:
+                    // This is a string
+                    $pos = $c->offset;
+                    
+                    $openBrackets = 1;
+        			do {
+                        for (; $openBrackets != 0 && $pos < $c->length; $pos++) {
+                            switch (ord($c->buffer[$pos])) {
+                                case 0x28: // '('
+                                    $openBrackets++;
+                                    break;
+                                case 0x29: // ')'
+                                    $openBrackets--;
+                                    break;
+                                case 0x5C: // backslash
+                                    $pos++;
+                            }
+                        }
+        			} while($openBrackets != 0 && $c->increase_length());
+        			
+        			$result = substr($c->buffer, $c->offset, $pos - $c->offset - 1);
+        			$c->offset = $pos;
+        			
+        			return array (PDF_TYPE_STRING, $result);
+    
+                case 'stream':
+                	$o_pos = ftell($c->file)-strlen($c->buffer);
+    		        $o_offset = $c->offset;
+    		        
+    		        $c->reset($startpos = $o_pos + $o_offset);
+    		        
+    		        $e = 0; // ensure line breaks in front of the stream
+    		        if ($c->buffer[0] == chr(10) || $c->buffer[0] == chr(13))
+    		        	$e++;
+    		        if ($c->buffer[1] == chr(10) && $c->buffer[0] != chr(10))
+    		        	$e++;
+    		        
+    		        if ($this->actual_obj[1][1]['/Length'][0] == PDF_TYPE_OBJREF) {
+    		        	$tmp_c = new pdf_context($this->f);
+    		        	$tmp_length = $this->pdf_resolve_object($tmp_c, $this->actual_obj[1][1]['/Length']);
+    		        	$length = $tmp_length[1][1];
+    		        } else {
+    		        	$length = $this->actual_obj[1][1]['/Length'][1];	
+    		        }
+    		        	
+    		        if ($length > 0) {
+        		        $c->reset($startpos+$e,$length);
+        		        $v = $c->buffer;
+    		        } else {
+    		            $v = '';   
+    		        }
+    		        $c->reset($startpos+$e+$length+9); // 9 = strlen("endstream")
+    		        
+    		        return array(PDF_TYPE_STREAM, $v);
+    		        
+    	        default	:
+                	if (is_numeric ($token)) {
+                        // A numeric token. Make sure that
+        				// it is not part of something else.
+        				if (($tok2 = $this->pdf_read_token ($c)) !== false) {
+                            if (is_numeric ($tok2)) {
+    
+        						// Two numeric tokens in a row.
+        						// In this case, we're probably in
+        						// front of either an object reference
+        						// or an object specification.
+        						// Determine the case and return the data
+        						if (($tok3 = $this->pdf_read_token ($c)) !== false) {
+                                    switch ($tok3) {
+        								case	'obj'	:
+                                            return array (PDF_TYPE_OBJDEC, (int) $token, (int) $tok2);
+        								case	'R'		:
+        									return array (PDF_TYPE_OBJREF, (int) $token, (int) $tok2);
+        							}
+        							// If we get to this point, that numeric value up
+        							// there was just a numeric value. Push the extra
+        							// tokens back into the stack and return the value.
+        							array_push ($c->stack, $tok3);
+        						}
+        					}
+    
+        					array_push ($c->stack, $tok2);
+        				}
+    
+        				if ($token === (string)((int)$token))
+            				return array (PDF_TYPE_NUMERIC, (int)$token);
+        				else 
+        					return array (PDF_TYPE_REAL, (float)$token);
+        			} else if ($token == 'true' || $token == 'false') {
+                        return array (PDF_TYPE_BOOLEAN, $token == 'true');
+        			} else if ($token == 'null') {
+        			   return array (PDF_TYPE_NULL);
+        			} else {
+                        // Just a token. Return it.
+        				return array (PDF_TYPE_TOKEN, $token);
+        			}
+             }
+        }
+        
+        /**
+         * Resolve an object
+         *
+         * @param object $c pdf_context
+         * @param array $obj_spec The object-data
+         * @param boolean $encapsulate Must set to true, cause the parsing and fpdi use this method only without this para
+         */
+        function pdf_resolve_object(&$c, $obj_spec, $encapsulate = true) {
+            // Exit if we get invalid data
+        	if (!is_array($obj_spec)) {
+                $ret = false;
+        	    return $ret;
+        	}
+    
+        	if ($obj_spec[0] == PDF_TYPE_OBJREF) {
+    
+        		// This is a reference, resolve it
+        		if (isset($this->xref['xref'][$obj_spec[1]][$obj_spec[2]])) {
+    
+        			// Save current file position
+        			// This is needed if you want to resolve
+        			// references while you're reading another object
+        			// (e.g.: if you need to determine the length
+        			// of a stream)
+    
+        			$old_pos = ftell($c->file);
+    
+        			// Reposition the file pointer and
+        			// load the object header.
+    				
+        			$c->reset($this->xref['xref'][$obj_spec[1]][$obj_spec[2]]);
+    
+        			$header = $this->pdf_read_value($c);
+    
+        			if ($header[0] != PDF_TYPE_OBJDEC || $header[1] != $obj_spec[1] || $header[2] != $obj_spec[2]) {
+        				$toSearchFor = $obj_spec[1].' '.$obj_spec[2].' obj';
+        				if (preg_match('/'.$toSearchFor.'/', $c->buffer)) {
+        					$c->offset = strpos($c->buffer, $toSearchFor) + strlen($toSearchFor);
+        					// reset stack
+        					$c->stack = array();
+        				} else {
+	        				$this->error("Unable to find object ({$obj_spec[1]}, {$obj_spec[2]}) at expected location");
+        				}
+        			}
+    
+        			// If we're being asked to store all the information
+        			// about the object, we add the object ID and generation
+        			// number for later use
+    				$result = array();
+    				$this->actual_obj =& $result;
+        			if ($encapsulate) {
+        				$result = array (
+        					PDF_TYPE_OBJECT,
+        					'obj' => $obj_spec[1],
+        					'gen' => $obj_spec[2]
+        				);
+        			} 
+    
+        			// Now simply read the object data until
+        			// we encounter an end-of-object marker
+        			while(1) {
+                        $value = $this->pdf_read_value($c);
+    					if ($value === false || count($result) > 4) {
+    						// in this case the parser coudn't find an endobj so we break here
+    						break;
+        				}
+    
+        				if ($value[0] == PDF_TYPE_TOKEN && $value[1] === 'endobj') {
+        					break;
+        				}
+    
+                        $result[] = $value;
+        			}
+    
+        			$c->reset($old_pos);
+    
+                    if (isset($result[2][0]) && $result[2][0] == PDF_TYPE_STREAM) {
+                        $result[0] = PDF_TYPE_STREAM;
+                    }
+    
+        			return $result;
+        		}
+        	} else {
+        		return $obj_spec;
+        	}
+        }
+    
+        
+        
+        /**
+         * Reads a token from the file
+         *
+         * @param object $c pdf_context
+         * @return mixed
+         */
+        function pdf_read_token(&$c)
+        {
+        	// If there is a token available
+        	// on the stack, pop it out and
+        	// return it.
+    
+        	if (count($c->stack)) {
+        		return array_pop($c->stack);
+        	}
+    
+        	// Strip away any whitespace
+    
+        	do {
+        		if (!$c->ensure_content()) {
+        			return false;
+        		}
+        		$c->offset += strspn($c->buffer, " \n\r\t", $c->offset);
+        	} while ($c->offset >= $c->length - 1);
+    
+        	// Get the first character in the stream
+    
+        	$char = $c->buffer[$c->offset++];
+    
+        	switch ($char) {
+    
+        		case '[':
+        		case ']':
+        		case '(':
+        		case ')':
+        		
+        			// This is either an array or literal string
+        			// delimiter, Return it
+    
+        			return $char;
+    
+        		case '<':
+        		case '>':
+    
+        			// This could either be a hex string or
+        			// dictionary delimiter. Determine the
+        			// appropriate case and return the token
+    
+        			if ($c->buffer[$c->offset] == $char) {
+        				if (!$c->ensure_content()) {
+        				    return false;
+        				}
+        				$c->offset++;
+        				return $char . $char;
+        			} else {
+        				return $char;
+        			}
+    
+    			case '%':
+    			    
+    			    // This is a comment - jump over it!
+    			    
+                    $pos = $c->offset;
+        			while(1) {
+        			    $match = preg_match("/(\r\n|\r|\n)/", $c->buffer, $m, PREG_OFFSET_CAPTURE, $pos);
+                        if ($match === 0) {
+        					if (!$c->increase_length()) {
+        						return false;
+        					} else {
+                            	continue;
+                        	}
+        				}
+    
+        				$c->offset = $m[0][1]+strlen($m[0][0]);
+        				
+        				return $this->pdf_read_token($c);
+                    }
+                    
+    			default:
+    
+        			// This is "another" type of token (probably
+        			// a dictionary entry or a numeric value)
+        			// Find the end and return it.
+    
+        			if (!$c->ensure_content()) {
+        				return false;
+        			}
+    
+        			while(1) {
+    
+        				// Determine the length of the token
+    
+        				$pos = strcspn($c->buffer, " %[]<>()\r\n\t/", $c->offset);
+        				
+        				if ($c->offset + $pos <= $c->length - 1) {
+        					break;
+        				} else {
+        					// If the script reaches this point,
+        					// the token may span beyond the end
+        					// of the current buffer. Therefore,
+        					// we increase the size of the buffer
+        					// and try again--just to be safe.
+    
+        					$c->increase_length();
+        				}
+        			}
+    
+        			$result = substr($c->buffer, $c->offset - 1, $pos + 1);
+    
+        			$c->offset += $pos;
+        			return $result;
+        	}
+        }
+    }
+}

$B:o=|(B: branches/version-2_5-dev/data/pdf/fpdf.php
===================================================================
--- branches/version-2_5-dev/data/pdf/fpdf.php	2010-12-10 13:27:59 UTC (rev 19715)
+++ branches/version-2_5-dev/data/pdf/fpdf.php	2010-12-11 03:15:20 UTC (rev 19716)
@@ -1,1661 +0,0 @@
-<?php
-/*******************************************************************************
-* Software: FPDF                                                               *
-* Version:  1.53                                                               *
-* Date:     2004-12-31                                                         *
-* Author:   Olivier PLATHEY                                                    *
-* License:  Freeware                                                           *
-*                                                                              *
-* You may use, modify and redistribute this software as you wish.              *
-*******************************************************************************/
-
-if(!class_exists('FPDF'))
-{
-define('FPDF_VERSION','1.53');
-
-class FPDF
-{
-//Private properties
-var $page;               //current page number
-var $n;                  //current object number
-var $offsets;            //array of object offsets
-var $buffer;             //buffer holding in-memory PDF
-var $pages;              //array containing pages
-var $state;              //current document state
-var $compress;           //compression flag
-var $DefOrientation;     //default orientation
-var $CurOrientation;     //current orientation
-var $OrientationChanges; //array indicating orientation changes
-var $k;                  //scale factor (number of points in user unit)
-var $fwPt,$fhPt;         //dimensions of page format in points
-var $fw,$fh;             //dimensions of page format in user unit
-var $wPt,$hPt;           //current dimensions of page in points
-var $w,$h;               //current dimensions of page in user unit
-var $lMargin;            //left margin
-var $tMargin;            //top margin
-var $rMargin;            //right margin
-var $bMargin;            //page break margin
-var $cMargin;            //cell margin
-var $x,$y;               //current position in user unit for cell positioning
-var $lasth;              //height of last cell printed
-var $LineWidth;          //line width in user unit
-var $CoreFonts;          //array of standard font names
-var $fonts;              //array of used fonts
-var $FontFiles;          //array of font files
-var $diffs;              //array of encoding differences
-var $images;             //array of used images
-var $PageLinks;          //array of links in pages
-var $links;              //array of internal links
-var $FontFamily;         //current font family
-var $FontStyle;          //current font style
-var $underline;          //underlining flag
-var $CurrentFont;        //current font info
-var $FontSizePt;         //current font size in points
-var $FontSize;           //current font size in user unit
-var $DrawColor;          //commands for drawing color
-var $FillColor;          //commands for filling color
-var $TextColor;          //commands for text color
-var $ColorFlag;          //indicates whether fill and text colors are different
-var $ws;                 //word spacing
-var $AutoPageBreak;      //automatic page breaking
-var $PageBreakTrigger;   //threshold used to trigger page breaks
-var $InFooter;           //flag set when processing footer
-var $ZoomMode;           //zoom display mode
-var $LayoutMode;         //layout display mode
-var $title;              //title
-var $subject;            //subject
-var $author;             //author
-var $keywords;           //keywords
-var $creator;            //creator
-var $AliasNbPages;       //alias for total number of pages
-var $PDFVersion;         //PDF version number
-
-/*******************************************************************************
-*                                                                              *
-*                               Public methods                                 *
-*                                                                              *
-*******************************************************************************/
-function FPDF($orientation='P',$unit='mm',$format='A4')
-{
-	//Some checks
-	$this->_dochecks();
-	//Initialization of properties
-	$this->page=0;
-	$this->n=2;
-	$this->buffer='';
-	$this->pages=array();
-	$this->OrientationChanges=array();
-	$this->state=0;
-	$this->fonts=array();
-	$this->FontFiles=array();
-	$this->diffs=array();
-	$this->images=array();
-	$this->links=array();
-	$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;
-	//Standard fonts
-	$this->CoreFonts=array('courier'=>'Courier','courierB'=>'Courier-Bold','courierI'=>'Courier-Oblique','courierBI'=>'Courier-BoldOblique',
-		'helvetica'=>'Helvetica','helveticaB'=>'Helvetica-Bold','helveticaI'=>'Helvetica-Oblique','helveticaBI'=>'Helvetica-BoldOblique',
-		'times'=>'Times-Roman','timesB'=>'Times-Bold','timesI'=>'Times-Italic','timesBI'=>'Times-BoldItalic',
-		'symbol'=>'Symbol','zapfdingbats'=>'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 format
-	if(is_string($format))
-	{
-		$format=strtolower($format);
-		if($format=='a3')
-			$format=array(841.89,1190.55);
-		elseif($format=='a4')
-			$format=array(595.28,841.89);
-		elseif($format=='a5')
-			$format=array(420.94,595.28);
-		elseif($format=='letter')
-			$format=array(612,792);
-		elseif($format=='legal')
-			$format=array(612,1008);
-		else
-			$this->Error('Unknown page format: '.$format);
-		$this->fwPt=$format[0];
-		$this->fhPt=$format[1];
-	}
-	else
-	{
-		$this->fwPt=$format[0]*$this->k;
-		$this->fhPt=$format[1]*$this->k;
-	}
-	$this->fw=$this->fwPt/$this->k;
-	$this->fh=$this->fhPt/$this->k;
-	//Page orientation
-	$orientation=strtolower($orientation);
-	if($orientation=='p' || $orientation=='portrait')
-	{
-		$this->DefOrientation='P';
-		$this->wPt=$this->fwPt;
-		$this->hPt=$this->fhPt;
-	}
-	elseif($orientation=='l' || $orientation=='landscape')
-	{
-		$this->DefOrientation='L';
-		$this->wPt=$this->fhPt;
-		$this->hPt=$this->fwPt;
-	}
-	else
-		$this->Error('Incorrect orientation: '.$orientation);
-	$this->CurOrientation=$this->DefOrientation;
-	$this->w=$this->wPt/$this->k;
-	$this->h=$this->hPt/$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);
-	//Full width display mode
-	$this->SetDisplayMode('fullwidth');
-	//Enable compression
-	$this->SetCompression(true);
-	//Set default PDF version number
-	$this->PDFVersion='1.3';
-}
-
-function SetMargins($left,$top,$right=-1)
-{
-	//Set left, top and right margins
-	$this->lMargin=$left;
-	$this->tMargin=$top;
-	if($right==-1)
-		$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='continuous')
-{
-	//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)
-{
-	//Title of document
-	$this->title=$title;
-}
-
-function SetSubject($subject)
-{
-	//Subject of document
-	$this->subject=$subject;
-}
-
-function SetAuthor($author)
-{
-	//Author of document
-	$this->author=$author;
-}
-
-function SetKeywords($keywords)
-{
-	//Keywords of document
-	$this->keywords=$keywords;
-}
-
-function SetCreator($creator)
-{
-	//Creator of document
-	$this->creator=$creator;
-}
-
-function AliasNbPages($alias='{nb}')
-{
-	//Define an alias for total number of pages
-	$this->AliasNbPages=$alias;
-}
-
-function Error($msg)
-{
-	//Fatal error
-	die('<B>FPDF error: </B>'.$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='')
-{
-	//Start a new page
-	if($this->state==0)
-		$this->Open();
-	$family=$this->FontFamily;
-	$style=$this->FontStyle.($this->underline ? 'U' : '');
-	$size=$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);
-	//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,$size);
-	//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->Header();
-	//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,$size);
-	//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=-1,$b=-1)
-{
-	//Set color for all stroking operations
-	if(($r==0 && $g==0 && $b==0) || $g==-1)
-		$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=-1,$b=-1)
-{
-	//Set color for all filling operations
-	if(($r==0 && $g==0 && $b==0) || $g==-1)
-		$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=-1,$b=-1)
-{
-	//Set color for text
-	if(($r==0 && $g==0 && $b==0) || $g==-1)
-		$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 or Type1 font
-	$family=strtolower($family);
-	if($file=='')
-		$file=str_replace(' ','',$family).strtolower($style).'.php';
-	if($family=='arial')
-		$family='helvetica';
-	$style=strtoupper($style);
-	if($style=='IB')
-		$style='BI';
-	$fontkey=$family.$style;
-	if(isset($this->fonts[$fontkey]))
-		$this->Error('Font already added: '.$family.' '.$style);
-	include($this->_getfontpath().$file);
-	if(!isset($name))
-		$this->Error('Could not include font definition file');
-	$i=count($this->fonts)+1;
-	$this->fonts[$fontkey]=array('i'=>$i,'type'=>$type,'name'=>$name,'desc'=>$desc,'up'=>$up,'ut'=>$ut,'cw'=>$cw,'enc'=>$enc,'file'=>$file);
-	if($diff)
-	{
-		//Search existing encodings
-		$d=0;
-		$nb=count($this->diffs);
-		for($i=1;$i<=$nb;$i++)
-		{
-			if($this->diffs[$i]==$diff)
-			{
-				$d=$i;
-				break;
-			}
-		}
-		if($d==0)
-		{
-			$d=$nb+1;
-			$this->diffs[$d]=$diff;
-		}
-		$this->fonts[$fontkey]['diff']=$d;
-	}
-	if($file)
-	{
-		if($type=='TrueType')
-			$this->FontFiles[$file]=array('length1'=>$originalsize);
-		else
-			$this->FontFiles[$file]=array('length1'=>$size1,'length2'=>$size2);
-	}
-}
-
-function SetFont($family,$style='',$size=0)
-{
-	//Select a font; size given in points
-	global $fpdf_charwidths;
-
-	$family=strtolower($family);
-	if($family=='')
-		$family=$this->FontFamily;
-	if($family=='arial')
-		$family='helvetica';
-	elseif($family=='symbol' || $family=='zapfdingbats')
-		$style='';
-	$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 used for the first time
-	$fontkey=$family.$style;
-	if(!isset($this->fonts[$fontkey]))
-	{
-		//Check if one of the standard fonts
-		if(isset($this->CoreFonts[$fontkey]))
-		{
-			if(!isset($fpdf_charwidths[$fontkey]))
-			{
-				//Load metric file
-				$file=$family;
-				if($family=='times' || $family=='helvetica')
-					$file.=strtolower($style);
-				include($this->_getfontpath().$file.'.php');
-				if(!isset($fpdf_charwidths[$fontkey]))
-					$this->Error('Could not include font metric file');
-			}
-			$i=count($this->fonts)+1;
-			$this->fonts[$fontkey]=array('i'=>$i,'type'=>'core','name'=>$this->CoreFonts[$fontkey],'up'=>-100,'ut'=>50,'cw'=>$fpdf_charwidths[$fontkey]);
-		}
-		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=0,$link='')
-{
-	//Output a cell
-	$k=$this->k;
-	if($this->y+$h>$this->PageBreakTrigger && !$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->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 || $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(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=0, $ln = 2)
-{
-	//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;
-	$this->rise_h = 0; //$B9b$57W;;MQ(B
-	
-	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++;
-			$this->rise_h += $h; //$B9b$57W;;MQ(B
-			
-			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;
-			}
-			$this->rise_h += $h; //$B9b$57W;;MQ(B
-			$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,$ln,$align,$fill);
-	$this->rise_h += $h; //$BA}2CJ,$N9b$5$r7W;;(B
-	//$B2~9T$J$7 @ _Dj$+$D!"9b$5$,5,Dj$N9b$50J>e$G$"$l$P(BY$B<4$r @ _Dj$7$J$*$9!#(B
-	if($ln == 0 and $h < $this->rise_h) {
-	  $this->y = $this->y - $this->rise_h + $h;
-	}
-	
-	//$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 Image($file,$x,$y,$w=0,$h=0,$type='',$link='')
-{
-	//Put an image on the page
-	if(!isset($this->images[$file]))
-	{
-		//First use of 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);
-		$mqr=get_magic_quotes_runtime();
-		set_magic_quotes_runtime(0);
-		if($type=='jpg' || $type=='jpeg')
-			$info=$this->_parsejpg($file);
-		elseif($type=='png')
-			$info=$this->_parsepng($file);
-		else
-		{
-			//Allow for additional formats
-			$mtd='_parse'.$type;
-			if(!method_exists($this,$mtd))
-				$this->Error('Unsupported image type: '.$type);
-			$info=$this->$mtd($file);
-		}
-		set_magic_quotes_runtime($mqr);
-		$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 72 dpi
-		$w=$info['w']/$this->k;
-		$h=$info['h']/$this->k;
-	}
-	if($w==0)
-		$w=$h*$info['w']/$info['h'];
-	if($h==0)
-		$h=$w*$info['h']/$info['w'];
-	$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 Ln($h='')
-{
-	//Line feed; default value is last cell height
-	$this->x=$this->lMargin;
-	if(is_string($h))
-		$this->y+=$this->lasth;
-	else
-		$this->y+=$h;
-}
-
-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
-	//Finish document if necessary
-	if($this->state<3)
-		$this->Close();
-	//Normalize parameters
-	if(is_bool($dest))
-		$dest=$dest ? 'D' : 'F';
-	$dest=strtoupper($dest);
-	if($dest=='')
-	{
-		if($name=='')
-		{
-			$name='doc.pdf';
-			$dest='I';
-		}
-		else
-			$dest='F';
-	}
-	switch($dest)
-	{
-		case 'I':
-			//Send to standard output
-			if(ob_get_contents())
-				$this->Error('Some data has already been output, can\'t send PDF file');
-			if(php_sapi_name()!='cli')
-			{
-				//We send to a browser
-				if(isset($_SERVER['HTTP_USER_AGENT']) and strpos($_SERVER['HTTP_USER_AGENT'],'MSIE')) { header('Pragma:'); }
-				header('Content-Type: application/pdf');
-				if(headers_sent())
-					$this->Error('Some data has already been output to browser, can\'t send PDF file');
-				header('Content-Length: '.strlen($this->buffer));
-				header('Content-disposition: inline; filename="'.$name.'"');
-			}
-			echo $this->buffer;
-			break;
-		case 'D':
-			//Download file
-			if(ob_get_contents())
-				$this->Error('Some data has already been output, can\'t send PDF file');
-			if(isset($_SERVER['HTTP_USER_AGENT']) && strpos($_SERVER['HTTP_USER_AGENT'],'MSIE')) {
-				header('Pragma:');
-				header('Content-Type: application/force-download');
-			}
-			else
-				header('Content-Type: application/octet-stream');
-			if(headers_sent())
-				$this->Error('Some data has already been output to browser, can\'t send PDF file');
-			header('Content-Length: '.strlen($this->buffer));
-			header('Content-disposition: attachment; filename="'.$name.'"');
-			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 for locale-related bug
-	if(1.1==1)
-		$this->Error('Don\'t alter the locale before including class file');
-	//Check for decimal separator
-	if(sprintf('%.1f',1.0)!='1.0')
-		setlocale(LC_NUMERIC,'C');
-}
-
-function _getfontpath()
-{
-	if(!defined('FPDF_FONTPATH') && is_dir(dirname(__FILE__).'/font'))
-		define('FPDF_FONTPATH',dirname(__FILE__).'/font/');
-	return defined('FPDF_FONTPATH') ? FPDF_FONTPATH : '';
-}
-
-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->fwPt;
-		$hPt=$this->fhPt;
-	}
-	else
-	{
-		$wPt=$this->fhPt;
-		$hPt=$this->fwPt;
-	}
-	$filter=($this->compress) ? '/Filter /FlateDecode ' : '';
-	for($n=1;$n<=$nb;$n++)
-	{
-		//Page
-		$this->_newobj();
-		$this->_out('<</Type /Page');
-		$this->_out('/Parent 1 0 R');
-		if(isset($this->OrientationChanges[$n]))
-			$this->_out(sprintf('/MediaBox [0 0 %.2f %.2f]',$hPt,$wPt));
-		$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.='<</Type /Annot /Subtype /Link /Rect ['.$rect.'] /Border [0 0 0] ';
-				if(is_string($pl[4]))
-					$annots.='/A <</S /URI /URI '.$this->_textstring($pl[4]).'>>>>';
-				else
-				{
-					$l=$this->links[$pl[4]];
-					$h=isset($this->OrientationChanges[$l[0]]) ? $wPt : $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('<</Type /Pages');
-	$kids='/Kids [';
-	for($i=0;$i<$nb;$i++)
-		$kids.=(3+2*$i).' 0 R ';
-	$this->_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('<</Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences ['.$diff.']>>');
-		$this->_out('endobj');
-	}
-	$mqr=get_magic_quotes_runtime();
-	set_magic_quotes_runtime(0);
-	foreach($this->FontFiles as $file=>$info)
-	{
-		//Font file embedding
-		$this->_newobj();
-		$this->FontFiles[$file]['n']=$this->n;
-		$font='';
-		$f=fopen($this->_getfontpath().$file,'rb',1);
-		if(!$f)
-			$this->Error('Font file not found');
-		while(!feof($f))
-			$font.=fread($f,8192);
-		fclose($f);
-		$compressed=(substr($file,-2)=='.z');
-		if(!$compressed && isset($info['length2']))
-		{
-			$header=(ord($font{0})==128);
-			if($header)
-			{
-				//Strip first binary header
-				$font=substr($font,6);
-			}
-			if($header && ord($font{$info['length1']})==128)
-			{
-				//Strip second binary header
-				$font=substr($font,0,$info['length1']).substr($font,$info['length1']+6);
-			}
-		}
-		$this->_out('<</Length '.strlen($font));
-		if($compressed)
-			$this->_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');
-	}
-	set_magic_quotes_runtime($mqr);
-	foreach($this->fonts as $k=>$font)
-	{
-		//Font objects
-		$this->fonts[$k]['n']=$this->n+1;
-		$type=$font['type'];
-		$name=$font['name'];
-		if($type=='core')
-		{
-			//Standard font
-			$this->_newobj();
-			$this->_out('<</Type /Font');
-			$this->_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 font
-			$this->_newobj();
-			$this->_out('<</Type /Font');
-			$this->_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($font['enc'])
-			{
-				if(isset($font['diff']))
-					$this->_out('/Encoding '.($nf+$font['diff']).' 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='<</Type /FontDescriptor /FontName /'.$name;
-			foreach($font['desc'] as $k=>$v)
-				$s.=' /'.$k.' '.$v;
-			$file=$font['file'];
-			if($file)
-				$s.=' /FontFile'.($type=='Type1' ? '' : '2').' '.$this->FontFiles[$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()
-{
-	$filter=($this->compress) ? '/Filter /FlateDecode ' : '';
-	reset($this->images);
-	while(list($file,$info)=each($this->images))
-	{
-		$this->_newobj();
-		$this->images[$file]['n']=$this->n;
-		$this->_out('<</Type /XObject');
-		$this->_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['parms']))
-			$this->_out($info['parms']);
-		if(isset($info['trns']) && is_array($info['trns']))
-		{
-			$trns='';
-			for($i=0;$i<count($info['trns']);$i++)
-				$trns.=$info['trns'][$i].' '.$info['trns'][$i].' ';
-			$this->_out('/Mask ['.$trns.']');
-		}
-		$this->_out('/Length '.strlen($info['data']).'>>');
-		$this->_putstream($info['data']);
-		unset($this->images[$file]['data']);
-		$this->_out('endobj');
-		//Palette
-		if($info['cs']=='Indexed')
-		{
-			$this->_newobj();
-			$pal=($this->compress) ? gzcompress($info['pal']) : $info['pal'];
-			$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 '.($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;
-}
-
-function _beginpage($orientation)
-{
-	$this->page++;
-	$this->pages[$this->page]='';
-	$this->state=2;
-	$this->x=$this->lMargin;
-	$this->y=$this->tMargin;
-	$this->FontFamily='';
-	//Page orientation
-	if(!$orientation)
-		$orientation=$this->DefOrientation;
-	else
-	{
-		$orientation=strtoupper($orientation{0});
-		if($orientation!=$this->DefOrientation)
-			$this->OrientationChanges[$this->page]=true;
-	}
-	if($orientation!=$this->CurOrientation)
-	{
-		//Change orientation
-		if($orientation=='P')
-		{
-			$this->wPt=$this->fwPt;
-			$this->hPt=$this->fhPt;
-			$this->w=$this->fw;
-			$this->h=$this->fh;
-		}
-		else
-		{
-			$this->wPt=$this->fhPt;
-			$this->hPt=$this->fwPt;
-			$this->w=$this->fh;
-			$this->h=$this->fw;
-		}
-		$this->PageBreakTrigger=$this->h-$this->bMargin;
-		$this->CurOrientation=$orientation;
-	}
-}
-
-function _endpage()
-{
-	//End of page contents
-	$this->state=1;
-}
-
-function _newobj()
-{
-	//Begin a new object
-	$this->n++;
-	$this->offsets[$this->n]=strlen($this->buffer);
-	$this->_out($this->n.' 0 obj');
-}
-
-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;
-	//Read whole file
-	$f=fopen($file,'rb');
-	$data='';
-	while(!feof($f))
-		$data.=fread($f,4096);
-	fclose($f);
-	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);
-	//Check signature
-	if(fread($f,8)!=chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10))
-		$this->Error('Not a PNG file: '.$file);
-	//Read header chunk
-	fread($f,4);
-	if(fread($f,4)!='IHDR')
-		$this->Error('Incorrect PNG file: '.$file);
-	$w=$this->_freadint($f);
-	$h=$this->_freadint($f);
-	$bpc=ord(fread($f,1));
-	if($bpc>8)
-		$this->Error('16-bit depth not supported: '.$file);
-	$ct=ord(fread($f,1));
-	if($ct==0)
-		$colspace='DeviceGray';
-	elseif($ct==2)
-		$colspace='DeviceRGB';
-	elseif($ct==3)
-		$colspace='Indexed';
-	else
-		$this->Error('Alpha channel not supported: '.$file);
-	if(ord(fread($f,1))!=0)
-		$this->Error('Unknown compression method: '.$file);
-	if(ord(fread($f,1))!=0)
-		$this->Error('Unknown filter method: '.$file);
-	if(ord(fread($f,1))!=0)
-		$this->Error('Interlacing not supported: '.$file);
-	fread($f,4);
-	$parms='/DecodeParms <</Predictor 15 /Colors '.($ct==2 ? 3 : 1).' /BitsPerComponent '.$bpc.' /Columns '.$w.'>>';
-	//Scan chunks looking for palette, transparency and image data
-	$pal='';
-	$trns='';
-	$data='';
-	do
-	{
-		$n=$this->_freadint($f);
-		$type=fread($f,4);
-		if($type=='PLTE')
-		{
-			//Read palette
-			$pal=fread($f,$n);
-			fread($f,4);
-		}
-		elseif($type=='tRNS')
-		{
-			//Read transparency info
-			$t=fread($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);
-			}
-			fread($f,4);
-		}
-		elseif($type=='IDAT')
-		{
-			//Read image data block
-			$data.=fread($f,$n);
-			fread($f,4);
-		}
-		elseif($type=='IEND')
-			break;
-		else
-			fread($f,$n+4);
-	}
-	while($n);
-	if($colspace=='Indexed' && empty($pal))
-		$this->Error('Missing palette in '.$file);
-	fclose($f);
-	return array('w'=>$w,'h'=>$h,'cs'=>$colspace,'bpc'=>$bpc,'f'=>'FlateDecode','parms'=>$parms,'pal'=>$pal,'trns'=>$trns,'data'=>$data);
-}
-
-function _freadint($f)
-{
-	//Read a 4-byte integer from file
-	$a=unpack('Ni',fread($f,4));
-	return $a['i'];
-}
-
-function _textstring($s)
-{
-	//Format a text string
-	return '('.$this->_escape($s).')';
-}
-
-function _escape($s)
-{
-	//Add \ before \, ( and )
-	return str_replace(')','\\)',str_replace('(','\\(',str_replace('\\','\\\\',$s)));
-}
-
-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";
-}
-//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;
-}
-
-}
-?>

$Bii4kR&(B: branches/version-2_5-dev/data/pdf/fpdf_tpl.php
===================================================================
--- branches/version-2_5-dev/data/pdf/fpdf_tpl.php	2010-12-10 13:27:59 UTC (rev 19715)
+++ branches/version-2_5-dev/data/pdf/fpdf_tpl.php	2010-12-11 03:15:20 UTC (rev 19716)
@@ -1,385 +0,0 @@
-<?php
-//
-//  FPDF_TPL - Version 1.1.1
-//
-//    Copyright 2004-2007 Setasign - Jan Slabon
-//
-//  Licensed under the Apache License, Version 2.0 (the "License");
-//  you may not use this file except in compliance with the License.
-//  You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-//  Unless required by applicable law or agreed to in writing, software
-//  distributed under the License is distributed on an "AS IS" BASIS,
-//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//  See the License for the specific language governing permissions and
-//  limitations under the License.
-//
-
-require_once("fpdf.php");
-
-class FPDF_TPL extends FPDF {
-    /**
-     * Array of Tpl-Data
-     * @var array
-     */
-    var $tpls = array();
-
-    /**
-     * Current Template-ID
-     * @var int
-     */
-    var $tpl = 0;
-    
-    /**
-     * "In Template"-Flag
-     * @var boolean
-     */
-    var $_intpl = false;
-    
-    /**
-     * Nameprefix of Templates used in Resources-Dictonary
-     * @var string A String defining the Prefix used as Template-Object-Names. Have to beginn with an /
-     */
-    var $tplprefix = "/TPL";
-
-    /**
-     * Resources used By Templates and Pages
-     * @var array
-     */
-    var $_res = array();
-    
-    /**
-     * Constructor
-     * See FPDF-Documentation
-     * @param string $orientation
-     * @param string $unit
-     * @param mixed $format
-     */
-    function fpdf_tpl($orientation='P',$unit='mm',$format='A4') {
-        parent::fpdf($orientation,$unit,$format);
-    }
-    
-    /**
-     * Start a Template
-     *
-     * This method starts a template. You can give own coordinates to build an own sized
-     * Template. Pay attention, that the margins are adapted to the new templatesize.
-     * If you want to write outside the template, for example to build a clipped Template,
-     * you have to set the Margins and "Cursor"-Position manual after beginTemplate-Call.
-     *
-     * If no parameter is given, the template uses the current page-size.
-     * The Method returns an ID of the current Template. This ID is used later for using this template.
-     * Warning: A created Template is used in PDF at all events. Still if you don't use it after creation!
-     *
-     * @param int $x The x-coordinate given in user-unit
-     * @param int $y The y-coordinate given in user-unit
-     * @param int $w The width given in user-unit
-     * @param int $h The height given in user-unit
-     * @return int The ID of new created Template
-     */
-    function beginTemplate($x=null,$y=null,$w=null,$h=null) {
-        if ($this->page <= 0)
-            $this->error("You have to add a page to fpdf first!");
-
-        if ($x == null)
-            $x = 0;
-        if ($y == null)
-            $y = 0;
-        if ($w == null)
-            $w = $this->w;
-        if ($h == null)
-            $h = $this->h;
-
-        // Save settings
-        $this->tpl++;
-        $tpl =& $this->tpls[$this->tpl];
-        $tpl = array(
-            'o_x' => $this->x,
-            'o_y' => $this->y,
-            'o_AutoPageBreak' => $this->AutoPageBreak,
-            'o_bMargin' => $this->bMargin,
-            'o_tMargin' => $this->tMargin,
-            'o_lMargin' => $this->lMargin,
-            'o_rMargin' => $this->rMargin,
-            'o_h' => $this->h,
-            'o_w' => $this->w,
-            'buffer' => '',
-            'x' => $x,
-            'y' => $y,
-            'w' => $w,
-            'h' => $h
-        );
-
-        $this->SetAutoPageBreak(false);
-        
-        // Define own high and width to calculate possitions correct
-        $this->h = $h;
-        $this->w = $w;
-
-        $this->_intpl = true;
-        $this->SetXY($x+$this->lMargin,$y+$this->tMargin);
-        $this->SetRightMargin($this->w-$w+$this->rMargin);
-
-        return $this->tpl;
-    }
-    
-    /**
-     * End Template
-     *
-     * This method ends a template and reset initiated variables on beginTemplate.
-     *
-     * @return mixed If a template is opened, the ID is returned. If not a false is returned.
-     */
-    function endTemplate() {
-        if ($this->_intpl) {
-            $this->_intpl = false; 
-            $tpl =& $this->tpls[$this->tpl];
-            $this->SetXY($tpl['o_x'], $tpl['o_y']);
-            $this->tMargin = $tpl['o_tMargin'];
-            $this->lMargin = $tpl['o_lMargin'];
-            $this->rMargin = $tpl['o_rMargin'];
-            $this->h = $tpl['o_h'];
-            $this->w = $tpl['o_w'];
-            $this->SetAutoPageBreak($tpl['o_AutoPageBreak'], $tpl['o_bMargin']);
-            
-            return $this->tpl;
-        } else {
-            return false;
-        }
-    }
-    
-    /**
-     * Use a Template in current Page or other Template
-     *
-     * You can use a template in a page or in another template.
-     * You can give the used template a new size like you use the Image()-method.
-     * All parameters are optional. The width or height is calculated automaticaly
-     * if one is given. If no parameter is given the origin size as defined in
-     * beginTemplate() is used.
-     * The calculated or used width and height are returned as an array.
-     *
-     * @param int $tplidx A valid template-Id
-     * @param int $_x The x-position
-     * @param int $_y The y-position
-     * @param int $_w The new width of the template
-     * @param int $_h The new height of the template
-     * @retrun array The height and width of the template
-     */
-    function useTemplate($tplidx, $_x=null, $_y=null, $_w=0, $_h=0) {
-        if ($this->page <= 0)
-            $this->error("You have to add a page to fpdf first!");
-
-        if (!isset($this->tpls[$tplidx]))
-            $this->error("Template does not exist!");
-            
-        if ($this->_intpl) {
-            $this->_res['tpl'][$this->tpl]['tpls'][$tplidx] =& $this->tpls[$tplidx];
-        }
-        
-        $tpl =& $this->tpls[$tplidx];
-        $x = $tpl['x'];
-        $y = $tpl['y'];
-        $w = $tpl['w'];
-        $h = $tpl['h'];
-        
-        if ($_x == null)
-            $_x = $x;
-        if ($_y == null)
-            $_y = $y;
-        $wh = $this->getTemplateSize($tplidx,$_w,$_h);
-        $_w = $wh['w'];
-        $_h = $wh['h'];
-    
-        $this->_out(sprintf("q %.4f 0 0 %.4f %.2f %.2f cm", ($_w/$w), ($_h/$h), $_x*$this->k, ($this->h-($_y+$_h))*$this->k)); // Translate 
-        $this->_out($this->tplprefix.$tplidx." Do Q");
-
-        return array("w" => $_w, "h" => $_h);
-    }
-    
-    /**
-     * Get The calculated Size of a Template
-     *
-     * If one size is given, this method calculates the other one.
-     *
-     * @param int $tplidx A valid template-Id
-     * @param int $_w The width of the template
-     * @param int $_h The height of the template
-     * @return array The height and width of the template
-     */
-    function getTemplateSize($tplidx, $_w=0, $_h=0) {
-        if (!$this->tpls[$tplidx])
-            return false;
-
-        $tpl =& $this->tpls[$tplidx];
-        $w = $tpl['w'];
-        $h = $tpl['h'];
-        
-        if ($_w == 0 and $_h == 0) {
-            $_w = $w;
-            $_h = $h;
-        }
-
-    	if($_w==0)
-    		$_w=$_h*$w/$h;
-    	if($_h==0)
-    		$_h=$_w*$h/$w;
-    		
-        return array("w" => $_w, "h" => $_h);
-    }
-    
-    /**
-     * See FPDF-Documentation ;-)
-     */
-    function SetFont($family,$style='',$size=0) {
-        /**
-         * force the resetting of font changes in a template
-         */
-        if ($this->_intpl)
-            $this->FontFamily = '';
-            
-        parent::SetFont($family, $style, $size);
-       
-        $fontkey = $this->FontFamily.$this->FontStyle;
-        
-        if ($this->_intpl) {
-            $this->_res['tpl'][$this->tpl]['fonts'][$fontkey] =& $this->fonts[$fontkey];
-        } else {
-            $this->_res['page'][$this->page]['fonts'][$fontkey] =& $this->fonts[$fontkey];
-        }
-    }
-    
-    /**
-     * See FPDF-Documentation ;-)
-     */
-    function Image($file,$x,$y,$w=0,$h=0,$type='',$link='') {
-        parent::Image($file,$x,$y,$w,$h,$type,$link);
-        if ($this->_intpl) {
-            $this->_res['tpl'][$this->tpl]['images'][$file] =& $this->images[$file];
-        } else {
-            $this->_res['page'][$this->page]['images'][$file] =& $this->images[$file];
-        }
-    }
-    
-    /**
-     * See FPDF-Documentation ;-)
-     *
-     * AddPage is not available when you're "in" a template.
-     */
-    function AddPage($orientation='') {
-        if ($this->_intpl)
-            $this->Error('Adding pages in templates isn\'t possible!');
-        parent::AddPage($orientation);
-    }
-
-    /**
-     * Preserve adding Links in Templates ...won't work
-     */
-    function Link($x,$y,$w,$h,$link) {
-        if ($this->_intpl)
-            $this->Error('Using links in templates aren\'t possible!');
-        parent::Link($x,$y,$w,$h,$link);
-    }
-    
-    function AddLink() {
-        if ($this->_intpl)
-            $this->Error('Adding links in templates aren\'t possible!');
-        return parent::AddLink();
-    }
-    
-    function SetLink($link,$y=0,$page=-1) {
-        if ($this->_intpl)
-            $this->Error('Setting links in templates aren\'t possible!');
-        parent::SetLink($link,$y,$page);
-    }
-    
-    /**
-     * Private Method that writes the form xobjects
-     */
-    function _putformxobjects() {
-        $filter=($this->compress) ? '/Filter /FlateDecode ' : '';
-	    reset($this->tpls);
-        foreach($this->tpls AS $tplidx => $tpl) {
-
-            $p=($this->compress) ? gzcompress($tpl['buffer']) : $tpl['buffer'];
-    		$this->_newobj();
-    		$this->tpls[$tplidx]['n'] = $this->n;
-    		$this->_out('<<'.$filter.'/Type /XObject');
-            $this->_out('/Subtype /Form');
-            $this->_out('/FormType 1');
-            $this->_out(sprintf('/BBox [%.2f %.2f %.2f %.2f]',$tpl['x']*$this->k, ($tpl['h']-$tpl['y'])*$this->k, $tpl['w']*$this->k, ($tpl['h']-$tpl['y']-$tpl['h'])*$this->k));
-            $this->_out('/Resources ');
-
-            $this->_out('<</ProcSet [/PDF /Text /ImageB /ImageC /ImageI]');
-        	if (isset($this->_res['tpl'][$tplidx]['fonts']) && count($this->_res['tpl'][$tplidx]['fonts'])) {
-            	$this->_out('/Font <<');
-                foreach($this->_res['tpl'][$tplidx]['fonts'] as $font)
-            		$this->_out('/F'.$font['i'].' '.$font['n'].' 0 R');
-            	$this->_out('>>');
-            }
-        	if(isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images']) || 
-        	   isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls']))
-        	{
-                $this->_out('/XObject <<');
-                if (isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images'])) {
-                    foreach($this->_res['tpl'][$tplidx]['images'] as $image)
-              			$this->_out('/I'.$image['i'].' '.$image['n'].' 0 R');
-                }
-                if (isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) {
-                    foreach($this->_res['tpl'][$tplidx]['tpls'] as $i => $tpl)
-                        $this->_out($this->tplprefix.$i.' '.$tpl['n'].' 0 R');
-                }
-                $this->_out('>>');
-        	}
-        	$this->_out('>>');
-        	
-        	$this->_out('/Length '.strlen($p).' >>');
-    		$this->_putstream($p);
-    		$this->_out('endobj');
-        }
-    }
-    
-    /**
-     * Private Method
-     */
-    function _putresources() {
-        $this->_putfonts();
-    	$this->_putimages();
-    	$this->_putformxobjects();
-        //Resource dictionary
-    	$this->offsets[2]=strlen($this->buffer);
-    	$this->_out('2 0 obj');
-    	$this->_out('<<');
-    	$this->_putresourcedict();
-    	$this->_out('>>');
-    	$this->_out('endobj');
-    }
-    
-    function _putxobjectdict() {
-        parent::_putxobjectdict();
-        
-        if (count($this->tpls)) {
-            foreach($this->tpls as $tplidx => $tpl) {
-                $this->_out($this->tplprefix.$tplidx.' '.$tpl['n'].' 0 R');
-            }
-        }
-    }
-
-    /**
-     * Private Method
-     */
-    function _out($s) {
-	   //Add a line to the document
-	   if ($this->state==2) {
-           if (!$this->_intpl)
-	           $this->pages[$this->page].=$s."\n";
-           else
-               $this->tpls[$this->tpl]['buffer'] .= $s."\n";
-       } else {
-		   $this->buffer.=$s."\n";
-       }
-    }
-}
-
-?>

$Bii4kR&(B: branches/version-2_5-dev/data/pdf/fpdi.php
===================================================================
--- branches/version-2_5-dev/data/pdf/fpdi.php	2010-12-10 13:27:59 UTC (rev 19715)
+++ branches/version-2_5-dev/data/pdf/fpdi.php	2010-12-11 03:15:20 UTC (rev 19716)
@@ -1,468 +0,0 @@
-<?php
-//
-//  FPDI - Version 1.2
-//
-//    Copyright 2004-2007 Setasign - Jan Slabon
-//
-//  Licensed under the Apache License, Version 2.0 (the "License");
-//  you may not use this file except in compliance with the License.
-//  You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-//  Unless required by applicable law or agreed to in writing, software
-//  distributed under the License is distributed on an "AS IS" BASIS,
-//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//  See the License for the specific language governing permissions and
-//  limitations under the License.
-//
-
-define('FPDI_VERSION','1.2');
-
-ini_set('auto_detect_line_endings',1); // Strongly required!
-
-require_once("fpdf_tpl.php");
-require_once("fpdi_pdf_parser.php");
-
-
-class FPDI extends FPDF_TPL {
-    /**
-     * Actual filename
-     * @var string
-     */
-    var $current_filename;
-
-    /**
-     * Parser-Objects
-     * @var array
-     */
-    var $parsers;
-    
-    /**
-     * Current parser
-     * @var object
-     */
-    var $current_parser;
-    
-    /**
-     * Highest version of imported PDF
-     * @var double
-     */
-    var $importVersion = 1.3;
-
-    /**
-     * object stack
-     * @var array
-     */
-    var $_obj_stack;
-    
-    /**
-     * done object stack
-     * @var array
-     */
-    var $_don_obj_stack;
-
-    /**
-     * Current Object Id.
-     * @var integer
-     */
-    var $_current_obj_id;
-    
-    /**
-     * The name of the last imported page box
-     * @var string
-     */
-    var $lastUsedPageBox;
-    
-    /**
-     * Constructor
-     * See FPDF-Manual
-     */
-    function FPDI($orientation='P',$unit='mm',$format='A4') {
-        parent::FPDF_TPL($orientation,$unit,$format);
-    }
-    
-    /**
-     * Set a source-file
-     *
-     * @param string $filename a valid filename
-     * @return int number of available pages
-     */
-    function setSourceFile($filename) {
-        $this->current_filename = $filename;
-        $fn =& $this->current_filename;
-
-        if (!isset($this->parsers[$fn]))
-            $this->parsers[$fn] =& new fpdi_pdf_parser($fn,$this);
-        $this->current_parser =& $this->parsers[$fn];
-        
-        return $this->parsers[$fn]->getPageCount();
-    }
-    
-    /**
-     * Import a page
-     *
-     * @param int $pageno pagenumber
-     * @return int Index of imported page - to use with fpdf_tpl::useTemplate()
-     */
-    function importPage($pageno, $boxName='/CropBox') {
-        if ($this->_intpl) {
-            return $this->error("Please import the desired pages before creating a new template.");
-        }
-        
-        $fn =& $this->current_filename;
-        
-        $parser =& $this->parsers[$fn];
-        $parser->setPageno($pageno);
-
-        $this->tpl++;
-        $this->tpls[$this->tpl] = array();
-        $tpl =& $this->tpls[$this->tpl];
-        $tpl['parser'] =& $parser;
-        $tpl['resources'] = $parser->getPageResources();
-        $tpl['buffer'] = $parser->getContent();
-        
-        if (!in_array($boxName, $parser->availableBoxes))
-            return $this->Error(sprintf("Unknown box: %s", $boxName));
-        $pageboxes = $parser->getPageBoxes($pageno);
-        
-        /**
-         * MediaBox
-         * CropBox: Default -> MediaBox
-         * BleedBox: Default -> CropBox
-         * TrimBox: Default -> CropBox
-         * ArtBox: Default -> CropBox
-         */
-        if (!isset($pageboxes[$boxName]) && ($boxName == "/BleedBox" || $boxName == "/TrimBox" || $boxName == "/ArtBox"))
-            $boxName = "/CropBox";
-        if (!isset($pageboxes[$boxName]) && $boxName == "/CropBox")
-            $boxName = "/MediaBox";
-        
-        if (!isset($pageboxes[$boxName]))
-            return false;
-        $this->lastUsedPageBox = $boxName;
-        
-        $box = $pageboxes[$boxName];
-        $tpl['box'] = $box;
-        
-        // To build an array that can be used by PDF_TPL::useTemplate()
-        $this->tpls[$this->tpl] = array_merge($this->tpls[$this->tpl],$box);
-        // An imported page will start at 0,0 everytime. Translation will be set in _putformxobjects()
-        $tpl['x'] = 0;
-        $tpl['y'] = 0;
-        
-        $page =& $parser->pages[$parser->pageno];
-        
-        // fix for rotated pages
-        $rotation = $parser->getPageRotation($pageno);
-        if (isset($rotation[1]) && ($angle = $rotation[1] % 360) != 0) {
-            $steps = $angle / 90;
-                
-            $_w = $tpl['w'];
-            $_h = $tpl['h'];
-            $tpl['w'] = $steps % 2 == 0 ? $_w : $_h;
-            $tpl['h'] = $steps % 2 == 0 ? $_h : $_w;
-            
-            if ($steps % 2 != 0) {
-                $x = $y = ($steps == 1 || $steps == -3) ? $tpl['h'] : $tpl['w'];
-            } else {
-                $x = $tpl['w'];
-                $y = $tpl['h'];
-            }
-            
-            $cx=($x/2+$tpl['box']['x'])*$this->k;
-            $cy=($y/2+$tpl['box']['y'])*$this->k;
-            
-            $angle*=-1; 
-            
-            $angle*=M_PI/180;
-            $c=cos($angle);
-            $s=sin($angle);
-            
-            $tpl['buffer'] = sprintf('q %.5f %.5f %.5f %.5f %.2f %.2f cm 1 0 0 1 %.2f %.2f cm %s Q',$c,$s,-$s,$c,$cx,$cy,-$cx,-$cy, $tpl['buffer']);
-        }
-        
-        return $this->tpl;
-    }
-    
-    function getLastUsedPageBox() {
-        return $this->lastUsedPageBox;
-    }
-    
-    function useTemplate($tplidx, $_x=null, $_y=null, $_w=0, $_h=0) {
-        $this->_out('q 0 J 1 w 0 j 0 G'); // reset standard values
-        $s = parent::useTemplate($tplidx, $_x, $_y, $_w, $_h);
-        $this->_out('Q');
-        return $s;
-    }
-    
-    /**
-     * Private method, that rebuilds all needed objects of source files
-     */
-    function _putimportedobjects() {
-        if (is_array($this->parsers) && count($this->parsers) > 0) {
-            foreach($this->parsers AS $filename => $p) {
-                $this->current_parser =& $this->parsers[$filename];
-                if (is_array($this->_obj_stack[$filename])) {
-                    while($n = key($this->_obj_stack[$filename])) {
-                        $nObj = $this->current_parser->pdf_resolve_object($this->current_parser->c,$this->_obj_stack[$filename][$n][1]);
-						
-                        $this->_newobj($this->_obj_stack[$filename][$n][0]);
-                        
-                        if ($nObj[0] == PDF_TYPE_STREAM) {
-							$this->pdf_write_value ($nObj);
-                        } else {
-                            $this->pdf_write_value ($nObj[1]);
-                        }
-                        
-                        $this->_out('endobj');
-                        $this->_obj_stack[$filename][$n] = null; // free memory
-                        unset($this->_obj_stack[$filename][$n]);
-                        reset($this->_obj_stack[$filename]);
-                    }
-                }
-            }
-        }
-    }
-    
-    /**
-     * Sets the PDF Version to the highest of imported documents
-     */
-    function setVersion() {
-        $this->PDFVersion = max($this->importVersion, $this->PDFVersion);
-    }
-    
-    /**
-     * Put resources
-     */
-    function _putresources() {
-        $this->_putfonts();
-    	$this->_putimages();
-    	$this->_putformxobjects();
-        $this->_putimportedobjects();
-        //Resource dictionary
-    	$this->offsets[2]=strlen($this->buffer);
-    	$this->_out('2 0 obj');
-    	$this->_out('<<');
-    	$this->_putresourcedict();
-    	$this->_out('>>');
-    	$this->_out('endobj');
-    }
-    
-    /**
-     * Private Method that writes the form xobjects
-     */
-    function _putformxobjects() {
-        $filter=($this->compress) ? '/Filter /FlateDecode ' : '';
-	    reset($this->tpls);
-        foreach($this->tpls AS $tplidx => $tpl) {
-            $p=($this->compress) ? gzcompress($tpl['buffer']) : $tpl['buffer'];
-    		$this->_newobj();
-    		$this->tpls[$tplidx]['n'] = $this->n;
-    		$this->_out('<<'.$filter.'/Type /XObject');
-            $this->_out('/Subtype /Form');
-            $this->_out('/FormType 1');
-            
-            $this->_out(sprintf('/BBox [%.2f %.2f %.2f %.2f]',
-                ($tpl['x'] + (isset($tpl['box']['x'])?$tpl['box']['x']:0))*$this->k,
-                ($tpl['h'] + (isset($tpl['box']['y'])?$tpl['box']['y']:0) - $tpl['y'])*$this->k,
-                ($tpl['w'] + (isset($tpl['box']['x'])?$tpl['box']['x']:0))*$this->k,
-                ($tpl['h'] + (isset($tpl['box']['y'])?$tpl['box']['y']:0) - $tpl['y']-$tpl['h'])*$this->k)
-            );
-            
-            if (isset($tpl['box']))
-                $this->_out(sprintf('/Matrix [1 0 0 1 %.5f %.5f]',-$tpl['box']['x']*$this->k, -$tpl['box']['y']*$this->k));
-            
-            $this->_out('/Resources ');
-
-            if (isset($tpl['resources'])) {
-                $this->current_parser =& $tpl['parser'];
-                $this->pdf_write_value($tpl['resources']);
-            } else {
-                $this->_out('<</ProcSet [/PDF /Text /ImageB /ImageC /ImageI]');
-            	if (isset($this->_res['tpl'][$tplidx]['fonts']) && count($this->_res['tpl'][$tplidx]['fonts'])) {
-                	$this->_out('/Font <<');
-                    foreach($this->_res['tpl'][$tplidx]['fonts'] as $font)
-                		$this->_out('/F'.$font['i'].' '.$font['n'].' 0 R');
-                	$this->_out('>>');
-                }
-            	if(isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images']) || 
-            	   isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls']))
-            	{
-                    $this->_out('/XObject <<');
-                    if (isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images'])) {
-                        foreach($this->_res['tpl'][$tplidx]['images'] as $image)
-                  			$this->_out('/I'.$image['i'].' '.$image['n'].' 0 R');
-                    }
-                    if (isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) {
-                        foreach($this->_res['tpl'][$tplidx]['tpls'] as $i => $tpl)
-                            $this->_out($this->tplprefix.$i.' '.$tpl['n'].' 0 R');
-                    }
-                    $this->_out('>>');
-            	}
-            	$this->_out('>>');
-            }
-
-        	$this->_out('/Length '.strlen($p).' >>');
-    		$this->_putstream($p);
-    		$this->_out('endobj');
-        }
-    }
-
-    /**
-     * Rewritten to handle existing own defined objects
-     */
-    function _newobj($obj_id=false,$onlynewobj=false) {
-        if (!$obj_id) {
-            $obj_id = ++$this->n;
-        }
-
-    	//Begin a new object
-        if (!$onlynewobj) {
-            $this->offsets[$obj_id] = strlen($this->buffer);
-            $this->_out($obj_id.' 0 obj');
-            $this->_current_obj_id = $obj_id; // for later use with encryption
-        }
-        
-    }
-
-    /**
-     * Writes a value
-     * Needed to rebuild the source document
-     *
-     * @param mixed $value A PDF-Value. Structure of values see cases in this method
-     */
-    function pdf_write_value(&$value)
-    {
-
-        switch ($value[0]) {
-
-    		case PDF_TYPE_NUMERIC :
-    		case PDF_TYPE_TOKEN :
-                // A numeric value or a token.
-    			// Simply output them
-                $this->_out($value[1]." ", false);
-    			break;
-
-    		case PDF_TYPE_ARRAY :
-
-    			// An array. Output the proper
-    			// structure and move on.
-
-    			$this->_out("[",false);
-                for ($i = 0; $i < count($value[1]); $i++) {
-    				$this->pdf_write_value($value[1][$i]);
-    			}
-
-    			$this->_out("]");
-    			break;
-
-    		case PDF_TYPE_DICTIONARY :
-
-    			// A dictionary.
-    			$this->_out("<<",false);
-
-    			reset ($value[1]);
-
-    			while (list($k, $v) = each($value[1])) {
-    				$this->_out($k . " ",false);
-    				$this->pdf_write_value($v);
-    			}
-
-    			$this->_out(">>");
-    			break;
-
-    		case PDF_TYPE_OBJREF :
-
-    			// An indirect object reference
-    			// Fill the object stack if needed
-    			$cpfn =& $this->current_parser->filename;
-    			if (!isset($this->_don_obj_stack[$cpfn][$value[1]])) {
-                    $this->_newobj(false,true);
-                    $this->_obj_stack[$cpfn][$value[1]] = array($this->n, $value);
-                    $this->_don_obj_stack[$cpfn][$value[1]] = array($this->n, $value);
-                }
-                $objid = $this->_don_obj_stack[$cpfn][$value[1]][0];
-
-    			$this->_out("{$objid} 0 R"); //{$value[2]}
-    			break;
-
-    		case PDF_TYPE_STRING :
-
-    			// A string.
-                $this->_out('('.$value[1].')');
-
-    			break;
-
-    		case PDF_TYPE_STREAM :
-
-    			// A stream. First, output the
-    			// stream dictionary, then the
-    			// stream data itself.
-                $this->pdf_write_value($value[1]);
-    			$this->_out("stream");
-    			$this->_out($value[2][1]);
-    			$this->_out("endstream");
-    			break;
-            case PDF_TYPE_HEX :
-            
-                $this->_out("<".$value[1].">");
-                break;
-
-    		case PDF_TYPE_NULL :
-                // The null object.
-
-    			$this->_out("null");
-    			break;
-    	}
-    }
-    
-    
-    /**
-     * Private Method
-     */
-    function _out($s,$ln=true) {
-	   //Add a line to the document
-	   if ($this->state==2) {
-           if (!$this->_intpl)
-	           $this->pages[$this->page] .= $s.($ln == true ? "\n" : '');
-           else
-               $this->tpls[$this->tpl]['buffer'] .= $s.($ln == true ? "\n" : '');
-       } else {
-		   $this->buffer.=$s.($ln == true ? "\n" : '');
-       }
-    }
-
-    /**
-     * rewritten to close opened parsers
-     *
-     */
-    function _enddoc() {
-        parent::_enddoc();
-        $this->_closeParsers();
-    }
-    
-    /**
-     * close all files opened by parsers
-     */
-    function _closeParsers() {
-        if ($this->state > 2 && count($this->parsers) > 0) {
-          	foreach ($this->parsers as $k => $_){
-            	$this->parsers[$k]->closeFile();
-            	$this->parsers[$k] = null;
-            	unset($this->parsers[$k]);
-            }
-            return true;
-        }
-        return false;
-    }
-
-}
-
-// for PHP5
-if (version_compare("5", PHP_VERSION, "<")) {
-    if (!class_exists('fpdi')) {
-        class fpdi extends FPDI {}
-    }
-}
-?>

$Bii4kR&(B: branches/version-2_5-dev/data/pdf/fpdi_pdf_parser.php
===================================================================
--- branches/version-2_5-dev/data/pdf/fpdi_pdf_parser.php	2010-12-10 13:27:59 UTC (rev 19715)
+++ branches/version-2_5-dev/data/pdf/fpdi_pdf_parser.php	2010-12-11 03:15:20 UTC (rev 19716)
@@ -1,379 +0,0 @@
-<?php
-//
-//  FPDI - Version 1.2
-//
-//    Copyright 2004-2007 Setasign - Jan Slabon
-//
-//  Licensed under the Apache License, Version 2.0 (the "License");
-//  you may not use this file except in compliance with the License.
-//  You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-//  Unless required by applicable law or agreed to in writing, software
-//  distributed under the License is distributed on an "AS IS" BASIS,
-//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//  See the License for the specific language governing permissions and
-//  limitations under the License.
-//
-
-require_once("pdf_parser.php");
-
-class fpdi_pdf_parser extends pdf_parser {
-
-    /**
-     * Pages
-     * Index beginns at 0
-     *
-     * @var array
-     */
-    var $pages;
-    
-    /**
-     * Page count
-     * @var integer
-     */
-    var $page_count;
-    
-    /**
-     * actual page number
-     * @var integer
-     */
-    var $pageno;
-    
-    /**
-     * PDF Version of imported Document
-     * @var string
-     */
-    var $pdfVersion;
-    
-    /**
-     * FPDI Reference
-     * @var object
-     */
-    var $fpdi;
-    
-    /**
-     * Available BoxTypes
-     *
-     * @var array
-     */
-    var $availableBoxes = array("/MediaBox","/CropBox","/BleedBox","/TrimBox","/ArtBox");
-        
-    /**
-     * Constructor
-     *
-     * @param string $filename  Source-Filename
-     * @param object $fpdi      Object of type fpdi
-     */
-    function fpdi_pdf_parser($filename,&$fpdi) {
-        $this->fpdi =& $fpdi;
-		$this->filename = $filename;
-		
-        parent::pdf_parser($filename);
-
-        // resolve Pages-Dictonary
-        $pages = $this->pdf_resolve_object($this->c, $this->root[1][1]['/Pages']);
-
-        // Read pages
-        $this->read_pages($this->c, $pages, $this->pages);
-        
-        // count pages;
-        $this->page_count = count($this->pages);
-    }
-    
-    /**
-     * Overwrite parent::error()
-     *
-     * @param string $msg  Error-Message
-     */
-    function error($msg) {
-    	$this->fpdi->error($msg);	
-    }
-    
-    /**
-     * Get pagecount from sourcefile
-     *
-     * @return int
-     */
-    function getPageCount() {
-        return $this->page_count;
-    }
-
-
-    /**
-     * Set pageno
-     *
-     * @param int $pageno Pagenumber to use
-     */
-    function setPageno($pageno) {
-        $pageno = ((int) $pageno) - 1;
-
-        if ($pageno < 0 || $pageno >= $this->getPageCount()) {
-            $this->fpdi->error("Pagenumber is wrong!");
-        }
-
-        $this->pageno = $pageno;
-    }
-    
-    /**
-     * Get page-resources from current page
-     *
-     * @return array
-     */
-    function getPageResources() {
-        return $this->_getPageResources($this->pages[$this->pageno]);
-    }
-    
-    /**
-     * Get page-resources from /Page
-     *
-     * @param array $obj Array of pdf-data
-     */
-    function _getPageResources ($obj) { // $obj = /Page
-    	$obj = $this->pdf_resolve_object($this->c, $obj);
-
-        // If the current object has a resources
-    	// dictionary associated with it, we use
-    	// it. Otherwise, we move back to its
-    	// parent object.
-        if (isset ($obj[1][1]['/Resources'])) {
-    		$res = $this->pdf_resolve_object($this->c, $obj[1][1]['/Resources']);
-    		if ($res[0] == PDF_TYPE_OBJECT)
-                return $res[1];
-            return $res;
-    	} else {
-    		if (!isset ($obj[1][1]['/Parent'])) {
-    			return false;
-    		} else {
-                $res = $this->_getPageResources($obj[1][1]['/Parent']);
-                if ($res[0] == PDF_TYPE_OBJECT)
-                    return $res[1];
-                return $res;
-    		}
-    	}
-    }
-
-
-    /**
-     * Get content of current page
-     *
-     * If more /Contents is an array, the streams are concated
-     *
-     * @return string
-     */
-    function getContent() {
-        $buffer = "";
-        
-        if (isset($this->pages[$this->pageno][1][1]['/Contents'])) {
-            $contents = $this->_getPageContent($this->pages[$this->pageno][1][1]['/Contents']);
-            foreach($contents AS $tmp_content) {
-                $buffer .= $this->_rebuildContentStream($tmp_content).' ';
-            }
-        }
-        
-        return $buffer;
-    }
-    
-    
-    /**
-     * Resolve all content-objects
-     *
-     * @param array $content_ref
-     * @return array
-     */
-    function _getPageContent($content_ref) {
-        $contents = array();
-        
-        if ($content_ref[0] == PDF_TYPE_OBJREF) {
-            $content = $this->pdf_resolve_object($this->c, $content_ref);
-            if ($content[1][0] == PDF_TYPE_ARRAY) {
-                $contents = $this->_getPageContent($content[1]);
-            } else {
-                $contents[] = $content;
-            }
-        } else if ($content_ref[0] == PDF_TYPE_ARRAY) {
-            foreach ($content_ref[1] AS $tmp_content_ref) {
-                $contents = array_merge($contents,$this->_getPageContent($tmp_content_ref));
-            }
-        }
-
-        return $contents;
-    }
-
-
-    /**
-     * Rebuild content-streams
-     *
-     * @param array $obj
-     * @return string
-     */
-    function _rebuildContentStream($obj) {
-        $filters = array();
-        
-        if (isset($obj[1][1]['/Filter'])) {
-            $_filter = $obj[1][1]['/Filter'];
-
-            if ($_filter[0] == PDF_TYPE_TOKEN) {
-                $filters[] = $_filter;
-            } else if ($_filter[0] == PDF_TYPE_ARRAY) {
-                $filters = $_filter[1];
-            }
-        }
-
-        $stream = $obj[2][1];
-
-        foreach ($filters AS $_filter) {
-            switch ($_filter[1]) {
-                case "/FlateDecode":
-                    if (function_exists('gzuncompress')) {
-                        $stream = (strlen($stream) > 0) ? @gzuncompress($stream) : '';                        
-                    } else {
-                        $this->fpdi->error(sprintf("To handle %s filter, please compile php with zlib support.",$_filter[1]));
-                    }
-                    if ($stream === false) {
-                        $this->fpdi->error("Error while decompressing stream.");
-                    }
-                break;
-                case null:
-                    $stream = $stream;
-                break;
-                default:
-                    if (preg_match("/^\/[a-z85]*$/i", $_filter[1], $filterName) && @include_once('decoders'.$_filter[1].'.php')) {
-                        $filterName = substr($_filter[1],1);
-                        if (class_exists($filterName)) {
-    	                	$decoder =& new $filterName($this->fpdi);
-    	                    $stream = $decoder->decode(trim($stream));
-                        } else {
-                        	$this->fpdi->error(sprintf("Unsupported Filter: %s",$_filter[1]));
-                        }
-                    } else {
-                        $this->fpdi->error(sprintf("Unsupported Filter: %s",$_filter[1]));
-                    }
-            }
-        }
-        
-        return $stream;
-    }
-    
-    
-    /**
-     * Get a Box from a page
-     * Arrayformat is same as used by fpdf_tpl
-     *
-     * @param array $page a /Page
-     * @param string $box_index Type of Box @see $availableBoxes
-     * @return array
-     */
-    function getPageBox($page, $box_index) {
-        $page = $this->pdf_resolve_object($this->c,$page);
-        $box = null;
-        if (isset($page[1][1][$box_index]))
-            $box =& $page[1][1][$box_index];
-        
-        if (!is_null($box) && $box[0] == PDF_TYPE_OBJREF) {
-            $tmp_box = $this->pdf_resolve_object($this->c,$box);
-            $box = $tmp_box[1];
-        }
-            
-        if (!is_null($box) && $box[0] == PDF_TYPE_ARRAY) {
-            $b =& $box[1];
-            return array("x" => $b[0][1]/$this->fpdi->k,
-                         "y" => $b[1][1]/$this->fpdi->k,
-                         "w" => abs($b[0][1]-$b[2][1])/$this->fpdi->k,
-                         "h" => abs($b[1][1]-$b[3][1])/$this->fpdi->k);
-        } else if (!isset ($page[1][1]['/Parent'])) {
-            return false;
-        } else {
-            return $this->getPageBox($this->pdf_resolve_object($this->c, $page[1][1]['/Parent']), $box_index);
-        }
-    }
-
-    function getPageBoxes($pageno) {
-        return $this->_getPageBoxes($this->pages[$pageno-1]);
-    }
-    
-    /**
-     * Get all Boxes from /Page
-     *
-     * @param array a /Page
-     * @return array
-     */
-    function _getPageBoxes($page) {
-        $boxes = array();
-
-        foreach($this->availableBoxes AS $box) {
-            if ($_box = $this->getPageBox($page,$box)) {
-                $boxes[$box] = $_box;
-            }
-        }
-
-        return $boxes;
-    }
-
-    function getPageRotation($pageno) {
-        return $this->_getPageRotation($this->pages[$pageno-1]);
-    }
-    
-    function _getPageRotation ($obj) { // $obj = /Page
-    	$obj = $this->pdf_resolve_object($this->c, $obj);
-    	if (isset ($obj[1][1]['/Rotate'])) {
-    		$res = $this->pdf_resolve_object($this->c, $obj[1][1]['/Rotate']);
-    		if ($res[0] == PDF_TYPE_OBJECT)
-                return $res[1];
-            return $res;
-    	} else {
-    		if (!isset ($obj[1][1]['/Parent'])) {
-    			return false;
-    		} else {
-                $res = $this->_getPageRotation($obj[1][1]['/Parent']);
-                if ($res[0] == PDF_TYPE_OBJECT)
-                    return $res[1];
-                return $res;
-    		}
-    	}
-    }
-    
-    /**
-     * Read all /Page(es)
-     *
-     * @param object pdf_context
-     * @param array /Pages
-     * @param array the result-array
-     */
-    function read_pages (&$c, &$pages, &$result) {
-        // Get the kids dictionary
-    	$kids = $this->pdf_resolve_object ($c, $pages[1][1]['/Kids']);
-
-        if (!is_array($kids))
-            $this->fpdi->Error("Cannot find /Kids in current /Page-Dictionary");
-        foreach ($kids[1] as $v) {
-    		$pg = $this->pdf_resolve_object ($c, $v);
-            if ($pg[1][1]['/Type'][1] === '/Pages') {
-                // If one of the kids is an embedded
-    			// /Pages array, resolve it as well.
-                $this->read_pages ($c, $pg, $result);
-    		} else {
-    			$result[] = $pg;
-    		}
-    	}
-    }
-
-    
-    
-    /**
-     * Get PDF-Version
-     *
-     * And reset the PDF Version used in FPDI if needed
-     */
-    function getPDFVersion() {
-        parent::getPDFVersion();
-    	
-        if (isset($this->fpdi->importVersion) && $this->pdfVersion > $this->fpdi->importVersion) {
-            $this->fpdi->importVersion = $this->pdfVersion;
-        }
-    }
-    
-}
-
-?>

$Bii4kR&(B: branches/version-2_5-dev/data/pdf/japanese.php
===================================================================
--- branches/version-2_5-dev/data/pdf/japanese.php	2010-12-10 13:27:59 UTC (rev 19715)
+++ branches/version-2_5-dev/data/pdf/japanese.php	2010-12-11 03:15:20 UTC (rev 19716)
@@ -1,537 +0,0 @@
-<?php
-require('fpdi.php');
-
-$SJIS_widths=array(' '=>278,'!'=>299,'"'=>353,'#'=>614,'$'=>614,'%'=>721,'&'=>735,'\''=>216,
-    '('=>323,')'=>323,'*'=>449,'+'=>529,','=>219,'-'=>306,'.'=>219,'/'=>453,'0'=>614,'1'=>614,
-    '2'=>614,'3'=>614,'4'=>614,'5'=>614,'6'=>614,'7'=>614,'8'=>614,'9'=>614,':'=>219,';'=>219,
-    '<'=>529,'='=>529,'>'=>529,'?'=>486,'@'=>744,'A'=>646,'B'=>604,'C'=>617,'D'=>681,'E'=>567,
-    'F'=>537,'G'=>647,'H'=>738,'I'=>320,'J'=>433,'K'=>637,'L'=>566,'M'=>904,'N'=>710,'O'=>716,
-    'P'=>605,'Q'=>716,'R'=>623,'S'=>517,'T'=>601,'U'=>690,'V'=>668,'W'=>990,'X'=>681,'Y'=>634,
-    'Z'=>578,'['=>316,'\\'=>614,']'=>316,'^'=>529,'_'=>500,'`'=>387,'a'=>509,'b'=>566,'c'=>478,
-    'd'=>565,'e'=>503,'f'=>337,'g'=>549,'h'=>580,'i'=>275,'j'=>266,'k'=>544,'l'=>276,'m'=>854,
-    'n'=>579,'o'=>550,'p'=>578,'q'=>566,'r'=>410,'s'=>444,'t'=>340,'u'=>575,'v'=>512,'w'=>760,
-    'x'=>503,'y'=>529,'z'=>453,'{'=>326,'|'=>380,'}'=>326,'~'=>387);
-
-class PDF_Japanese extends FPDI
-{
-function AddCIDFont($family,$style,$name,$cw,$CMap,$registry)
-{
-    $fontkey=strtolower($family).strtoupper($style);
-    if(isset($this->fonts[$fontkey]))
-        $this->Error("CID font already added: $family $style");
-    $i=count($this->fonts)+1;
-    $this->fonts[$fontkey]=array('i'=>$i,'type'=>'Type0','name'=>$name,'up'=>-120,'ut'=>40,'cw'=>$cw,'CMap'=>$CMap,'registry'=>$registry);
-}
-
-function AddCIDFonts($family,$name,$cw,$CMap,$registry)
-{
-    $this->AddCIDFont($family,'',$name,$cw,$CMap,$registry);
-    $this->AddCIDFont($family,'B',$name.',Bold',$cw,$CMap,$registry);
-    $this->AddCIDFont($family,'I',$name.',Italic',$cw,$CMap,$registry);
-    $this->AddCIDFont($family,'BI',$name.',BoldItalic',$cw,$CMap,$registry);
-}
-
-function AddSJISFont($family='SJIS')
-{
-    //Add SJIS font with proportional Latin
-    $name='KozMinPro-Regular-Acro';
-    //$name='Gothic'; // $BJQ99(B
-    $cw=$GLOBALS['SJIS_widths'];
-    $CMap='90msp-RKSJ-H';
-    $registry=array('ordering'=>'Japan1','supplement'=>2);
-    $this->AddCIDFonts($family,$name,$cw,$CMap,$registry);
-}
-
-function AddSJIShwFont($family='SJIS-hw')
-{
-    //Add SJIS font with half-width Latin
-    $name='KozMinPro-Regular-Acro';
-    for($i=32;$i<=126;$i++)
-        $cw[chr($i)]=500;
-    $CMap='90ms-RKSJ-H';
-    $registry=array('ordering'=>'Japan1','supplement'=>2);
-    $this->AddCIDFonts($family,$name,$cw,$CMap,$registry);
-}
-
-function GetStringWidth($s)
-{
-    if($this->CurrentFont['type']=='Type0')
-        return $this->GetSJISStringWidth($s);
-    else
-        return parent::GetStringWidth($s);
-}
-
-function GetSJISStringWidth($s)
-{
-    //SJIS version of GetStringWidth()
-    $l=0;
-    $cw=&$this->CurrentFont['cw'];
-    $nb=strlen($s);
-    $i=0;
-    while($i<$nb)
-    {
-        $o=ord($s{$i});
-        if($o<128)
-        {
-            //ASCII
-            $l+=$cw[$s{$i}];
-            $i++;
-        }
-        elseif($o>=161 and $o<=223)
-        {
-            //Half-width katakana
-            $l+=500;
-            $i++;
-        }
-        else
-        {
-            //Full-width character
-            $l+=1000;
-            $i+=2;
-        }
-    }
-    return $l*$this->FontSize/1000;
-}
-
-function MultiCell($w,$h,$txt,$border=0,$align='L',$fill=0,$ln=2)
-{
-    if($this->CurrentFont['type']=='Type0')
-        $this->SJISMultiCell($w,$h,$txt,$border,$align,$fill,$ln);
-    else
-        parent::MultiCell($w,$h,$txt,$border,$align,$fill,$ln);
-}
-
-function SJISMultiCell($w,$h,$txt,$border=0,$align='L',$fill=0,$ln=2)
-{
-    //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 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;
-    $nl=1;
-    $this->rise_h = 0; //$B9b$57W;;MQ(B
-
-    while($i<$nb)
-    {
-        //Get next character
-        $c=$s{$i};
-        $o=ord($c);
-        if($o==10)
-        {
-            //Explicit line break
-            $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill);
-            $i++;
-            $sep=-1;
-            $j=$i;
-            $l=0;
-            $nl++;
-            $this->rise_h += $h; //$B9b$57W;;MQ(B
-            if($border and $nl==2)
-                $b=$b2;
-            continue;
-        }
-        if($o<128)
-        {
-            //ASCII
-            $l+=$cw[$c];
-            $n=1;
-            if($o==32)
-                $sep=$i;
-        }
-        elseif($o>=161 and $o<=223)
-        {
-            //Half-width katakana
-            $l+=500;
-            $n=1;
-            $sep=$i;
-        }
-        else
-        {
-            //Full-width character
-            $l+=1000;
-            $n=2;
-            $sep=$i;
-        }
-        if($l>$wmax)
-        {
-            //Automatic line break
-            if($sep==-1 or $i==$j)
-            {
-                if($i==$j)
-                    $i+=$n;
-                $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill);
-            }
-            else
-            {
-                $this->Cell($w,$h,substr($s,$j,$sep-$j),$b,2,$align,$fill);
-                $i=($s[$sep]==' ') ? $sep+1 : $sep;
-            }
-            $this->rise_h += $h; //$B9b$57W;;MQ(B
-            $sep=-1;
-            $j=$i;
-            $l=0;
-            $nl++;
-            if($border and $nl==2)
-                $b=$b2;
-        }
-        else
-        {
-            $i+=$n;
-            if($o>=128)
-                $sep=$i;
-        }
-    }
-    //Last chunk
-    if($border and is_int(strpos($border,'B')))
-        $b.='B';
-    $this->Cell($w,$h,substr($s,$j,$i-$j),$b,$ln,$align,$fill);
-    $this->rise_h += $h; //$BA}2CJ,$N9b$5$r7W;;(B
-    //$B2~9T$J$7 @ _Dj$+$D!"9b$5$,5,Dj$N9b$50J>e$G$"$l$P(BY$B<4$r @ _Dj$7$J$*$9!#(B
-    if($ln == 0 and $h < $this->rise_h) {
-      $this->y = $this->y - $this->rise_h + $h;
-    }
-
-    //$this->x=$this->lMargin;
-}
-
-function Write($h,$txt,$link='')
-{
-    if($this->CurrentFont['type']=='Type0')
-        $this->SJISWrite($h,$txt,$link);
-    else
-        parent::Write($h,$txt,$link);
-}
-
-function SJISWrite($h,$txt,$link)
-{
-    //SJIS version of Write()
-    $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};
-        $o=ord($c);
-        if($o==10)
-        {
-            //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)
-            {
-                //Go to left margin
-                $this->x=$this->lMargin;
-                $w=$this->w-$this->rMargin-$this->x;
-                $wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
-            }
-            $nl++;
-            continue;
-        }
-        if($o<128)
-        {
-            //ASCII
-            $l+=$cw[$c];
-            $n=1;
-            if($o==32)
-                $sep=$i;
-        }
-        elseif($o>=161 and $o<=223)
-        {
-            //Half-width katakana
-            $l+=500;
-            $n=1;
-            $sep=$i;
-        }
-        else
-        {
-            //Full-width character
-            $l+=1000;
-            $n=2;
-            $sep=$i;
-        }
-        if($l>$wmax)
-        {
-            //Automatic line break
-            if($sep==-1 or $i==$j)
-            {
-                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+=$n;
-                    $nl++;
-                    continue;
-                }
-                if($i==$j)
-                    $i+=$n;
-                $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=($s[$sep]==' ') ? $sep+1 : $sep;
-            }
-            $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+=$n;
-            if($o>=128)
-                $sep=$i;
-        }
-    }
-    //Last chunk
-    if($i!=$j)
-        $this->Cell($l/1000*$this->FontSize,$h,substr($s,$j,$i-$j),0,0,'',0,$link);
-}
-
-function _putfonts()
-{
-    $nf=$this->n;
-    foreach($this->diffs as $diff)
-    {
-        //Encodings
-        $this->_newobj();
-        $this->_out('<</Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences ['.$diff.']>>');
-        $this->_out('endobj');
-    }
-    $mqr=get_magic_quotes_runtime();
-    set_magic_quotes_runtime(0);
-    foreach($this->FontFiles as $file=>$info)
-    {
-        //Font file embedding
-        $this->_newobj();
-        $this->FontFiles[$file]['n']=$this->n;
-        if(defined('FPDF_FONTPATH'))
-            $file=FPDF_FONTPATH.$file;
-        $size=filesize($file);
-        if(!$size)
-            $this->Error('Font file not found');
-        $this->_out('<</Length '.$size);
-        if(substr($file,-2)=='.z')
-            $this->_out('/Filter /FlateDecode');
-        $this->_out('/Length1 '.$info['length1']);
-        if(isset($info['length2']))
-            $this->_out('/Length2 '.$info['length2'].' /Length3 0');
-        $this->_out('>>');
-        $f=fopen($file,'rb');
-        $this->_putstream(fread($f,$size));
-        fclose($f);
-        $this->_out('endobj');
-    }
-    set_magic_quotes_runtime($mqr);
-    foreach($this->fonts as $k=>$font)
-    {
-        //Font objects
-        $this->_newobj();
-        $this->fonts[$k]['n']=$this->n;
-        $this->_out('<</Type /Font');
-        if($font['type']=='Type0')
-            $this->_putType0($font);
-        else
-        {
-            $name=$font['name'];
-            $this->_out('/BaseFont /'.$name);
-            if($font['type']=='core')
-            {
-                //Standard font
-                $this->_out('/Subtype /Type1');
-                if($name!='Symbol' and $name!='ZapfDingbats')
-                    $this->_out('/Encoding /WinAnsiEncoding');
-            }
-            else
-            {
-                //Additional font
-                $this->_out('/Subtype /'.$font['type']);
-                $this->_out('/FirstChar 32');
-                $this->_out('/LastChar 255');
-                $this->_out('/Widths '.($this->n+1).' 0 R');
-                $this->_out('/FontDescriptor '.($this->n+2).' 0 R');
-                if($font['enc'])
-                {
-                    if(isset($font['diff']))
-                        $this->_out('/Encoding '.($nf+$font['diff']).' 0 R');
-                    else
-                        $this->_out('/Encoding /WinAnsiEncoding');
-                }
-            }
-            $this->_out('>>');
-            $this->_out('endobj');
-            if($font['type']!='core')
-            {
-                //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='<</Type /FontDescriptor /FontName /'.$name;
-                foreach($font['desc'] as $k=>$v)
-                    $s.=' /'.$k.' '.$v;
-                $file=$font['file'];
-                if($file)
-                    $s.=' /FontFile'.($font['type']=='Type1' ? '' : '2').' '.$this->FontFiles[$file]['n'].' 0 R';
-                $this->_out($s.'>>');
-                $this->_out('endobj');
-            }
-        }
-    }
-}
-
-function _putType0($font)
-{
-    //Type0
-    $this->_out('/Subtype /Type0');
-    $this->_out('/BaseFont /'.$font['name'].'-'.$font['CMap']);
-    $this->_out('/Encoding /'.$font['CMap']);
-    $this->_out('/DescendantFonts ['.($this->n+1).' 0 R]');
-    $this->_out('>>');
-    $this->_out('endobj');
-    //CIDFont
-    $this->_newobj();
-    $this->_out('<</Type /Font');
-    $this->_out('/Subtype /CIDFontType0');
-    $this->_out('/BaseFont /'.$font['name']);
-    $this->_out('/CIDSystemInfo <</Registry (Adobe) /Ordering ('.$font['registry']['ordering'].') /Supplement '.$font['registry']['supplement'].'>>');
-    $this->_out('/FontDescriptor '.($this->n+1).' 0 R');
-    $W='/W [1 [';
-    foreach($font['cw'] as $w)
-        $W.=$w.' ';
-    $this->_out($W.'] 231 325 500 631 [500] 326 389 500]');
-    $this->_out('>>');
-    $this->_out('endobj');
-    //Font descriptor
-    $this->_newobj();
-    $this->_out('<</Type /FontDescriptor');
-    $this->_out('/FontName /'.$font['name']);
-    $this->_out('/Flags 6');
-    $this->_out('/FontBBox [0 -200 1000 900]');
-    $this->_out('/ItalicAngle 0');
-    $this->_out('/Ascent 800');
-    $this->_out('/Descent -200');
-    $this->_out('/CapHeight 800');
-    $this->_out('/StemV 60');
-    $this->_out('>>');
-    $this->_out('endobj');
-}
-
-//Load data
-function LoadData($file)
-{
-    //Read file lines
-    $lines=file($file);
-    $data=array();
-    foreach($lines as $line)
-        $data[]=explode(';',chop($line));
-    return $data;
-}
-
-//Colored table
-function FancyTable($header,$data,$w)
-{
-    //Colors, line width and bold font
-    $this->SetFillColor(216,216,216);
-    $this->SetTextColor(0);
-    $this->SetDrawColor(0,0,0);
-    $this->SetLineWidth(.3);
-    $this->SetFont('','B');
-    //Header
-    for($i=0;$i<count($header);$i++)
-        $this->Cell($w[$i],7,$header[$i],1,0,'C',1);
-    $this->Ln();
-    //Color and font restoration
-    $this->SetFillColor(235,235,235);
-    $this->SetTextColor(0);
-    $this->SetFont('');
-    //Data
-    $fill=0;
-    foreach($data as $row)
-    {
-    $h = 4;
-    $i = 0;
-    $this->Cell(5, $h, '', 0, 0, '', 0, '');
-    foreach($row as $col) {
-        if($i > 3) { $i = 0; }
-        if ($i != 0) {
-            //$this->MultiCell($w[$i],$h,number_format($col),1,'R',$fill, 0);
-            $this->MultiCell($w[$i],$h,$col,1,'R',$fill, 0);
-        } else {
-            $this->MultiCell($w[$i],$h,$col,1,'L',$fill, 0);
-        }
-        $h = $this->rise_h;
-        $i++;
-    }
-    $this->Ln();
-        $fill=!$fill;
-
-    }
-    $this->Cell(5, $h, '', 0, 0, '', 0, '');
-    $this->Cell(array_sum($w),0,'','T');
-}
-
-function Footer()
-{
-    //$B2<C<$+$i(B1.5 cm $B$K0\F0(B
-    $this->SetY(-15);
-    //$B%U%)%s%H$r @ _Dj!#(B Arial italic 8
-    $this->SetFont('Arial','I',8);
-    //$B8=:_$N%Z!<%8HV9f$HAm%Z!<%8?t$r=PNO(B
-    #$this->Cell(0,10,''.$this->PageNo().' / {nb}',0,0,'C');
-}
-
-}
-?>

$Bii4kR&(B: branches/version-2_5-dev/data/pdf/pdf_context.php
===================================================================
--- branches/version-2_5-dev/data/pdf/pdf_context.php	2010-12-10 13:27:59 UTC (rev 19715)
+++ branches/version-2_5-dev/data/pdf/pdf_context.php	2010-12-11 03:15:20 UTC (rev 19716)
@@ -1,78 +0,0 @@
-<?php
-//
-//  FPDI - Version 1.2
-//
-//    Copyright 2004-2007 Setasign - Jan Slabon
-//
-//  Licensed under the Apache License, Version 2.0 (the "License");
-//  you may not use this file except in compliance with the License.
-//  You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-//  Unless required by applicable law or agreed to in writing, software
-//  distributed under the License is distributed on an "AS IS" BASIS,
-//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//  See the License for the specific language governing permissions and
-//  limitations under the License.
-//
-
-class pdf_context {
-
-	var $file;
-	var $buffer;
-	var $offset;
-	var $length;
-
-	var $stack;
-
-	// Constructor
-
-	function pdf_context($f) {
-		$this->file = $f;
-		$this->reset();
-	}
-
-	// Optionally move the file
-	// pointer to a new location
-	// and reset the buffered data
-
-	function reset($pos = null, $l = 100) {
-		if (!is_null ($pos)) {
-			fseek ($this->file, $pos);
-		}
-
-		$this->buffer = $l > 0 ? fread($this->file, $l) : '';
-		$this->offset = 0;
-		$this->length = strlen($this->buffer);
-		$this->stack = array();
-	}
-
-	// Make sure that there is at least one
-	// character beyond the current offset in
-	// the buffer to prevent the tokenizer
-	// from attempting to access data that does
-	// not exist
-
-	function ensure_content() {
-		if ($this->offset >= $this->length - 1) {
-			return $this->increase_length();
-		} else {
-			return true;
-		}
-	}
-
-	// Forcefully read more data into the buffer
-
-	function increase_length($l=100) {
-		if (feof($this->file)) {
-			return false;
-		} else {
-			$this->buffer .= fread($this->file, $l);
-			$this->length = strlen($this->buffer);
-			return true;
-		}
-	}
-
-}
-?>

$Bii4kR&(B: branches/version-2_5-dev/data/pdf/pdf_parser.php
===================================================================
--- branches/version-2_5-dev/data/pdf/pdf_parser.php	2010-12-10 13:27:59 UTC (rev 19715)
+++ branches/version-2_5-dev/data/pdf/pdf_parser.php	2010-12-11 03:15:20 UTC (rev 19716)
@@ -1,660 +0,0 @@
-<?php
-//
-//  FPDI - Version 1.2
-//
-//    Copyright 2004-2007 Setasign - Jan Slabon
-//
-//  Licensed under the Apache License, Version 2.0 (the "License");
-//  you may not use this file except in compliance with the License.
-//  You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-//  Unless required by applicable law or agreed to in writing, software
-//  distributed under the License is distributed on an "AS IS" BASIS,
-//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//  See the License for the specific language governing permissions and
-//  limitations under the License.
-//
-
-if (!defined ('PDF_TYPE_NULL'))
-    define ('PDF_TYPE_NULL', 0);
-if (!defined ('PDF_TYPE_NUMERIC'))
-    define ('PDF_TYPE_NUMERIC', 1);
-if (!defined ('PDF_TYPE_TOKEN'))
-    define ('PDF_TYPE_TOKEN', 2);
-if (!defined ('PDF_TYPE_HEX'))
-    define ('PDF_TYPE_HEX', 3);
-if (!defined ('PDF_TYPE_STRING'))
-    define ('PDF_TYPE_STRING', 4);
-if (!defined ('PDF_TYPE_DICTIONARY'))
-    define ('PDF_TYPE_DICTIONARY', 5);
-if (!defined ('PDF_TYPE_ARRAY'))
-    define ('PDF_TYPE_ARRAY', 6);
-if (!defined ('PDF_TYPE_OBJDEC'))
-    define ('PDF_TYPE_OBJDEC', 7);
-if (!defined ('PDF_TYPE_OBJREF'))
-    define ('PDF_TYPE_OBJREF', 8);
-if (!defined ('PDF_TYPE_OBJECT'))
-    define ('PDF_TYPE_OBJECT', 9);
-if (!defined ('PDF_TYPE_STREAM'))
-    define ('PDF_TYPE_STREAM', 10);
-
-require_once("pdf_context.php");
-require_once("wrapper_functions.php");
-
-class pdf_parser {
-	
-	/**
-     * Filename
-     * @var string
-     */
-    var $filename;
-    
-    /**
-     * File resource
-     * @var resource
-     */
-    var $f;
-    
-    /**
-     * PDF Context
-     * @var object pdf_context-Instance
-     */
-    var $c;
-    
-    /**
-     * xref-Data
-     * @var array
-     */
-    var $xref;
-
-    /**
-     * root-Object
-     * @var array
-     */
-    var $root;
-	
-    
-    /**
-     * Constructor
-     *
-     * @param string $filename  Source-Filename
-     */
-	function pdf_parser($filename) {
-        $this->filename = $filename;
-        
-        $this->f = @fopen($this->filename, "rb");
-
-        if (!$this->f)
-            $this->error(sprintf("Cannot open %s !", $filename));
-
-        $this->getPDFVersion();
-
-        $this->c =& new pdf_context($this->f);
-        // Read xref-Data
-        $this->pdf_read_xref($this->xref, $this->pdf_find_xref());
-
-        // Check for Encryption
-        $this->getEncryption();
-
-        // Read root
-        $this->pdf_read_root();
-    }
-    
-    /**
-     * Close the opened file
-     */
-    function closeFile() {
-    	if (isset($this->f)) {
-    	    fclose($this->f);	
-    		unset($this->f);
-    	}	
-    }
-    
-    /**
-     * Print Error and die
-     *
-     * @param string $msg  Error-Message
-     */
-    function error($msg) {
-    	die("<b>PDF-Parser Error:</b> ".$msg);	
-    }
-    
-    /**
-     * Check Trailer for Encryption
-     */
-    function getEncryption() {
-        if (isset($this->xref['trailer'][1]['/Encrypt'])) {
-            $this->error("File is encrypted!");
-        }
-    }
-    
-	/**
-     * Find/Return /Root
-     *
-     * @return array
-     */
-    function pdf_find_root() {
-        if ($this->xref['trailer'][1]['/Root'][0] != PDF_TYPE_OBJREF) {
-            $this->error("Wrong Type of Root-Element! Must be an indirect reference");
-        }
-        return $this->xref['trailer'][1]['/Root'];
-    }
-
-    /**
-     * Read the /Root
-     */
-    function pdf_read_root() {
-        // read root
-        $this->root = $this->pdf_resolve_object($this->c, $this->pdf_find_root());
-    }
-    
-    /**
-     * Get PDF-Version
-     *
-     * And reset the PDF Version used in FPDI if needed
-     */
-    function getPDFVersion() {
-        fseek($this->f, 0);
-        preg_match("/\d\.\d/",fread($this->f,16),$m);
-        $this->pdfVersion = $m[0];
-    }
-    
-    /**
-     * Find the xref-Table
-     */
-    function pdf_find_xref() {
-       	fseek ($this->f, -min(filesize($this->filename),1500), SEEK_END);
-        $data = fread($this->f, 1500);
-        
-        $pos = strlen($data) - strpos(strrev($data), strrev('startxref')); 
-        $data = substr($data, $pos);
-        
-        if (!preg_match('/\s*(\d+).*$/s', $data, $matches)) {
-            $this->error("Unable to find pointer to xref table");
-    	}
-
-    	return (int) $matches[1];
-    }
-
-    /**
-     * Read xref-table
-     *
-     * @param array $result Array of xref-table
-     * @param integer $offset of xref-table
-     * @param integer $start start-position in xref-table
-     * @param integer $end end-position in xref-table
-     */
-    function pdf_read_xref(&$result, $offset, $start = null, $end = null) {
-        if (is_null ($start) || is_null ($end)) {
-		    fseek($this->f, $o_pos = $offset);
-            $data = trim(fgets($this->f,1024));
-            	        
-            if (strlen($data) == 0) 
-                $data = trim(fgets($this->f,1024));
-            		
-            if ($data !== 'xref') {
-            	fseek($this->f, $o_pos);
-            	$data = trim(_fgets($this->f, true));
-            	if ($data !== 'xref') {
-            	    if (preg_match('/(.*xref)(.*)/m', $data, $m)) { // xref 0 128 - in one line
-                        fseek($this->f, $o_pos+strlen($m[1]));            	        
-            	    } elseif (preg_match('/(x|r|e|f)+/', $data, $m)) { // correct invalid xref-pointer
-            	        $tmpOffset = $offset-4+strlen($m[0]);
-            	        $this->pdf_read_xref($result, $tmpOffset, $start, $end);
-            	        return;
-                    } else {
-                        $this->error("Unable to find xref table - Maybe a Problem with 'auto_detect_line_endings'");
-            	    }
-            	}
-    		}
-
-    		$o_pos = ftell($this->f);
-    	    $data = explode(' ', trim(fgets($this->f,1024)));
-			if (count($data) != 2) {
-    	        fseek($this->f, $o_pos);
-    	        $data = explode(' ', trim(_fgets($this->f, true)));
-			
-            	if (count($data) != 2) {
-            	    if (count($data) > 2) { // no lineending
-            	        $n_pos = $o_pos+strlen($data[0])+strlen($data[1])+2;
-            	        fseek($this->f, $n_pos);
-            	    } else {
-                        $this->error("Unexpected header in xref table");
-            	    }
-            	}
-            }
-            $start = $data[0];
-            $end = $start + $data[1];
-        }
-
-        if (!isset($result['xref_location'])) {
-            $result['xref_location'] = $offset;
-    	}
-
-    	if (!isset($result['max_object']) || $end > $result['max_object']) {
-    	    $result['max_object'] = $end;
-    	}
-
-    	for (; $start < $end; $start++) {
-    		$data = ltrim(fread($this->f, 20)); // Spezifications says: 20 bytes including newlines
-    		$offset = substr($data, 0, 10);
-    		$generation = substr($data, 11, 5);
-
-    	    if (!isset ($result['xref'][$start][(int) $generation])) {
-    	    	$result['xref'][$start][(int) $generation] = (int) $offset;
-    	    }
-    	}
-
-    	$o_pos = ftell($this->f);
-        $data = fgets($this->f,1024);
-		if (strlen(trim($data)) == 0) 
-		    $data = fgets($this->f, 1024);
-        
-        if (preg_match("/trailer/",$data)) {
-            if (preg_match("/(.*trailer[ \n\r]*)/",$data,$m)) {
-            	fseek($this->f, $o_pos+strlen($m[1]));
-    		}
-    		
-			$c =&  new pdf_context($this->f);
-    	    $trailer = $this->pdf_read_value($c);
-    	    
-    	    if (isset($trailer[1]['/Prev'])) {
-    	    	$this->pdf_read_xref($result, $trailer[1]['/Prev'][1]);
-    		    $result['trailer'][1] = array_merge($result['trailer'][1], $trailer[1]);
-    	    } else {
-    	        $result['trailer'] = $trailer;
-            }
-    	} else {
-    	    $data = explode(' ', trim($data));
-            
-    		if (count($data) != 2) {
-            	fseek($this->f, $o_pos);
-        		$data = explode(' ', trim (_fgets ($this->f, true)));
-
-        		if (count($data) != 2) {
-        		    $this->error("Unexpected data in xref table");
-        		}
-		    }
-		    
-		    $this->pdf_read_xref($result, null, (int) $data[0], (int) $data[0] + (int) $data[1]);
-    	}
-    }
-
-
-    /**
-     * Reads an Value
-     *
-     * @param object $c pdf_context
-     * @param string $token a Token
-     * @return mixed
-     */
-    function pdf_read_value(&$c, $token = null) {
-    	if (is_null($token)) {
-    	    $token = $this->pdf_read_token($c);
-    	}
-    	
-        if ($token === false) {
-    	    return false;
-    	}
-
-       	switch ($token) {
-            case	'<':
-    			// This is a hex string.
-    			// Read the value, then the terminator
-
-                $pos = $c->offset;
-
-    			while(1) {
-
-                    $match = strpos ($c->buffer, '>', $pos);
-				
-    				// If you can't find it, try
-    				// reading more data from the stream
-
-    				if ($match === false) {
-    					if (!$c->increase_length()) {
-    						return false;
-    					} else {
-                        	continue;
-                    	}
-    				}
-
-    				$result = substr ($c->buffer, $c->offset, $match - $c->offset);
-    				$c->offset = $match+1;
-    				
-    				return array (PDF_TYPE_HEX, $result);
-                }
-                
-                break;
-    		case	'<<':
-    			// This is a dictionary.
-
-    			$result = array();
-
-    			// Recurse into this function until we reach
-    			// the end of the dictionary.
-    			while (($key = $this->pdf_read_token($c)) !== '>>') {
-    				if ($key === false) {
-    					return false;
-    				}
-					
-    				if (($value =   $this->pdf_read_value($c)) === false) {
-    					return false;
-    				}
-                    $result[$key] = $value;
-    			}
-				
-    			return array (PDF_TYPE_DICTIONARY, $result);
-
-    		case	'[':
-    			// This is an array.
-
-    			$result = array();
-
-    			// Recurse into this function until we reach
-    			// the end of the array.
-    			while (($token = $this->pdf_read_token($c)) !== ']') {
-                    if ($token === false) {
-    					return false;
-    				}
-					
-    				if (($value = $this->pdf_read_value($c, $token)) === false) {
-                        return false;
-    				}
-					
-    				$result[] = $value;
-    			}
-    			
-                return array (PDF_TYPE_ARRAY, $result);
-
-    		case	'('		:
-                // This is a string
-
-    			$pos = $c->offset;
-
-    			while(1) {
-
-                    // Start by finding the next closed
-    				// parenthesis
-
-    				$match = strpos ($c->buffer, ')', $pos);
-
-    				// If you can't find it, try
-    				// reading more data from the stream
-
-    				if ($match === false) {
-    					if (!$c->increase_length()) {
-                            return false;
-    					} else {
-                            continue;
-                        }
-    				}
-
-    				// Make sure that there is no backslash
-    				// before the parenthesis. If there is,
-    				// move on. Otherwise, return the string.
-                    $esc = preg_match('/([\\\\]+)$/', $tmpresult = substr($c->buffer, $c->offset, $match - $c->offset), $m);
-                    
-                    if ($esc === 0 || strlen($m[1]) % 2 == 0) {
-    				    $result = $tmpresult;
-                        $c->offset = $match + 1;
-                        return array (PDF_TYPE_STRING, $result);
-    				} else {
-    					$pos = $match + 1;
-
-    					if ($pos > $c->offset + $c->length) {
-    						$c->increase_length();
-    					}
-    				}    				
-                }
-
-            case "stream":
-            	$o_pos = ftell($c->file)-strlen($c->buffer);
-		        $o_offset = $c->offset;
-		        
-		        $c->reset($startpos = $o_pos + $o_offset);
-		        
-		        $e = 0; // ensure line breaks in front of the stream
-		        if ($c->buffer[0] == chr(10) || $c->buffer[0] == chr(13))
-		        	$e++;
-		        if ($c->buffer[1] == chr(10) && $c->buffer[0] != chr(10))
-		        	$e++;
-		        
-		        if ($this->actual_obj[1][1]['/Length'][0] == PDF_TYPE_OBJREF) {
-		        	$tmp_c =& new pdf_context($this->f);
-		        	$tmp_length = $this->pdf_resolve_object($tmp_c,$this->actual_obj[1][1]['/Length']);
-		        	$length = $tmp_length[1][1];
-		        } else {
-		        	$length = $this->actual_obj[1][1]['/Length'][1];	
-		        }
-		        
-		        if ($length > 0) {
-    		        $c->reset($startpos+$e,$length);
-    		        $v = $c->buffer;
-		        } else {
-		            $v = '';   
-		        }
-		        $c->reset($startpos+$e+$length+9); // 9 = strlen("endstream")
-		        
-		        return array(PDF_TYPE_STREAM, $v);
-		        
-    		default	:
-            	if (is_numeric ($token)) {
-                    // A numeric token. Make sure that
-    				// it is not part of something else.
-    				if (($tok2 = $this->pdf_read_token ($c)) !== false) {
-                        if (is_numeric ($tok2)) {
-
-    						// Two numeric tokens in a row.
-    						// In this case, we're probably in
-    						// front of either an object reference
-    						// or an object specification.
-    						// Determine the case and return the data
-    						if (($tok3 = $this->pdf_read_token ($c)) !== false) {
-                                switch ($tok3) {
-    								case	'obj'	:
-                                        return array (PDF_TYPE_OBJDEC, (int) $token, (int) $tok2);
-    								case	'R'		:
-    									return array (PDF_TYPE_OBJREF, (int) $token, (int) $tok2);
-    							}
-    							// If we get to this point, that numeric value up
-    							// there was just a numeric value. Push the extra
-    							// tokens back into the stack and return the value.
-    							array_push ($c->stack, $tok3);
-    						}
-    					}
-
-    					array_push ($c->stack, $tok2);
-    				}
-
-    				return array (PDF_TYPE_NUMERIC, $token);
-    			} else {
-
-                    // Just a token. Return it.
-    				return array (PDF_TYPE_TOKEN, $token);
-    			}
-
-         }
-    }
-    
-    /**
-     * Resolve an object
-     *
-     * @param object $c pdf_context
-     * @param array $obj_spec The object-data
-     * @param boolean $encapsulate Must set to true, cause the parsing and fpdi use this method only without this para
-     */
-    function pdf_resolve_object(&$c, $obj_spec, $encapsulate = true) {
-        // Exit if we get invalid data
-    	if (!is_array($obj_spec)) {
-            return false;
-    	}
-
-    	if ($obj_spec[0] == PDF_TYPE_OBJREF) {
-
-    		// This is a reference, resolve it
-    		if (isset($this->xref['xref'][$obj_spec[1]][$obj_spec[2]])) {
-
-    			// Save current file position
-    			// This is needed if you want to resolve
-    			// references while you're reading another object
-    			// (e.g.: if you need to determine the length
-    			// of a stream)
-
-    			$old_pos = ftell($c->file);
-
-    			// Reposition the file pointer and
-    			// load the object header.
-				
-    			$c->reset($this->xref['xref'][$obj_spec[1]][$obj_spec[2]]);
-
-    			$header = $this->pdf_read_value($c,null,true);
-
-    			if ($header[0] != PDF_TYPE_OBJDEC || $header[1] != $obj_spec[1] || $header[2] != $obj_spec[2]) {
-    				$this->error("Unable to find object ({$obj_spec[1]}, {$obj_spec[2]}) at expected location");
-    			}
-
-    			// If we're being asked to store all the information
-    			// about the object, we add the object ID and generation
-    			// number for later use
-				$this->actual_obj =& $result;
-    			if ($encapsulate) {
-    				$result = array (
-    					PDF_TYPE_OBJECT,
-    					'obj' => $obj_spec[1],
-    					'gen' => $obj_spec[2]
-    				);
-    			} else {
-    				$result = array();
-    			}
-
-    			// Now simply read the object data until
-    			// we encounter an end-of-object marker
-    			while(1) {
-                    $value = $this->pdf_read_value($c);
-					if ($value === false || count($result) > 4) {
-						// in this case the parser coudn't find an endobj so we break here
-						break;
-    				}
-
-    				if ($value[0] == PDF_TYPE_TOKEN && $value[1] === 'endobj') {
-    					break;
-    				}
-
-                    $result[] = $value;
-    			}
-
-    			$c->reset($old_pos);
-
-                if (isset($result[2][0]) && $result[2][0] == PDF_TYPE_STREAM) {
-                    $result[0] = PDF_TYPE_STREAM;
-                }
-
-    			return $result;
-    		}
-    	} else {
-    		return $obj_spec;
-    	}
-    }
-
-    
-    
-    /**
-     * Reads a token from the file
-     *
-     * @param object $c pdf_context
-     * @return mixed
-     */
-    function pdf_read_token(&$c)
-    {
-    	// If there is a token available
-    	// on the stack, pop it out and
-    	// return it.
-
-    	if (count($c->stack)) {
-    		return array_pop($c->stack);
-    	}
-
-    	// Strip away any whitespace
-
-    	do {
-    		if (!$c->ensure_content()) {
-    			return false;
-    		}
-    		$c->offset += _strspn($c->buffer, " \n\r\t", $c->offset);
-    	} while ($c->offset >= $c->length - 1);
-
-    	// Get the first character in the stream
-
-    	$char = $c->buffer[$c->offset++];
-
-    	switch ($char) {
-
-    		case '['	:
-    		case ']'	:
-    		case '('	:
-    		case ')'	:
-
-    			// This is either an array or literal string
-    			// delimiter, Return it
-
-    			return $char;
-
-    		case '<'	:
-    		case '>'	:
-
-    			// This could either be a hex string or
-    			// dictionary delimiter. Determine the
-    			// appropriate case and return the token
-
-    			if ($c->buffer[$c->offset] == $char) {
-    				if (!$c->ensure_content()) {
-    				    return false;
-    				}
-    				$c->offset++;
-    				return $char . $char;
-    			} else {
-    				return $char;
-    			}
-
-    		default		:
-
-    			// This is "another" type of token (probably
-    			// a dictionary entry or a numeric value)
-    			// Find the end and return it.
-
-    			if (!$c->ensure_content()) {
-    				return false;
-    			}
-
-    			while(1) {
-
-    				// Determine the length of the token
-
-    				$pos = _strcspn($c->buffer, " []<>()\r\n\t/", $c->offset);
-    				if ($c->offset + $pos <= $c->length - 1) {
-    					break;
-    				} else {
-    					// If the script reaches this point,
-    					// the token may span beyond the end
-    					// of the current buffer. Therefore,
-    					// we increase the size of the buffer
-    					// and try again--just to be safe.
-
-    					$c->increase_length();
-    				}
-    			}
-
-    			$result = substr($c->buffer, $c->offset - 1, $pos + 1);
-
-    			$c->offset += $pos;
-    			return $result;
-    	}
-    }
-
-	
-}
-
-?>

$Bii4kR&(B: branches/version-2_5-dev/data/pdf/wrapper_functions.php
===================================================================
--- branches/version-2_5-dev/data/pdf/wrapper_functions.php	2010-12-10 13:27:59 UTC (rev 19715)
+++ branches/version-2_5-dev/data/pdf/wrapper_functions.php	2010-12-11 03:15:20 UTC (rev 19716)
@@ -1,88 +0,0 @@
-<?php
-//
-//  FPDI - Version 1.2
-//
-//    Copyright 2004-2007 Setasign - Jan Slabon
-//
-//  Licensed under the Apache License, Version 2.0 (the "License");
-//  you may not use this file except in compliance with the License.
-//  You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-//  Unless required by applicable law or agreed to in writing, software
-//  distributed under the License is distributed on an "AS IS" BASIS,
-//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//  See the License for the specific language governing permissions and
-//  limitations under the License.
-//
-
-
-if (!defined("PHP_VER_LOWER43")) 
-	define("PHP_VER_LOWER43", version_compare(PHP_VERSION, "4.3", "<"));
-
-
-/**
- * ensure that strspn works correct if php-version < 4.3
- */
-function _strspn($str1, $str2, $start=null, $length=null) {
-    $numargs = func_num_args();
-
-    if (PHP_VER_LOWER43 == 1) {
-        if (isset($length)) {
-            $str1 = substr($str1, $start, $length);
-        } else {
-            $str1 = substr($str1, $start);
-        }
-    }
-
-    if ($numargs == 2 || PHP_VER_LOWER43 == 1) {
-        return strspn($str1, $str2);
-    } else if ($numargs == 3) {
-        return strspn($str1, $str2, $start);
-    } else {
-        return strspn($str1, $str2, $start, $length);
-    }
-}
-
-
-/**
- * ensure that strcspn works correct if php-version < 4.3
- */
-function _strcspn($str1, $str2, $start=null, $length=null) {
-    $numargs = func_num_args();
-
-    if (PHP_VER_LOWER43 == 1) {
-        if (isset($length)) {
-            $str1 = substr($str1, $start, $length);
-        } else {
-            $str1 = substr($str1, $start);
-        }
-    }
-
-    if ($numargs == 2 || PHP_VER_LOWER43 == 1) {
-        return strcspn($str1, $str2);
-    } else if ($numargs == 3) {
-        return strcspn($str1, $str2, $start);
-    } else {
-        return strcspn($str1, $str2, $start, $length);
-    }
-}
-
-
-/**
- * ensure that fgets works correct if php-version < 4.3
- */
-function _fgets (&$h, $force=false) {
-    $startpos = ftell($h);
-	$s = fgets($h, 1024);
-    
-    if ((PHP_VER_LOWER43 == 1 || $force) && preg_match("/^([^\r\n]*[\r\n]{1,2})(.)/",trim($s), $ns)) {
-		$s = $ns[1];
-		fseek($h,$startpos+strlen($s));
-	}
-	
-	return $s;
-}
-
-?>




Svn-src-all メーリングリストの案内