Files

170 lines
4.7 KiB
PHP
Raw Permalink Normal View History

<?php
/**
* FPDF extension to lower memory consumption
*
* @package Lib
*
* @author Olivier <oliver@fpdf.org>
* @author Andreas Goetz <cpuidle@gmx.de>
* @license Freeware
* @version $Id: fpdf2file.php,v 1.3 2010/04/04 08:51:06 andig2 Exp $
* @version updated for fpdf v1.8 or above copperhead 2022/12/18
* @override for FPDF_VERSION constant added copperhead 2023/01/05
*/
//not requied by vidoeDB
//require('fpdf.php');
class FPDF2File extends FPDF
{
protected $f;
function Open($file='doc.pdf')
{
// The FPDF_VERSION constant was replaced by a class constant in FPDF V1.85
// FPDF2FILE extension to lower memory consumption not yet updated @ 2023/01/05
// if(FPDF_VERSION<'1.8')
if(self::VERSION<'1.8')
$this->Error('Version 1.8 or above is required by this extension');
$this->f=fopen($file,'wb');
if(!$this->f)
$this->Error('Unable to create output file: '.$file);
$this->_putheader();
}
function Image($file, $x=null, $y=null, $w=0, $h=0, $type='', $link='')
{
if(!isset($this->images[$file]))
{
//Retrieve only meta-information
$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);
}
function Output($dest='', $name='', $isUTF8=false)
{
if($this->state<3)
$this->Close();
}
function _endpage()
{
parent::_endpage();
//Write page to file
$this->_putstreamobject($this->pages[$this->page]);
unset($this->pages[$this->page]);
}
function _getoffset()
{
return ftell($this->f);
}
function _put($s)
{
fwrite($this->f,$s."\n",strlen($s)+1);
}
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);
}
}
function _putpages()
{
$nb=$this->page;
for($n=1;$n<=$nb;$n++)
$this->PageInfo[$n]['n']=$this->n+$n;
if($this->DefOrientation=='P')
{
$wPt=$this->DefPageSize[0]*$this->k;
$hPt=$this->DefPageSize[1]*$this->k;
}
else
{
$wPt=$this->DefPageSize[1]*$this->k;
$hPt=$this->DefPageSize[0]*$this->k;
}
//Page objects
for($n=1;$n<=$nb;$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(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]];
if(isset($this->PageInfo[$l[0]]['size']))
$h=$this->PageInfo[$l[0]]['size'][1];
else
$h=$hpt;
$annots.=sprintf('/Dest [%d 0 R /XYZ 0 %.2F null]>>',$this->PageInfo[$l[0]]['n'],$h-$l[1]*$this->k);
}
}
$this->_put($annots.']');
}
if($this->WithAlpha)
$this->_put('/Group <</Type /Group /S /Transparency /CS /DeviceRGB>>');
$this->_put('/Contents '.(2+$n).' 0 R>>');
$this->_put('endobj');
}
//Pages root
$this->offsets[1]=$this->_getoffset();
$this->_put('1 0 obj');
$this->_put('<</Type /Pages');
$kids='/Kids [';
for($n=1;$n<=$nb;$n++)
$kids.=(2+$nb+$n).' 0 R ';
$this->_put($kids.']');
$this->_put('/Count '.$nb);
$this->_put(sprintf('/MediaBox [0 0 %.2F %.2F]',$wPt,$hPt));
$this->_put('>>');
$this->_put('endobj');
}
function _putheader()
{
if($this->_getoffset()==0)
parent::_putheader();
}
function _enddoc()
{
parent::_enddoc();
fclose($this->f);
}
}
?>