<?php
/**
* PDF Export functions
*
* Allows exporting movies to PDF
* Requires FPDF libaray (http://www.fpdf.org)
*
* @package Core
* @link http://www.fpdf.org
* @author Andreas Götz <hide@address.com>
* @version $Id: pdf.php,v 1.31 2008/02/05 19:58:25 andig2 Exp $
*/
require_once './core/functions.php';
require_once './core/export.core.php';
require_once './engines/engines.php';
require_once './core/VariableStream.class.php';
define('FPDF', './lib/fpdf');
define('FPDF_FONTPATH', FPDF.'/font/');
require_once FPDF.'/fpdf.php';
require_once FPDF.'/fpdf2file.php';
error_reporting(E_ALL^E_NOTICE);
/**
* Copied from FPDF tutorial 3
* enhanced with memory image creation for gif->png conversion
*
* @link http://www.fpdf.org/?go=script&id=45
*/
class PDF extends FPDF2File
{
var $B;
var $I;
var $U;
var $HREF;
var $GDCount = 0;
var $Scale = 0; // dont rescale images
function FPDF2File($orientation='P', $unit='mm', $format='A4')
{
//Call parent constructor
$this->FPDF($orientation,$unit,$format);
//Initialization
$this->B=0;
$this->I=0;
$this->U=0;
$this->HREF='';
}
function GDImage($file, $x, $y, $w=0, $h=0, $im, $link='', $type='png')
{
// ouput the GD image $im
ob_start();
$func = 'image'.$type; // image creation function according to type
$func($im);
$data = ob_get_contents();
ob_end_clean();
// create file-unique variable name to not duplicate images for pdf
$file = (empty($file)) ? $this->GDCount++ : preg_replace('/[\s\/\.]/', '_', $file);
$name = 'pdf_image_'.$file;
$GLOBALS[$name] = $data;
// call Image using in-memory PNG file
parent::Image('var://'.$name, $x, $y, $w, $h, $type, $link);
}
function Image($file, $x, $y, $w=0, $h=0, $ext='', $link='')
{
global $config;
$image_types = array(1 => 'gif', 2 => 'jpg', 3 => 'png', 6 => 'bmp');
list($width, $height, $ext, $attr) = getimagesize($file);
$ext = $image_types[$ext];
// find image loading function
switch($ext)
{
case 'jpg': $func = 'jpeg'; break;
case 'bmp': $func = 'wbmp'; break;
default: $func = $ext;
}
$func = 'imagecreatefrom'.$func;
// check if loading functions exists (especially for gif support)
$im = (function_exists($func)) ? $func($file) : imagecreatetruecolor(1,1);
// scaling requested?
if ($this->Scale)
{
$this->max_width = round($this->Scale * $config['pdf_image_max_width']);
$this->max_height = round($this->Scale * $config['pdf_image_max_height']);
$scale = min($this->max_width/$width, $this->max_height/$height);
$thumb_x = round($width * $scale);
$thumb_y = round($height * $scale);
}
// scaling requied?
if (($this->Scale) && (($thumb_x != $width) || ($thumb_y != $height)))
{
// create white truecolor image (in case original is transparent)
$target = imagecreatetruecolor($thumb_x, $thumb_y);
$white = imagecolorallocate($target, 255, 255, 255);
imagefilledrectangle($target, 0, 0, $thumb_x, $thumb_y, $white);
imagecopyresampled($target, $im, 0,0, 0,0, $thumb_x,$thumb_y, $width,$height);
$this->GDImage($file, $x, $y, $w, $h, $target, $link, 'jpeg'); // change to png if you receive acrobat errors
imagedestroy($target);
}
elseif ($ext == 'gif') {
// pdf doesn't support interlaced images
if (imageinterlace($im))
{
/*
// switch lines of data
for ($y = 0; $y < $height; $y += 2)
{
for ($x = 0; $x <= $height; $x++)
{
$pix = imagecolorat($im, $x, $y);
imagesetpixel($im, $x, $y, imagecolorat($im, $x, $y+1));
imagesetpixel($im, $x, $y+1, $pix);
}
}
*/
// claim non-interlaced image
imageinterlace($im, false);
}
$this->GDImage($file, $x, $y, $w, $h, $im, $link);
}
else {
parent::Image($file, $x, $y, $w, $h, $ext, $link);
}
imagedestroy($im);
}
function VerifyFont($font, $mode = '')
{
$default_fonts = array('Arial', 'Courier', 'Helvetica', 'Times');
if (!in_array($font, $default_fonts))
{
if ($mode)
$this->AddFont($font, 'B', strtolower($font).'b.php');
else
$this->AddFont($font);
}
}
function WriteHTML($html)
{
global $config;
//HTML parser
$html = str_replace("\n",' ',$html);
$a = preg_split('/<(.*)>/U',$html,-1,PREG_SPLIT_DELIM_CAPTURE);
foreach($a as $i=>$e)
{
if($i%2==0)
{
//Text
if($this->HREF)
$this->PutLink($this->HREF,$e);
else
$this->Write((int)$config['pdf_font_size'] / 2, $e);
}
else
{
//Tag
if($e{0}=='/')
$this->CloseTag(strtoupper(substr($e,1)));
else
{
//Extract attributes
$a2=explode(' ',$e);
$tag=strtoupper(array_shift($a2));
$attr=array();
foreach($a2 as $v)
if(ereg('^([^=]*)=["\']?([^"\']*)["\']?$',$v,$a3))
$attr[strtoupper($a3[1])]=$a3[2];
$this->OpenTag($tag,$attr);
}
}
}
}
function OpenTag($tag, $attr)
{
global $config;
//Opening tag
if($tag=='B' or $tag=='I' or $tag=='U')
$this->SetStyle($tag,true);
if($tag=='A')
$this->HREF=$attr['HREF'];
if($tag=='BR')
$this->Ln((int)$config['pdf_font_size'] / 2);
}
function CloseTag($tag)
{
//Closing tag
if($tag=='B' or $tag=='I' or $tag=='U')
$this->SetStyle($tag,false);
if($tag=='A')
$this->HREF='';
}
function SetStyle($tag, $enable)
{
//Modify style and select corresponding font
$this->$tag+=($enable ? 1 : -1);
$style='';
foreach(array('B','I','U') as $s)
if($this->$s>0)
$style.=$s;
$this->SetFont('',$style);
}
function PutLink($URL, $txt)
{
global $config;
//Put a hyperlink
$this->SetTextColor(0,0,255);
$this->SetStyle('U',true);
$this->Write((int)$config['pdf_font_size'] / 2, $txt, $URL);
$this->SetStyle('U',false);
$this->SetTextColor(0);
}
/**
* @author Olivier <hide@address.com>
* @license Freeware
*/
function WordWrap(&$text, $maxwidth)
{
$text = trim($text);
if ($text==='')
return 0;
$space = $this->GetStringWidth(' ');
$lines = explode("\n", $text);
$text = '';
$count = 0;
foreach ($lines as $line)
{
$words = preg_split('/ +/', $line);
$width = 0;
foreach ($words as $word)
{
$wordwidth = $this->GetStringWidth($word);
if ($width + $wordwidth <= $maxwidth)
{
$width += $wordwidth + $space;
$text .= $word.' ';
}
else
{
$width = $wordwidth + $space;
$text = rtrim($text)."\n".$word.' ';
$count++;
}
}
$text = rtrim($text)."\n";
$count++;
}
$text = rtrim($text);
return $count;
}
}
/**
* Return image name for representing the media type
*/
function getMediaImage($mediatype)
{
if (preg_match("/^(DVD([+-]R)?|DivX|CD|VCD|SVCD|VHS)/i", $mediatype, $matches))
{
$type_image = strtolower($matches[1]).'.png';
}
else $type_image = '';
return $type_image;
}
/**
* Export PDF document
*
* @param string $where WHERE clause for SQL statement
*/
function pdfexport($WHERE)
{
global $config;
$ypos = $config['pdf_font_size']; // Match the font size for proper vertical offset
$page_width = $config['pdf_page_width'];
$margin = $config['pdf_margin'];
$left_margin = $config['pdf_left_margin'];
$right_margin = $config['pdf_right_margin'];
$mediaimg_width = $config['pdf_image_media_width'];
$font_size = $config['pdf_font_size'];
$image_height = $config['pdf_image_height'];
$image_width = $config['pdf_image_width'];
$font_title = $config['pdf_font_title'];
$font_plot = $config['pdf_font_plot'];
$text_length = $config['pdf_text_length'];
$filename = './cache/videodb'.date('His',time()).'.pdf';
// setup pdf class
$pdf = new PDF();
$pdf->Open($filename);
$pdf->VerifyFont($font_title);
$pdf->VerifyFont($font_title, 'B');
$pdf->VerifyFont($font_plot);
$pdf->AddPage();
$pdf->SetRightMargin($right_margin);
// add downscaling
if ($config['pdf_scale'])
{
$pdf->Scale = $config['pdf_scale'];
$pdf->max_width = $config['pdf_image_max_width'];
$pdf->max_height= $config['pdf_image_max_height'];
}
// get data
$result = iconv_array('utf-8', 'iso-8859-1', exportData($WHERE));
foreach ($result as $row)
{
set_time_limit(300); // rise per movie execution timeout limit if safe_mode is not set in php.ini
$title = $row['title'];
if ($row['subtitle']) $title .= ' - '.$row['subtitle'];
if ($row['diskid'] || $row['mediatype'])
{
$title .= ' [';
if ($row['mediatype']) $title .= $row['mediatype'] . ', ';
if ($row['diskid']) $title .= $row['diskid'];
$title = preg_replace('/, $/', '', $title) . ']';
}
// get drilldown url for image
$imdb = $row['imdbID'];
$link = ($imdb) ? engineGetContentUrl($imdb, engineGetEngine($imdb)) : '';
// title
$pdf->SetFont($font_title, 'B', $font_size);
$pdf->SetXY($left_margin + $image_width + $margin, $ypos);
$pdf->Cell(0, 0, $title, 0,1, 'L',0,$link);
// plot
$plot = leftString($row['plot'], $text_length);
$pdf->SetFont($font_plot, '', $font_size-1);
$pdf->SetXY($left_margin + $image_width + $margin, $ypos+3);
$pdf->SetLeftMargin($left_margin + $image_width + $margin);
$pdf->WriteHTML($plot);
// image
$file = getThumbnail($row['imgurl']);
if (preg_match('/^img.php/', $file)) $file = img('nocover.gif');
// image file present?
if ($file)
{
$pdf->Image($file, $left_margin, $ypos-2, $image_width, $image_height, '', $link);
}
// add mediatype image
if ($type_image = getMediaImage($row['mediatype']))
{
$pdf->Image('./images/media/'.$type_image, $page_width - $mediaimg_width - $right_margin, $ypos - 2, $mediaimg_width, 0, '', '');
}
// new position
$ypos += $margin;
if ($file or $plot)
{
$ypos += max($image_height, $font_size);
}
else
{
$ypos += $font_size;
}
if ($ypos > 250)
{
$ypos = $config['pdf_font_size'];
$pdf->AddPage();
}
}
$pdf->Output('videoDB.pdf', 'D');
// get rid of temp file
@unlink($filename);
}
?>