<?php
/*
* phpMyVisites : website statistics and audience measurements
* Copyright (C) 2002 - 2006
* http://www.phpmyvisites.net/
* phpMyVisites is free software (license GNU/GPL)
* Authors : phpMyVisites team
*/
// $Id: pmvfpdf.php,v 0.5 2006/08/15 10:01:22 cmil_ Exp $
require (INCLUDE_PATH."/libs/fpdf/fpdf.php");
//require (INCLUDE_PATH."/libs/fpdf/ufpdf.php");
//require (INCLUDE_PATH."/libs/tcpdf/tcpdf_php4/tcpdf.php");//TCPDF
// Extend fpdf fonctionality (type image pngpmv with is content)
class myFPDF extends FPDF {
//class myFPDF extends TCPDF {
var $pmvPos = 0;
// Same in fpdf with a parameter $fileContent
function Image($file, $x, $y, $w = 0, $h = 0, $type = '', $link = '', $fileContent = '') {
//Put an image on the page
if (!isset ($this->images[$file])) {
//First use of image, get info
if ($type == '') {
$pos = strrpos($file, '.');
if (!$pos)
$this->Error('Image file has no extension and no type was specified: '.$file);
$type = substr($file, $pos +1);
}
$type = strtolower($type);
$mqr = get_magic_quotes_runtime();
set_magic_quotes_runtime(0);
if ($type == 'jpg' || $type == 'jpeg')
$info = $this->_parsejpg($file);
elseif ($type == 'png') $info = $this->_parsepng($file);
else {
//Allow for additional formats
$mtd = '_parse'.$type;
if (!method_exists($this, $mtd))
$this->Error('Unsupported image type: '.$type);
// Send new parameter
$info = $this-> $mtd ($file, $fileContent);
}
set_magic_quotes_runtime($mqr);
$info['i'] = count($this->images) + 1;
$this->images[$file] = $info;
} else
$info = $this->images[$file];
//Automatic width and height calculation if needed
if ($w == 0 && $h == 0) {
//Put image at 72 dpi
$w = $info['w'] / $this->k;
$h = $info['h'] / $this->k;
}
if ($w == 0)
$w = $h * $info['w'] / $info['h'];
if ($h == 0)
$h = $w * $info['h'] / $info['w'];
$this->_out(sprintf('q %.2f 0 0 %.2f %.2f %.2f cm /I%d Do Q', $w * $this->k, $h * $this->k, $x * $this->k, ($this->h - ($y + $h)) * $this->k, $info['i']));
if ($link)
$this->Link($x, $y, $w, $h, $link);
}
// function like fread with a string (not a file)
function mfread($str, $lg) {
$ret = substr($str, $this->pmvPos, $lg);
$this->pmvPos += $lg;
return $ret;
}
// Same as _freadint with a string (not a file)
function m_freadint($f) {
//Read a 4-byte integer from file
$a = unpack('Ni', $this->mfread($f, 4));
return $a['i'];
}
// Parse png from a string $fileContent
// write from _parsepng of fpdf
// If ok return an array with all values
// else if error return the error message
function _parsepngpmv($fileName, $fileContent) {
// Reset read position
$this->pmvPos = 0;
//Extract info from a PNG file
$f = $fileContent;
// $f=fopen($file,'rb');
// if(!$f)
if ($f == null)
return('Can\'t open image file: '.$fileName);
//Check signature
if ($this->mfread($f, 8) != chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10)) {
return('Not a PNG file: '.$fileName);
}
//Read header chunk
$this->mfread($f, 4);
if ($this->mfread($f, 4) != 'IHDR') {
return('Incorrect PNG file: '.$fileName);
}
$w = $this->m_freadint($f);
$h = $this->m_freadint($f);
$bpc = ord($this->mfread($f, 1));
if ($bpc > 8) {
return('16-bit depth not supported: '.$fileName);
}
$ct = ord($this->mfread($f, 1));
if ($ct == 0)
$colspace = 'DeviceGray';
elseif ($ct == 2) $colspace = 'DeviceRGB';
elseif ($ct == 3) $colspace = 'Indexed';
else
return('Alpha channel not supported: '.$fileName);
if (ord($this->mfread($f, 1)) != 0)
return('Unknown compression method: '.$fileName);
if (ord($this->mfread($f, 1)) != 0)
return('Unknown filter method: '.$fileName);
if (ord($this->mfread($f, 1)) != 0)
return('Interlacing not supported: '.$fileName);
$this->mfread($f, 4);
$parms = '/DecodeParms <</Predictor 15 /Colors '. ($ct == 2 ? 3 : 1).' /BitsPerComponent '.$bpc.' /Columns '.$w.'>>';
//Scan chunks looking for palette, transparency and image data
$pal = '';
$trns = '';
$data = '';
do {
$n = $this->m_freadint($f);
$type = $this->mfread($f, 4);
if ($type == 'PLTE') {
//Read palette
$pal = $this->mfread($f, $n);
$this->mfread($f, 4);
}
elseif ($type == 'tRNS') {
//Read transparency info
$t = $this->mfread($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->mfread($f, 4);
}
elseif ($type == 'IDAT') {
//Read image data block
$data .= $this->mfread($f, $n);
$this->mfread($f, 4);
}
elseif ($type == 'IEND') break;
else
$this->mfread($f, $n +4);
} while ($n);
if ($colspace == 'Indexed' && empty ($pal))
return('Missing palette in '.$fileName);
// fclose($f);
return array ('w' => $w, 'h' => $h, 'cs' => $colspace, 'bpc' => $bpc, 'f' => 'FlateDecode', 'parms' => $parms, 'pal' => $pal, 'trns' => $trns, 'data' => $data);
}
}
?>