new FPDF version

This commit is contained in:
Roland Gruber 2011-10-14 17:13:05 +00:00
parent 84d74d8577
commit 5c58f917f1
4 changed files with 845 additions and 773 deletions

View File

@ -8,7 +8,7 @@ Homepage: http://www.ldap-account-manager.org/
Package: ldap-account-manager
Architecture: all
Depends: php5 (>= 5.2.4), php5-ldap, php5-gd, apache2 | httpd, php-fpdf (>= 1.6), debconf (>= 0.2.26) | debconf-2.0, ${misc:Depends}
Depends: php5 (>= 5.2.4), php5-ldap, php5-gd, apache2 | httpd, php-fpdf (>= 1.7), debconf (>= 0.2.26) | debconf-2.0, ${misc:Depends}
Suggests: ldap-server, php5-mcrypt, ldap-account-manager-lamdaemon, perl
Description: webfrontend for managing accounts in an LDAP directory
LDAP Account Manager (LAM) runs on an existing webserver.

View File

@ -2,12 +2,12 @@
/*******************************************************************************
* FPDF *
* *
* Version: 1.6 *
* Date: 2008-08-03 *
* Version: 1.7 *
* Date: 2011-06-18 *
* Author: Olivier PLATHEY *
*******************************************************************************/
define('FPDF_VERSION','1.6');
define('FPDF_VERSION','1.7');
class FPDF
{
@ -21,10 +21,10 @@ 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 $StdPageSizes; // standard page sizes
var $DefPageSize; // default page size
var $CurPageSize; // current page size
var $PageSizes; // used for pages with non default sizes or orientations
var $wPt, $hPt; // dimensions of current page in points
var $w, $h; // dimensions of current page in user unit
var $lMargin; // left margin
@ -35,7 +35,8 @@ 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 $fontpath; // path containing fonts
var $CoreFonts; // array of core font names
var $fonts; // array of used fonts
var $FontFiles; // array of font files
var $diffs; // array of encoding differences
@ -72,7 +73,7 @@ var $PDFVersion; //PDF version number
* Public methods *
* *
*******************************************************************************/
function FPDF($orientation='P', $unit='mm', $format='A4')
function FPDF($orientation='P', $unit='mm', $size='A4')
{
// Some checks
$this->_dochecks();
@ -100,11 +101,19 @@ function FPDF($orientation='P', $unit='mm', $format='A4')
$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');
// Font path
if(defined('FPDF_FONTPATH'))
{
$this->fontpath = FPDF_FONTPATH;
if(substr($this->fontpath,-1)!='/' && substr($this->fontpath,-1)!='\\')
$this->fontpath .= '/';
}
elseif(is_dir(dirname(__FILE__).'/font'))
$this->fontpath = dirname(__FILE__).'/font/';
else
$this->fontpath = '';
// Core fonts
$this->CoreFonts = array('courier', 'helvetica', 'times', 'symbol', 'zapfdingbats');
// Scale factor
if($unit=='pt')
$this->k = 1;
@ -116,26 +125,25 @@ function FPDF($orientation='P', $unit='mm', $format='A4')
$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),
// Page sizes
$this->StdPageSizes = array('a3'=>array(841.89,1190.55), 'a4'=>array(595.28,841.89), 'a5'=>array(420.94,595.28),
'letter'=>array(612,792), 'legal'=>array(612,1008));
if(is_string($format))
$format=$this->_getpageformat($format);
$this->DefPageFormat=$format;
$this->CurPageFormat=$format;
$size = $this->_getpagesize($size);
$this->DefPageSize = $size;
$this->CurPageSize = $size;
// Page orientation
$orientation = strtolower($orientation);
if($orientation=='p' || $orientation=='portrait')
{
$this->DefOrientation = 'P';
$this->w=$this->DefPageFormat[0];
$this->h=$this->DefPageFormat[1];
$this->w = $size[0];
$this->h = $size[1];
}
elseif($orientation=='l' || $orientation=='landscape')
{
$this->DefOrientation = 'L';
$this->w=$this->DefPageFormat[1];
$this->h=$this->DefPageFormat[0];
$this->w = $size[1];
$this->h = $size[0];
}
else
$this->Error('Incorrect orientation: '.$orientation);
@ -151,8 +159,8 @@ function FPDF($orientation='P', $unit='mm', $format='A4')
$this->LineWidth = .567/$this->k;
// Automatic page break
$this->SetAutoPageBreak(true,2*$margin);
//Full width display mode
$this->SetDisplayMode('fullwidth');
// Default display mode
$this->SetDisplayMode('default');
// Enable compression
$this->SetCompression(true);
// Set default PDF version number
@ -197,7 +205,7 @@ function SetAutoPageBreak($auto, $margin=0)
$this->PageBreakTrigger = $this->h-$margin;
}
function SetDisplayMode($zoom, $layout='continuous')
function SetDisplayMode($zoom, $layout='default')
{
// Set display mode in viewer
if($zoom=='fullpage' || $zoom=='fullwidth' || $zoom=='real' || $zoom=='default' || !is_string($zoom))
@ -294,14 +302,14 @@ function Close()
$this->_enddoc();
}
function AddPage($orientation='', $format='')
function AddPage($orientation='', $size='')
{
// Start a new page
if($this->state==0)
$this->Open();
$family = $this->FontFamily;
$style = $this->FontStyle.($this->underline ? 'U' : '');
$size=$this->FontSizePt;
$fontsize = $this->FontSizePt;
$lw = $this->LineWidth;
$dc = $this->DrawColor;
$fc = $this->FillColor;
@ -317,7 +325,7 @@ function AddPage($orientation='', $format='')
$this->_endpage();
}
// Start new page
$this->_beginpage($orientation,$format);
$this->_beginpage($orientation,$size);
// Set line cap style to square
$this->_out('2 J');
// Set line width
@ -325,7 +333,7 @@ function AddPage($orientation='', $format='')
$this->_out(sprintf('%.2F w',$lw*$this->k));
// Set font
if($family)
$this->SetFont($family,$style,$size);
$this->SetFont($family,$style,$fontsize);
// Set colors
$this->DrawColor = $dc;
if($dc!='0 G')
@ -347,7 +355,7 @@ function AddPage($orientation='', $format='')
}
// Restore font
if($family)
$this->SetFont($family,$style,$size);
$this->SetFont($family,$style,$fontsize);
// Restore colors
if($this->DrawColor!=$dc)
{
@ -452,64 +460,47 @@ function Rect($x, $y, $w, $h, $style='')
function AddFont($family, $style='', $file='')
{
//Add a TrueType or Type1 font
// Add a TrueType, OpenType 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)
$info = $this->_loadfont($file);
$info['i'] = count($this->fonts)+1;
if(!empty($info['diff']))
{
// Search existing encodings
$d=0;
$nb=count($this->diffs);
for($i=1;$i<=$nb;$i++)
$n = array_search($info['diff'],$this->diffs);
if(!$n)
{
if($this->diffs[$i]==$diff)
$n = count($this->diffs)+1;
$this->diffs[$n] = $info['diff'];
}
$info['diffn'] = $n;
}
if(!empty($info['file']))
{
$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);
// Embedded font
if($info['type']=='TrueType')
$this->FontFiles[$info['file']] = array('length1'=>$info['originalsize']);
else
$this->FontFiles[$file]=array('length1'=>$size1, 'length2'=>$size2);
$this->FontFiles[$info['file']] = array('length1'=>$info['size1'], 'length2'=>$info['size2']);
}
$this->fonts[$fontkey] = $info;
}
function SetFont($family, $style='', $size=0)
{
// Select a font; size given in points
global $fpdf_charwidths;
$family=strtolower($family);
if($family=='')
$family = $this->FontFamily;
if($family=='arial')
$family='helvetica';
elseif($family=='symbol' || $family=='zapfdingbats')
$style='';
else
$family = strtolower($family);
$style = strtoupper($style);
if(strpos($style,'U')!==false)
{
@ -525,27 +516,20 @@ function SetFont($family, $style='', $size=0)
// Test if font is already selected
if($this->FontFamily==$family && $this->FontStyle==$style && $this->FontSizePt==$size)
return;
//Test if used for the first time
// Test if font is already loaded
$fontkey = $family.$style;
if(!isset($this->fonts[$fontkey]))
{
//Check if one of the standard fonts
if(isset($this->CoreFonts[$fontkey]))
// Test if one of the core fonts
if($family=='arial')
$family = 'helvetica';
if(in_array($family,$this->CoreFonts))
{
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);
if($family=='symbol' || $family=='zapfdingbats')
$style = '';
$fontkey = $family.$style;
if(!isset($this->fonts[$fontkey]))
$this->AddFont($family,$style);
}
else
$this->Error('Undefined font: '.$family.' '.$style);
@ -626,7 +610,7 @@ function Cell($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link
$this->ws = 0;
$this->_out('0 Tw');
}
$this->AddPage($this->CurOrientation,$this->CurPageFormat);
$this->AddPage($this->CurOrientation,$this->CurPageSize);
$this->x = $x;
if($ws>0)
{
@ -920,17 +904,23 @@ function Image($file, $x=null, $y=null, $w=0, $h=0, $type='', $link='')
}
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;
// Put image at 96 dpi
$w = -96;
$h = -96;
}
elseif($w==0)
if($w<0)
$w = -$info['w']*72/$w/$this->k;
if($h<0)
$h = -$info['h']*72/$h/$this->k;
if($w==0)
$w = $h*$info['w']/$info['h'];
elseif($h==0)
if($h==0)
$h = $w*$info['h']/$info['w'];
// Flowing mode
if($y===null)
{
@ -938,12 +928,13 @@ function Image($file, $x=null, $y=null, $w=0, $h=0, $type='', $link='')
{
// Automatic page break
$x2 = $this->x;
$this->AddPage($this->CurOrientation,$this->CurPageFormat);
$this->AddPage($this->CurOrientation,$this->CurPageSize);
$this->x = $x2;
}
$y = $this->y;
$this->y += $h;
}
if($x===null)
$x = $this->x;
$this->_out(sprintf('q %.2F 0 0 %.2F %.2F %.2F cm /I%d Do Q',$w*$this->k,$h*$this->k,$x*$this->k,($this->h-($y+$h))*$this->k,$info['i']));
@ -1009,34 +1000,24 @@ function Output($name='', $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')
$this->_checkoutput();
if(PHP_SAPI!='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');
$this->_checkoutput();
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':
@ -1069,28 +1050,51 @@ function _dochecks()
// Check mbstring overloading
if(ini_get('mbstring.func_overload') & 2)
$this->Error('mbstring overloading must be disabled');
//Disable runtime magic quotes
// Ensure runtime magic quotes are disabled
if(get_magic_quotes_runtime())
@set_magic_quotes_runtime(0);
}
function _getpageformat($format)
function _checkoutput()
{
$format=strtolower($format);
if(!isset($this->PageFormats[$format]))
$this->Error('Unknown page format: '.$format);
$a=$this->PageFormats[$format];
if(PHP_SAPI!='cli')
{
if(headers_sent($file,$line))
$this->Error("Some data has already been output, can't send PDF file (output started at $file:$line)");
}
if(ob_get_length())
{
// The output buffer is not empty
if(preg_match('/^(\xEF\xBB\xBF)?\s*$/',ob_get_contents()))
{
// It contains only a UTF-8 BOM and/or whitespace, let's clean it
ob_clean();
}
else
$this->Error("Some data has already been output, can't send PDF file");
}
}
function _getpagesize($size)
{
if(is_string($size))
{
$size = strtolower($size);
if(!isset($this->StdPageSizes[$size]))
$this->Error('Unknown page size: '.$size);
$a = $this->StdPageSizes[$size];
return array($a[0]/$this->k, $a[1]/$this->k);
}
function _getfontpath()
else
{
if(!defined('FPDF_FONTPATH') && is_dir(dirname(__FILE__).'/font'))
define('FPDF_FONTPATH',dirname(__FILE__).'/font/');
return defined('FPDF_FONTPATH') ? FPDF_FONTPATH : '';
if($size[0]>$size[1])
return array($size[1], $size[0]);
else
return $size;
}
}
function _beginpage($orientation, $format)
function _beginpage($orientation, $size)
{
$this->page++;
$this->pages[$this->page] = '';
@ -1098,38 +1102,35 @@ function _beginpage($orientation, $format)
$this->x = $this->lMargin;
$this->y = $this->tMargin;
$this->FontFamily = '';
//Check page size
// Check page size and orientation
if($orientation=='')
$orientation = $this->DefOrientation;
else
$orientation = strtoupper($orientation[0]);
if($format=='')
$format=$this->DefPageFormat;
if($size=='')
$size = $this->DefPageSize;
else
$size = $this->_getpagesize($size);
if($orientation!=$this->CurOrientation || $size[0]!=$this->CurPageSize[0] || $size[1]!=$this->CurPageSize[1])
{
if(is_string($format))
$format=$this->_getpageformat($format);
}
if($orientation!=$this->CurOrientation || $format[0]!=$this->CurPageFormat[0] || $format[1]!=$this->CurPageFormat[1])
{
//New size
// New size or orientation
if($orientation=='P')
{
$this->w=$format[0];
$this->h=$format[1];
$this->w = $size[0];
$this->h = $size[1];
}
else
{
$this->w=$format[1];
$this->h=$format[0];
$this->w = $size[1];
$this->h = $size[0];
}
$this->wPt = $this->w*$this->k;
$this->hPt = $this->h*$this->k;
$this->PageBreakTrigger = $this->h-$this->bMargin;
$this->CurOrientation = $orientation;
$this->CurPageFormat=$format;
$this->CurPageSize = $size;
}
if($orientation!=$this->DefOrientation || $format[0]!=$this->DefPageFormat[0] || $format[1]!=$this->DefPageFormat[1])
if($orientation!=$this->DefOrientation || $size[0]!=$this->DefPageSize[0] || $size[1]!=$this->DefPageSize[1])
$this->PageSizes[$this->page] = array($this->wPt, $this->hPt);
}
@ -1138,6 +1139,16 @@ function _endpage()
$this->state = 1;
}
function _loadfont($font)
{
// Load a font definition file from the font directory
include($this->fontpath.$font);
$a = get_defined_vars();
if(!isset($a['name']))
$this->Error('Could not include font definition file');
return $a;
}
function _escape($s)
{
// Escape special characters in strings
@ -1199,7 +1210,7 @@ function _dounderline($x, $y, $txt)
function _parsejpg($file)
{
// Extract info from a JPEG file
$a=GetImageSize($file);
$a = getimagesize($file);
if(!$a)
$this->Error('Missing or incorrect image file: '.$file);
if($a[2]!=2)
@ -1211,12 +1222,7 @@ function _parsejpg($file)
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);
$data = file_get_contents($file);
return array('w'=>$a[0], 'h'=>$a[1], 'cs'=>$colspace, 'bpc'=>$bpc, 'f'=>'DCTDecode', 'data'=>$data);
}
@ -1226,9 +1232,17 @@ function _parsepng($file)
$f = fopen($file,'rb');
if(!$f)
$this->Error('Can\'t open image file: '.$file);
$info = $this->_parsepngstream($f,$file);
fclose($f);
return $info;
}
function _parsepngstream($f, $file)
{
// Check signature
if($this->_readstream($f,8)!=chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10))
$this->Error('Not a PNG file: '.$file);
// Read header chunk
$this->_readstream($f,4);
if($this->_readstream($f,4)!='IHDR')
@ -1239,14 +1253,14 @@ function _parsepng($file)
if($bpc>8)
$this->Error('16-bit depth not supported: '.$file);
$ct = ord($this->_readstream($f,1));
if($ct==0)
if($ct==0 || $ct==4)
$colspace = 'DeviceGray';
elseif($ct==2)
elseif($ct==2 || $ct==6)
$colspace = 'DeviceRGB';
elseif($ct==3)
$colspace = 'Indexed';
else
$this->Error('Alpha channel not supported: '.$file);
$this->Error('Unknown color type: '.$file);
if(ord($this->_readstream($f,1))!=0)
$this->Error('Unknown compression method: '.$file);
if(ord($this->_readstream($f,1))!=0)
@ -1254,7 +1268,8 @@ function _parsepng($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.'>>';
$dp = '/Predictor 15 /Colors '.($colspace=='DeviceRGB' ? 3 : 1).' /BitsPerComponent '.$bpc.' /Columns '.$w;
// Scan chunks looking for palette, transparency and image data
$pal = '';
$trns = '';
@ -1297,10 +1312,54 @@ function _parsepng($file)
$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);
$info = array('w'=>$w, 'h'=>$h, 'cs'=>$colspace, 'bpc'=>$bpc, 'f'=>'FlateDecode', 'dp'=>$dp, 'pal'=>$pal, 'trns'=>$trns);
if($ct>=4)
{
// Extract alpha channel
if(!function_exists('gzuncompress'))
$this->Error('Zlib not available, can\'t handle alpha channel: '.$file);
$data = gzuncompress($data);
$color = '';
$alpha = '';
if($ct==4)
{
// Gray image
$len = 2*$w;
for($i=0;$i<$h;$i++)
{
$pos = (1+$len)*$i;
$color .= $data[$pos];
$alpha .= $data[$pos];
$line = substr($data,$pos+1,$len);
$color .= preg_replace('/(.)./s','$1',$line);
$alpha .= preg_replace('/.(.)/s','$1',$line);
}
}
else
{
// RGB image
$len = 4*$w;
for($i=0;$i<$h;$i++)
{
$pos = (1+$len)*$i;
$color .= $data[$pos];
$alpha .= $data[$pos];
$line = substr($data,$pos+1,$len);
$color .= preg_replace('/(.{3})./s','$1',$line);
$alpha .= preg_replace('/.{3}(.)/s','$1',$line);
}
}
unset($data);
$data = gzcompress($color);
$info['smask'] = gzcompress($alpha);
if($this->PDFVersion<'1.4')
$this->PDFVersion = '1.4';
}
$info['data'] = $data;
return $info;
}
function _readstream($f, $n)
@ -1338,6 +1397,22 @@ function _parsegif($file)
if(!$im)
$this->Error('Missing or incorrect image file: '.$file);
imageinterlace($im,0);
$f = @fopen('php://temp','rb+');
if($f)
{
// Perform conversion in memory
ob_start();
imagepng($im);
$data = ob_get_clean();
imagedestroy($im);
fwrite($f,$data);
rewind($f);
$info = $this->_parsepngstream($f,$file);
fclose($f);
}
else
{
// Use temporary file
$tmp = tempnam('.','gif');
if(!$tmp)
$this->Error('Unable to create a temporary file');
@ -1346,6 +1421,7 @@ function _parsegif($file)
imagedestroy($im);
$info = $this->_parsepng($tmp);
unlink($tmp);
}
return $info;
}
@ -1384,13 +1460,13 @@ function _putpages()
}
if($this->DefOrientation=='P')
{
$wPt=$this->DefPageFormat[0]*$this->k;
$hPt=$this->DefPageFormat[1]*$this->k;
$wPt = $this->DefPageSize[0]*$this->k;
$hPt = $this->DefPageSize[1]*$this->k;
}
else
{
$wPt=$this->DefPageFormat[1]*$this->k;
$hPt=$this->DefPageFormat[0]*$this->k;
$wPt = $this->DefPageSize[1]*$this->k;
$hPt = $this->DefPageSize[0]*$this->k;
}
$filter = ($this->compress) ? '/Filter /FlateDecode ' : '';
for($n=1;$n<=$nb;$n++)
@ -1421,6 +1497,8 @@ function _putpages()
}
$this->_out($annots.']');
}
if($this->PDFVersion>'1.3')
$this->_out('/Group <</Type /Group /S /Transparency /CS /DeviceRGB>>');
$this->_out('/Contents '.($this->n+1).' 0 R>>');
$this->_out('endobj');
// Page content
@ -1459,28 +1537,12 @@ function _putfonts()
// 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);
$font = file_get_contents($this->fontpath.$file,true);
if(!$font)
$this->Error('Font file not found: '.$file);
$compressed = (substr($file,-2)=='.z');
if(!$compressed && isset($info['length2']))
{
$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);
}
}
$font = substr($font,6,$info['length1']).substr($font,6+$info['length1']+6,$info['length2']);
$this->_out('<</Length '.strlen($font));
if($compressed)
$this->_out('/Filter /FlateDecode');
@ -1497,9 +1559,9 @@ function _putfonts()
$this->fonts[$k]['n'] = $this->n+1;
$type = $font['type'];
$name = $font['name'];
if($type=='core')
if($type=='Core')
{
//Standard font
// Core font
$this->_newobj();
$this->_out('<</Type /Font');
$this->_out('/BaseFont /'.$name);
@ -1511,7 +1573,7 @@ function _putfonts()
}
elseif($type=='Type1' || $type=='TrueType')
{
//Additional Type1 or TrueType font
// Additional Type1 or TrueType/OpenType font
$this->_newobj();
$this->_out('<</Type /Font');
$this->_out('/BaseFont /'.$name);
@ -1519,13 +1581,10 @@ function _putfonts()
$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');
if(isset($font['diffn']))
$this->_out('/Encoding '.($nf+$font['diffn']).' 0 R');
else
$this->_out('/Encoding /WinAnsiEncoding');
}
$this->_out('>>');
$this->_out('endobj');
// Widths
@ -1541,9 +1600,8 @@ function _putfonts()
$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';
if(!empty($font['file']))
$s .= ' /FontFile'.($type=='Type1' ? '' : '2').' '.$this->FontFiles[$font['file']]['n'].' 0 R';
$this->_out($s.'>>');
$this->_out('endobj');
}
@ -1560,12 +1618,18 @@ function _putfonts()
function _putimages()
{
$filter=($this->compress) ? '/Filter /FlateDecode ' : '';
reset($this->images);
while(list($file,$info)=each($this->images))
foreach(array_keys($this->images) as $file)
{
$this->_putimage($this->images[$file]);
unset($this->images[$file]['data']);
unset($this->images[$file]['smask']);
}
}
function _putimage(&$info)
{
$this->_newobj();
$this->images[$file]['n']=$this->n;
$info['n'] = $this->n;
$this->_out('<</Type /XObject');
$this->_out('/Subtype /Image');
$this->_out('/Width '.$info['w']);
@ -1581,8 +1645,8 @@ function _putimages()
$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['dp']))
$this->_out('/DecodeParms <<'.$info['dp'].'>>');
if(isset($info['trns']) && is_array($info['trns']))
{
$trns = '';
@ -1590,21 +1654,29 @@ function _putimages()
$trns .= $info['trns'][$i].' '.$info['trns'][$i].' ';
$this->_out('/Mask ['.$trns.']');
}
if(isset($info['smask']))
$this->_out('/SMask '.($this->n+1).' 0 R');
$this->_out('/Length '.strlen($info['data']).'>>');
$this->_putstream($info['data']);
unset($this->images[$file]['data']);
$this->_out('endobj');
// Soft mask
if(isset($info['smask']))
{
$dp = '/Predictor 15 /Colors 1 /BitsPerComponent 8 /Columns '.$info['w'];
$smask = array('w'=>$info['w'], 'h'=>$info['h'], 'cs'=>'DeviceGray', 'bpc'=>8, 'f'=>$info['f'], 'dp'=>$dp, 'data'=>$info['smask']);
$this->_putimage($smask);
}
// Palette
if($info['cs']=='Indexed')
{
$this->_newobj();
$filter = ($this->compress) ? '/Filter /FlateDecode ' : '';
$pal = ($this->compress) ? gzcompress($info['pal']) : $info['pal'];
$this->_newobj();
$this->_out('<<'.$filter.'/Length '.strlen($pal).'>>');
$this->_putstream($pal);
$this->_out('endobj');
}
}
}
function _putxobjectdict()
{
@ -1664,7 +1736,7 @@ function _putcatalog()
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).']');
$this->_out('/OpenAction [3 0 R /XYZ null null '.sprintf('%.2F',$this->ZoomMode/100).']');
if($this->LayoutMode=='single')
$this->_out('/PageLayout /SinglePage');
elseif($this->LayoutMode=='continuous')

View File

@ -54,7 +54,7 @@ $line_width = LAMPDF_LINEWIDTH;
function createModulePDF($accounts,$pdf_structure="default") {
/** PDF generator class */
include_once(dirname(__FILE__) . "/fpdf.php");
include_once("fpdf.php");
/** Unicode support for FPDF */
include_once("ufpdf.php");
/** LAM PDF generator class */

View File

@ -128,7 +128,7 @@ function Cell($w,$h=0,$txt='',$border=0,$ln=0,$align='J',$fill=0,$link='')
$this->ws=0;
$this->_out('0 Tw');
}
$this->AddPage($this->CurOrientation, $this->CurPageFormat);
$this->AddPage($this->CurOrientation, $this->CurPageSize);
$this->x=$x;
if($ws>0)
{
@ -530,13 +530,13 @@ function _putpages()
}
if($this->DefOrientation=='P')
{
$wPt=$this->DefPageFormat[0]*$this->k;
$hPt=$this->DefPageFormat[1]*$this->k;
$wPt=$this->DefPageSize[0]*$this->k;
$hPt=$this->DefPageSize[1]*$this->k;
}
else
{
$wPt=$this->DefPageFormat[1]*$this->k;
$hPt=$this->DefPageFormat[0]*$this->k;
$wPt=$this->DefPageSize[1]*$this->k;
$hPt=$this->DefPageSize[0]*$this->k;
}
$filter=($this->compress) ? '/Filter /FlateDecode ' : '';
for($n=1;$n<=$nb;$n++)