<?php
require('fpdf.php');
class FPDF2File extends FPDF
{
protected $f;
public function Open($file='doc.pdf')
{
$this->f = fopen($file,'wb');
if(!$this->f)
$this->Error('Unable to create output file: '.$file);
$this->_putheader();
}
public function Image($file, $x=null, $y=null, $w=0, $h=0, $type='', $link='')
{
if(!isset($this->images[$file]))
{
// Retrieve only metadata
$a = getimagesize($file);
if($a===false)
$this->Error('Missing or incorrect image file: '.$file);
$this->images[$file] = array('w'=>$a[0], 'h'=>$a[1], 'type'=>$a[2], 'i'=>count($this->images)+1);
}
parent::Image($file,$x,$y,$w,$h,$type,$link);
}
public function Output($dest='', $name='', $isUTF8=false)
{
if($this->state<3)
$this->Close();
}
protected function _endpage()
{
parent::_endpage();
// Write page to file
$this->_putstreamobject($this->pages[$this->page]);
unset($this->pages[$this->page]);
}
protected function _getoffset()
{
return ftell($this->f);
}
protected function _put($s)
{
fwrite($this->f,$s."\n",strlen($s)+1);
}
protected function _putimages()
{
foreach(array_keys($this->images) as $file)
{
$type = $this->images[$file]['type'];
if($type==1)
$info=$this->_parsegif($file);
elseif($type==2)
$info=$this->_parsejpg($file);
elseif($type==3)
$info=$this->_parsepng($file);
else
$this->Error('Unsupported image type: '.$file);
$this->_putimage($info);
$this->images[$file]['n'] = $info['n'];
unset($info);
}
}
protected function _putpage($n)
{
$this->_newobj();
$this->_put('<</Type /Page');
$this->_put('/Parent 1 0 R');
if(isset($this->PageInfo[$n]['size']))
$this->_put(sprintf('/MediaBox [0 0 %.2F %.2F]',$this->PageInfo[$n]['size'][0],$this->PageInfo[$n]['size'][1]));
if(isset($this->PageInfo[$n]['rotation']))
$this->_put('/Rotate '.$this->PageInfo[$n]['rotation']);
$this->_put('/Resources 2 0 R');
if(!empty($this->PageLinks[$n]))
{
$s = '/Annots [';
foreach($this->PageLinks[$n] as $pl)
$s .= $pl[5].' 0 R ';
$s .= ']';
$this->_put($s);
}
if($this->WithAlpha)
$this->_put('/Group <</Type /Group /S /Transparency /CS /DeviceRGB>>');
$this->_put('/Contents '.(2+$n).' 0 R>>');
$this->_put('endobj');
// Link annotations
$this->_putlinks($n);
}
protected function _putpages()
{
$nb = $this->page;
$n = $this->n;
for($i=1;$i<=$nb;$i++)
{
$this->PageInfo[$i]['n'] = ++$n;
foreach($this->PageLinks[$i] as &$pl)
$pl[5] = ++$n;
unset($pl);
}
for($i=1;$i<=$nb;$i++)
$this->_putpage($i);
// Pages root
$this->_newobj(1);
$this->_put('<</Type /Pages');
$kids = '/Kids [';
for($i=1;$i<=$nb;$i++)
$kids .= $this->PageInfo[$i]['n'].' 0 R ';
$kids .= ']';
$this->_put($kids);
$this->_put('/Count '.$nb);
if($this->DefOrientation=='P')
{
$w = $this->DefPageSize[0];
$h = $this->DefPageSize[1];
}
else
{
$w = $this->DefPageSize[1];
$h = $this->DefPageSize[0];
}
$this->_put(sprintf('/MediaBox [0 0 %.2F %.2F]',$w*$this->k,$h*$this->k));
$this->_put('>>');
$this->_put('endobj');
}
protected function _putheader()
{
if($this->_getoffset()==0)
parent::_putheader();
}
protected function _enddoc()
{
parent::_enddoc();
fclose($this->f);
}
}
?>