463 lines
11 KiB
PHP
463 lines
11 KiB
PHP
<?php
|
||
/***************************/
|
||
/* Radek HULAN */
|
||
/* http://hulan.info/blog/ */
|
||
/***************************/
|
||
|
||
require('fpdf/fpdf.php');
|
||
|
||
/************************************/
|
||
/* global functions */
|
||
/************************************/
|
||
function hex2dec($color = "#000000"){
|
||
$tbl_color = array();
|
||
$tbl_color['R']=hexdec(substr($color, 1, 2));
|
||
$tbl_color['G']=hexdec(substr($color, 3, 2));
|
||
$tbl_color['B']=hexdec(substr($color, 5, 2));
|
||
return $tbl_color;
|
||
}
|
||
|
||
function px2mm($px){
|
||
return $px*25.4/72;
|
||
}
|
||
|
||
function txtentities($html){
|
||
$trans = get_html_translation_table(HTML_ENTITIES);
|
||
$trans = array_flip($trans);
|
||
return strtr($html, $trans);
|
||
}
|
||
|
||
|
||
/************************************/
|
||
/* main class createPDF */
|
||
/************************************/
|
||
class createPDF {
|
||
protected $html;
|
||
protected $title;
|
||
protected $articleurl;
|
||
protected $author;
|
||
protected $date;
|
||
protected $from;
|
||
protected $to;
|
||
protected $useiconv;
|
||
protected $bi;
|
||
|
||
function __construct($_html,$_title,$_articleurl,$_author,$_date) {
|
||
// main vars
|
||
$this->html=$_html; // html text to convert to PDF
|
||
$this->title=$_title; // article title
|
||
$this->articleurl=$_articleurl; // article URL
|
||
$this->author=$_author; // article author
|
||
$this->date=$_date; // date being published
|
||
// other options
|
||
$this->from='iso-8859-2'; // input encoding
|
||
$this->to='cp1250'; // output encoding
|
||
$this->useiconv=false; // use iconv
|
||
$this->bi=true; // support bold and italic tags
|
||
}
|
||
|
||
function _convert($s) {
|
||
if ($this->useiconv)
|
||
return iconv($this->from,$this->to,$s);
|
||
else
|
||
return $s;
|
||
}
|
||
|
||
function run() {
|
||
// change some win codes, and xhtml into html
|
||
$str=array(
|
||
'<br />' => '<br>',
|
||
'<hr />' => '<hr>',
|
||
'[r]' => '<red>',
|
||
'[/r]' => '</red>',
|
||
'[l]' => '<blue>',
|
||
'[/l]' => '</blue>',
|
||
'“' => '"',
|
||
'”' => '"',
|
||
'„' => '"',
|
||
'…' => '...',
|
||
'’' => '\''
|
||
);
|
||
foreach ($str as $_from => $_to) $this->html = str_replace($_from,$_to,$this->html);
|
||
|
||
$pdf=new PDF('P','mm','A4',$this->title,$this->articleurl,false);
|
||
$pdf->SetCreator("Script by Radek HULAN, http://hulan.info/blog/");
|
||
$pdf->SetDisplayMode('real');
|
||
$pdf->SetTitle($this->_convert($this->title));
|
||
$pdf->SetAuthor($this->author);
|
||
$pdf->AddPage();
|
||
|
||
// header
|
||
$pdf->PutMainTitle($this->_convert($this->title));
|
||
$pdf->PutMinorHeading('Article URL');
|
||
$pdf->PutMinorTitle($this->articleurl,$this->articleurl);
|
||
$pdf->PutMinorHeading('Author');
|
||
$pdf->PutMinorTitle($this->_convert($this->author));
|
||
$pdf->PutMinorHeading("Published: ".@date("F j, Y, g:i a",$this->date));
|
||
$pdf->PutLine();
|
||
$pdf->Ln(10);
|
||
|
||
// html
|
||
$pdf->WriteHTML($this->_convert($this->html),$this->bi);
|
||
|
||
// output
|
||
$pdf->Output();
|
||
|
||
// stop processing
|
||
exit;
|
||
}
|
||
}
|
||
|
||
/************************************/
|
||
/* class PDF */
|
||
/************************************/
|
||
class PDF extends FPDF
|
||
{
|
||
protected $B;
|
||
protected $I;
|
||
protected $U;
|
||
protected $HREF;
|
||
protected $PRE;
|
||
protected $fontlist;
|
||
protected $issetfont;
|
||
protected $issetcolor;
|
||
protected $articletitle;
|
||
protected $articleurl;
|
||
protected $debug;
|
||
protected $bi;
|
||
|
||
function __construct($orientation='P',$unit='mm',$size='A4',$_title='',$_url='',$_debug=false)
|
||
{
|
||
parent::__construct($orientation,$unit,$size);
|
||
$this->B=0;
|
||
$this->I=0;
|
||
$this->U=0;
|
||
$this->HREF='';
|
||
$this->PRE=false;
|
||
$this->SetFont('Times','',12);
|
||
$this->fontlist=array('Times','Courier');
|
||
$this->issetfont=false;
|
||
$this->issetcolor=false;
|
||
$this->articletitle=$_title;
|
||
$this->articleurl=$_url;
|
||
$this->debug=$_debug;
|
||
$this->AliasNbPages();
|
||
}
|
||
|
||
function WriteHTML($html,$bi)
|
||
{
|
||
//remove all unsupported tags
|
||
$this->bi=$bi;
|
||
if ($bi)
|
||
$html=strip_tags($html,"<a><img><p><br><font><tr><blockquote><h1><h2><h3><h4><pre><red><blue><ul><li><hr><b><i><u><strong><em>");
|
||
else
|
||
$html=strip_tags($html,"<a><img><p><br><font><tr><blockquote><h1><h2><h3><h4><pre><red><blue><ul><li><hr>");
|
||
$html=str_replace("\n",' ',$html); //replace carriage returns with spaces
|
||
// debug
|
||
if ($this->debug) { echo $html; exit; }
|
||
|
||
$html = str_replace('™','<27>',$html);
|
||
$html = str_replace('©','<27>',$html);
|
||
$html = str_replace('€','<27>',$html);
|
||
|
||
$a=preg_split('/<(.*)>/U',$html,-1,PREG_SPLIT_DELIM_CAPTURE);
|
||
$skip=false;
|
||
foreach($a as $i=>$e)
|
||
{
|
||
if (!$skip) {
|
||
if($this->HREF)
|
||
$e=str_replace("\n","",str_replace("\r","",$e));
|
||
if($i%2==0)
|
||
{
|
||
// new line
|
||
if($this->PRE)
|
||
$e=str_replace("\r","\n",$e);
|
||
else
|
||
$e=str_replace("\r","",$e);
|
||
//Text
|
||
if($this->HREF) {
|
||
$this->PutLink($this->HREF,$e);
|
||
$skip=true;
|
||
} else
|
||
$this->Write(5,txtentities($e));
|
||
} else {
|
||
//Tag
|
||
if (substr(trim($e),0,1)=='/')
|
||
$this->CloseTag(strtoupper(substr($e,strpos($e,'/'))));
|
||
else {
|
||
//Extract attributes
|
||
$a2=explode(' ',$e);
|
||
$tag=strtoupper(array_shift($a2));
|
||
$attr=array();
|
||
foreach($a2 as $v) {
|
||
if(preg_match('/([^=]*)=["\']?([^"\']*)/',$v,$a3))
|
||
$attr[strtoupper($a3[1])]=$a3[2];
|
||
}
|
||
$this->OpenTag($tag,$attr);
|
||
}
|
||
}
|
||
} else {
|
||
$this->HREF='';
|
||
$skip=false;
|
||
}
|
||
}
|
||
}
|
||
|
||
function OpenTag($tag,$attr)
|
||
{
|
||
//Opening tag
|
||
switch($tag){
|
||
case 'STRONG':
|
||
case 'B':
|
||
if ($this->bi)
|
||
$this->SetStyle('B',true);
|
||
else
|
||
$this->SetStyle('U',true);
|
||
break;
|
||
case 'H1':
|
||
$this->Ln(5);
|
||
$this->SetTextColor(150,0,0);
|
||
$this->SetFontSize(22);
|
||
break;
|
||
case 'H2':
|
||
$this->Ln(5);
|
||
$this->SetFontSize(18);
|
||
$this->SetStyle('U',true);
|
||
break;
|
||
case 'H3':
|
||
$this->Ln(5);
|
||
$this->SetFontSize(16);
|
||
$this->SetStyle('U',true);
|
||
break;
|
||
case 'H4':
|
||
$this->Ln(5);
|
||
$this->SetTextColor(102,0,0);
|
||
$this->SetFontSize(14);
|
||
if ($this->bi)
|
||
$this->SetStyle('B',true);
|
||
break;
|
||
case 'PRE':
|
||
$this->SetFont('Courier','',11);
|
||
$this->SetFontSize(11);
|
||
$this->SetStyle('B',false);
|
||
$this->SetStyle('I',false);
|
||
$this->PRE=true;
|
||
break;
|
||
case 'RED':
|
||
$this->SetTextColor(255,0,0);
|
||
break;
|
||
case 'BLOCKQUOTE':
|
||
$this->mySetTextColor(100,0,45);
|
||
$this->Ln(3);
|
||
break;
|
||
case 'BLUE':
|
||
$this->SetTextColor(0,0,255);
|
||
break;
|
||
case 'I':
|
||
case 'EM':
|
||
if ($this->bi)
|
||
$this->SetStyle('I',true);
|
||
break;
|
||
case 'U':
|
||
$this->SetStyle('U',true);
|
||
break;
|
||
case 'A':
|
||
$this->HREF=$attr['HREF'];
|
||
break;
|
||
case 'IMG':
|
||
if(isset($attr['SRC']) && (isset($attr['WIDTH']) || isset($attr['HEIGHT']))) {
|
||
if(!isset($attr['WIDTH']))
|
||
$attr['WIDTH'] = 0;
|
||
if(!isset($attr['HEIGHT']))
|
||
$attr['HEIGHT'] = 0;
|
||
$this->Image($attr['SRC'], $this->GetX(), $this->GetY(), px2mm($attr['WIDTH']), px2mm($attr['HEIGHT']));
|
||
$this->Ln(3);
|
||
}
|
||
break;
|
||
case 'LI':
|
||
$this->Ln(2);
|
||
$this->SetTextColor(190,0,0);
|
||
$this->Write(5,' <20> ');
|
||
$this->mySetTextColor(-1);
|
||
break;
|
||
case 'TR':
|
||
$this->Ln(7);
|
||
$this->PutLine();
|
||
break;
|
||
case 'BR':
|
||
$this->Ln(2);
|
||
break;
|
||
case 'P':
|
||
$this->Ln(5);
|
||
break;
|
||
case 'HR':
|
||
$this->PutLine();
|
||
break;
|
||
case 'FONT':
|
||
if (isset($attr['COLOR']) && $attr['COLOR']!='') {
|
||
$coul=hex2dec($attr['COLOR']);
|
||
$this->mySetTextColor($coul['R'],$coul['G'],$coul['B']);
|
||
$this->issetcolor=true;
|
||
}
|
||
if (isset($attr['FACE']) && in_array(strtolower($attr['FACE']), $this->fontlist)) {
|
||
$this->SetFont(strtolower($attr['FACE']));
|
||
$this->issetfont=true;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
|
||
function CloseTag($tag)
|
||
{
|
||
//Closing tag
|
||
if ($tag=='H1' || $tag=='H2' || $tag=='H3' || $tag=='H4'){
|
||
$this->Ln(6);
|
||
$this->SetFont('Times','',12);
|
||
$this->SetFontSize(12);
|
||
$this->SetStyle('U',false);
|
||
$this->SetStyle('B',false);
|
||
$this->mySetTextColor(-1);
|
||
}
|
||
if ($tag=='PRE'){
|
||
$this->SetFont('Times','',12);
|
||
$this->SetFontSize(12);
|
||
$this->PRE=false;
|
||
}
|
||
if ($tag=='RED' || $tag=='BLUE')
|
||
$this->mySetTextColor(-1);
|
||
if ($tag=='BLOCKQUOTE'){
|
||
$this->mySetTextColor(0,0,0);
|
||
$this->Ln(3);
|
||
}
|
||
if($tag=='STRONG')
|
||
$tag='B';
|
||
if($tag=='EM')
|
||
$tag='I';
|
||
if((!$this->bi) && $tag=='B')
|
||
$tag='U';
|
||
if($tag=='B' || $tag=='I' || $tag=='U')
|
||
$this->SetStyle($tag,false);
|
||
if($tag=='A')
|
||
$this->HREF='';
|
||
if($tag=='FONT'){
|
||
if ($this->issetcolor==true) {
|
||
$this->SetTextColor(0,0,0);
|
||
}
|
||
if ($this->issetfont) {
|
||
$this->SetFont('Times','',12);
|
||
$this->issetfont=false;
|
||
}
|
||
}
|
||
}
|
||
|
||
function Footer()
|
||
{
|
||
//Go to 1.5 cm from bottom
|
||
$this->SetY(-15);
|
||
//Select Arial italic 8
|
||
$this->SetFont('Times','',8);
|
||
//Print centered page number
|
||
$this->SetTextColor(0,0,0);
|
||
$this->Cell(0,4,'Page '.$this->PageNo().'/{nb}',0,1,'C');
|
||
$this->SetTextColor(0,0,180);
|
||
$this->Cell(0,4,'Created by HTML2PDF / FPDF',0,0,'C',0,'http://hulan.info/blog/');
|
||
$this->mySetTextColor(-1);
|
||
}
|
||
|
||
function Header()
|
||
{
|
||
//Select Arial bold 15
|
||
$this->SetTextColor(0,0,0);
|
||
$this->SetFont('Times','',10);
|
||
$this->Cell(0,10,$this->articletitle,0,0,'C');
|
||
$this->Ln(4);
|
||
$this->Cell(0,10,$this->articleurl,0,0,'C');
|
||
$this->Ln(7);
|
||
$this->Line($this->GetX(),$this->GetY(),$this->GetX()+187,$this->GetY());
|
||
//Line break
|
||
$this->Ln(12);
|
||
$this->SetFont('Times','',12);
|
||
$this->mySetTextColor(-1);
|
||
}
|
||
|
||
function SetStyle($tag,$enable)
|
||
{
|
||
$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)
|
||
{
|
||
//Put a hyperlink
|
||
$this->SetTextColor(0,0,255);
|
||
$this->SetStyle('U',true);
|
||
$this->Write(5,$txt,$URL);
|
||
$this->SetStyle('U',false);
|
||
$this->mySetTextColor(-1);
|
||
}
|
||
|
||
function PutLine()
|
||
{
|
||
$this->Ln(2);
|
||
$this->Line($this->GetX(),$this->GetY(),$this->GetX()+187,$this->GetY());
|
||
$this->Ln(3);
|
||
}
|
||
|
||
function mySetTextColor($r,$g=0,$b=0){
|
||
static $_r=0, $_g=0, $_b=0;
|
||
|
||
if ($r==-1)
|
||
$this->SetTextColor($_r,$_g,$_b);
|
||
else {
|
||
$this->SetTextColor($r,$g,$b);
|
||
$_r=$r;
|
||
$_g=$g;
|
||
$_b=$b;
|
||
}
|
||
}
|
||
|
||
function PutMainTitle($title) {
|
||
if (strlen($title)>55)
|
||
$title=substr($title,0,55)."...";
|
||
$this->SetTextColor(33,32,95);
|
||
$this->SetFontSize(20);
|
||
$this->SetFillColor(255,204,120);
|
||
$this->Cell(0,20,$title,1,1,"C",1);
|
||
$this->SetFillColor(255,255,255);
|
||
$this->SetFontSize(12);
|
||
$this->Ln(5);
|
||
}
|
||
|
||
function PutMinorHeading($title) {
|
||
$this->SetFontSize(12);
|
||
$this->Cell(0,5,$title,0,1,"C");
|
||
$this->SetFontSize(12);
|
||
}
|
||
|
||
function PutMinorTitle($title,$url='') {
|
||
$title=str_replace('http://','',$title);
|
||
if (strlen($title)>70)
|
||
if (!(strrpos($title,'/')==false))
|
||
$title=substr($title,strrpos($title,'/')+1);
|
||
$title=substr($title,0,70);
|
||
$this->SetFontSize(16);
|
||
if ($url!='') {
|
||
$this->SetStyle('U',false);
|
||
$this->SetTextColor(0,0,180);
|
||
$this->Cell(0,6,$title,0,1,"C",0,$url);
|
||
$this->SetTextColor(0,0,0);
|
||
$this->SetStyle('U',false);
|
||
} else
|
||
$this->Cell(0,6,$title,0,1,"C",0);
|
||
$this->SetFontSize(12);
|
||
$this->Ln(4);
|
||
}
|
||
} // class PDF
|
||
|
||
?>
|