Current location: Hot Scripts Forums » Programming Languages » PHP » Problem with FPDF, please help.

Problem with FPDF, please help.

Reply
  #1 (permalink)  
Old 06-05-09, 05:23 AM
conmen80 conmen80 is offline
Newbie Coder
 
Join Date: May 2009
Posts: 16
Thanks: 0
Thanked 0 Times in 0 Posts
Problem with FPDF, please help.

i wanna to use FPDF to convert html page to pdf file, user will input the item(s) they ordered from a form, after will come out the items for each will listed in a html table format and output as pdf for offline reference.

Now is what i annoyed to deal with fpdf, i want to copy all content from the html table items which user entered previously, convert it to a pdf file and email to the user, but from the example tough by fpdf are no guidance of how to pass previous page contents into it class -> cell(),

PHP Code:
$pdf->Cell(0,10,'Content_of_previous_page'); 

hope somebody here can give me an assist of that,
thanks in advance.

Last edited by conmen80; 06-05-09 at 05:34 AM.
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Share on FacebookShare on Stumble UponShare on Twitter
Reply With Quote
  #2 (permalink)  
Old 06-05-09, 08:12 AM
job0107's Avatar
job0107 job0107 is offline
Community Liaison
 
Join Date: Dec 2006
Location: Tacoma, Washington USA
Posts: 2,726
Thanks: 0
Thanked 32 Times in 32 Posts
What does your form look like?
__________________
Jerry Broughton
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Share on FacebookShare on Stumble UponShare on Twitter
Reply With Quote
  #3 (permalink)  
Old 06-07-09, 08:01 AM
conmen80 conmen80 is offline
Newbie Coder
 
Join Date: May 2009
Posts: 16
Thanks: 0
Thanked 0 Times in 0 Posts
i had 6 input fields in the form, just a very normal html table show in the page, regard field_01 to field_06 and has a cell data into each.

does anyone have an idea?
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Share on FacebookShare on Stumble UponShare on Twitter
Reply With Quote
  #4 (permalink)  
Old 06-08-09, 01:59 AM
job0107's Avatar
job0107 job0107 is offline
Community Liaison
 
Join Date: Dec 2006
Location: Tacoma, Washington USA
Posts: 2,726
Thanks: 0
Thanked 32 Times in 32 Posts
Quote:
Originally Posted by conmen80 View Post
i had 6 input fields in the form, just a very normal html table show in the page, regard field_01 to field_06 and has a cell data into each.

does anyone have an idea?
This will save your data as a simple table (no header, no frills) in a file called "myFile.pdf".

I used a simple table because you were not very helpful on how you wanted the finished table to look like.

Then you can attach "myFile.pdf" to an email.

pdf.php
PHP Code:
<?php
require('fpdf.php');

class 
PDF extends FPDF
{
 
//Load data
 
function LoadData($file)
 {
  
//Read file lines
  
$lines=file($file);
  
$data=array();
  foreach(
$lines as $line)
   
$data[]=explode(';',chop($line));
  return 
$data;
  }

 
//Simple table
 
function BasicTable($header,$data,$column_width)
 {
  
//Header
  
if($header)
  {
   foreach(
$header as $col)
    
$this->Cell(20,7,$col,1);
   
$this->Ln();
   }
  
//Data
  
foreach($data as $row)
  {
   foreach(
$row as $col)
    
$this->Cell($column_width,10,$col,1);
   
$this->Ln();
   }
  }
 }

$pdf=new PDF();
//Data loading
$data = array();
$data[] = array($_POST["field_01"]);
$data[] = array($_POST["field_02"]);
$data[] = array($_POST["field_03"]);
$data[] = array($_POST["field_04"]);
$data[] = array($_POST["field_05"]);
$data[] = array($_POST["field_06"]);

$pdf->SetFont('Arial','',14);
$pdf->AddPage();
$pdf->BasicTable("",$data,100);
$pdf->Output("myFile.pdf","F");
?>
fpdf.php
PHP Code:
<?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>&& $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==&& $g==&& $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==&& $g==&& $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==&& $g==&& $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(00);
    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>&& $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==&& $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==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>&& !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;
}

?>
__________________
Jerry Broughton
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Share on FacebookShare on Stumble UponShare on Twitter
Reply With Quote
  #5 (permalink)  
Old 06-08-09, 10:46 PM
conmen80 conmen80 is offline
Newbie Coder
 
Join Date: May 2009
Posts: 16
Thanks: 0
Thanked 0 Times in 0 Posts
thanks job0107, the sample your shown is nice used in form input conversion, but its doesn't look what i need.

you can just ignore the form input part, because user input will print to html table onward for temporary data hold, once they ensure all record(s) is firm, will click a button to generate a pdf and send to user email, the pdf will look exactly same like previous page as seen, its included user info on header other than the html table.

thanks!!!
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Share on FacebookShare on Stumble UponShare on Twitter
Reply With Quote
  #6 (permalink)  
Old 06-09-09, 10:04 AM
sharyjunco sharyjunco is offline
New Member
 
Join Date: Jun 2009
Posts: 3
Thanks: 0
Thanked 0 Times in 0 Posts
Can you help me job0107?

Hey job0107,

Your post on php scripts were very helpful, would you know how to set up your scripts to offer 2 columns? I like the result of the layout but I need to make my document in 2 columns so I can fit everything into 1 page. I've been trying to find scripts that can layout the received pdfs nicely but nothing is working.

Thanks a bunch!

Shary
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Share on FacebookShare on Stumble UponShare on Twitter
Reply With Quote
  #7 (permalink)  
Old 06-09-09, 10:15 PM
job0107's Avatar
job0107 job0107 is offline
Community Liaison
 
Join Date: Dec 2006
Location: Tacoma, Washington USA
Posts: 2,726
Thanks: 0
Thanked 32 Times in 32 Posts
Quote:
Originally Posted by sharyjunco View Post
Hey job0107,

Your post on php scripts were very helpful, would you know how to set up your scripts to offer 2 columns? I like the result of the layout but I need to make my document in 2 columns so I can fit everything into 1 page. I've been trying to find scripts that can layout the received pdfs nicely but nothing is working.

Thanks a bunch!

Shary
The $data array is a multidimensional array, arranged by row and column.
So the inner arrays represent the columns.
And the more elements you have in the inner arrays, the more columns you will have.

This version of the $data array is set up with three rows and two columns.
PHP Code:
<?php
require('fpdf.php');

class 
PDF extends FPDF
{
 
//Load data
 
function LoadData($file)
 {
  
//Read file lines
  
$lines=file($file);
  
$data=array();
  foreach(
$lines as $line)
   
$data[]=explode(';',chop($line));
  return 
$data;
  }

 
//Simple table
 
function BasicTable($header,$data,$column_width)
 {
  
//Header
  
if($header)
  {
   foreach(
$header as $col)
    
$this->Cell(20,7,$col,1);
   
$this->Ln();
   }
  
//Data
  
foreach($data as $row)
  {
   foreach(
$row as $col)
    
$this->Cell($column_width,10,$col,1); // Change the value 10, to change the height of the rows.
   
$this->Ln();
   }
  }
 }

$pdf=new PDF();
//Data loading
$data = array();

// This configuration gives you three rows and two columns. //
$data[] = array($_POST["field_01"],$_POST["field_02"]);
$data[] = array($_POST["field_03"],$_POST["field_04"]);
$data[] = array($_POST["field_05"],$_POST["field_06"]);

// This would be two rows and three columns. //
/*
$data[] = array($_POST["field_01"],$_POST["field_02"],$_POST["field_03"]);
$data[] = array($_POST["field_04"],$_POST["field_05"],$_POST["field_06"]);
*/
//////////////////////////////////////////////

// And this would be one row and six columns. //
/*
$data[] = array($_POST["field_01"],$_POST["field_02"],$_POST["field_03"],$_POST["field_04"],$_POST["field_05"],$_POST["field_06"]);
*/
//////////////////////////////////////////////

$pdf->SetFont('Arial','',14);
$pdf->AddPage();
$pdf->BasicTable("",$data,50);  // Change the value 50, to change the width oh the columns.

// Disable this line and enable the next line to output to a file. //
$pdf->Output();
// $pdf->Output("myFile.pdf","F");
?>
__________________
Jerry Broughton
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Share on FacebookShare on Stumble UponShare on Twitter
Reply With Quote
  #8 (permalink)  
Old 06-10-09, 09:54 AM
sharyjunco sharyjunco is offline
New Member
 
Join Date: Jun 2009
Posts: 3
Thanks: 0
Thanked 0 Times in 0 Posts
One last question :>

YES!! You're the best, the only thing I need to figure out now is how to add specific styles (ex: bold or underline attributes) to certain areas. For instance, I've set up my arrays like this:

$data[] = array("DATE SUBMITTED: ",$_POST["date"]);
$data[] = array("NAME: ",$_POST["name"]);
$data[] = array("ADDRESS: ",$_POST["address"]);
$data[] = array("CITY: ",$_POST["city"]);
$data[] = array("STATE: ",$_POST["state"]);
$data[] = array("ZIP: ",$_POST["zip"]);
$data[] = array("HOME PHONE: ",$_POST["phone"]);
$data[] = array("CELL PHONE: ",$_POST["cellphone"]);
$data[] = array("E-MAIL: ",$_POST["email"]);
$data[] = array("BEST CONTACT(S)");
$data[] = array($_POST["home_phone"]);
$data[] = array($_POST["cell_phone"]);
$data[] = array($_POST["e_mail"]);
$data[] = array("COMMENTS: ",$_POST["comments"]);

I basically want everything in the first column to be bold so the $_POST information is displayed as the response and is NOT bold in the final PDF. But everything I try like bold tags in [] or altering the set font either won't work or works on all the text in my document.

I also can't figure out why the text runs off the page of my PDF for the COMMENTS section (last line in set of arrays). Does this have to do with my actual form or is it my pdf.php / fpdf.php files?

Thank you so much btw, its really hard to find someone who can understand and actually deliver a resourceful response. You've been a big help
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Share on FacebookShare on Stumble UponShare on Twitter
Reply With Quote
  #9 (permalink)  
Old 06-10-09, 11:03 PM
job0107's Avatar
job0107 job0107 is offline
Community Liaison
 
Join Date: Dec 2006
Location: Tacoma, Washington USA
Posts: 2,726
Thanks: 0
Thanked 32 Times in 32 Posts
First, I put your labels in an array for easier reference ($labels).
Second, I added a way to assign a few attributes to each cell (fontFamily, fontWeight/fontDecoration (ie: B = bold, U = underline and I = italics), fontSize and text alignment within the cell (ie:L = left, R = right and C = center)).

The font attributes can be added to any cell by appending them to the text string.
Unfortunately there is no easy way to assign different font attributes to single characters, unless each character were in a different cell.

The font attributes must be in a specific order.
First they must start with the "*" symbol.
Then the fontFamily, fontWeight, fontSize and text alignment, separated by the ":" symbol.
Example: "*Arial;B;12;C"

PHP Code:
<?php
require('fpdf.php');

class 
PDF extends FPDF
{
 
//Load data
 
function LoadData($file)
 {
  
//Read file lines
  
$lines=file($file);
  
$data=array();
  foreach(
$lines as $line)
   
$data[]=explode(';',chop($line));
  return 
$data;
  }
 
//Simple table
 
function BasicTable($header,$data,$column_width)
 {
  
//Header
  
if($header)
  {
   foreach(
$header as $col)
    
$this->Cell(20,7,$col,1);
   
$this->Ln();
   }
  
//Data
  
foreach($data as $row)
  {
   foreach(
$row as $col)
   {
     
$col_parts explode("*",$col);
     if(
$col_parts[1])
     {
      list(
$font_family,$font_weight,$font_size,$align) = explode(";",$col_parts[1]);
      
$this->SetFont($font_family,$font_weight,$font_size);
      }
     
$this->Cell($column_width,10,$col_parts[0],1,0,$align); // Change the value 10, to change the height of the rows.
    
}
   
$this->Ln();
   }
  }
 }

// ////////// Sample test data. ////////// //
$_POST["date"] = "Jun 9 2009";
$_POST["name"] = "Joe Smith";
$_POST["address"] = "5555 Willow Blvd";
$_POST["city"] = "Rainbow Falls";
$_POST["state"] = "New Zeland";
$_POST["zip"] = 12123;
$_POST["phone"] = "555-555-5555";
$_POST["cellphone"] = "222-222-2222";
$_POST["email"] = "joe@host.com";
$_POST["home_phone"] = $_POST["phone"];
$_POST["cell_phone"] = $_POST["cellphone"];
$_POST["e_mail"] = $_POST["email"];
$_POST["comments"] = "Wow! I am glad that's done.";
// //////////////////////////////// //

$pdf=new PDF();
//Data loading
$labels = array("DATE SUBMITTED: ","NAME: ","ADDRESS: ","CITY: ","STATE: ","ZIP: ","HOME PHONE: ","CELL PHONE: ","E-MAIL: ","BEST CONTACT(S)","COMMENTS: ");
$data = array();
$data[] = array($labels[0]."*Arial;B;12;L",$_POST["date"]."*Arial;U;10;C");
$data[] = array($labels[1]."*Arial;B;12;L",$_POST["name"]."*Arial;;10;L");
$data[] = array($labels[2]."*Arial;B;12;L",$_POST["address"]."*Arial;;10;L");
$data[] = array($labels[3]."*Arial;B;12;L",$_POST["city"]."*Arial;;10;L");
$data[] = array($labels[4]."*Arial;B;12;L",$_POST["state"]."*Arial;;10;L");
$data[] = array($labels[5]."*Arial;B;12;L",$_POST["zip"]."*Arial;;10;L");
$data[] = array($labels[6]."*Arial;B;12;L",$_POST["phone"]."*Arial;;10;C");
$data[] = array($labels[7]."*Arial;B;12;L",$_POST["cellphone"]."*Arial;;10;C");
$data[] = array($labels[8]."*Arial;B;12;L",$_POST["email"]."*Arial;;10;L");
$data[] = array($labels[9]."*Arial;B;12;L");
$data[] = array($_POST["home_phone"]."*Arial;I;10;C");
$data[] = array($_POST["cell_phone"]."*Arial;I;10;C");
$data[] = array($_POST["e_mail"]."*Arial;I;10;C");
$data[] = array($labels[10]."*Arial;B;12;C",$_POST["comments"]."*Arial;B;8;C");




$pdf->SetFont('Arial','',10);
$pdf->AddPage();
$pdf->BasicTable("",$data,50);  // Change the value 50, to change the width oh the columns.

// Disable this line and enable the next line to output to a file. //
$pdf->Output();
// $pdf->Output("myFile.pdf","F");
?>
__________________
Jerry Broughton
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Share on FacebookShare on Stumble UponShare on Twitter
Reply With Quote
  #10 (permalink)  
Old 06-11-09, 09:36 AM
sharyjunco sharyjunco is offline
New Member
 
Join Date: Jun 2009
Posts: 3
Thanks: 0
Thanked 0 Times in 0 Posts
Nice!

Thank you so much!! Would you know anything about text wrapping issues? It's the only problem I have left that I still can't figure out. I'm not sure if its my form or if its my pdf.php / fpdf.php files. Basically my text goes off the emailed PDF page when a comment is added. If the comment is too long it just keeps going as if there is no right margin
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Share on FacebookShare on Stumble UponShare on Twitter
Reply With Quote
Reply

Bookmarks


Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)
 
Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On

Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
Unknown Javascript/Ajax problem vitron JavaScript 9 06-05-09 11:44 AM
login, roles problem dbrook007 ASP.NET 10 11-10-06 03:42 PM
Form Display Problem neevrap02 Visual Basic 1 09-05-06 05:18 AM
Count problem kasic ASP.NET 1 10-20-04 12:23 AM
Asp and Microsoft Access 2002 problem gop373 ASP 2 10-06-04 09:13 AM


All times are GMT -5. The time now is 11:39 PM.
vBulletin® Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.