00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 if(!class_exists('FPDF'))
00013 {
00014 define('FPDF_VERSION','1.52');
00015
00016 class FPDF
00017 {
00018
00019 var $page;
00020 var $n;
00021 var $offsets;
00022 var $buffer;
00023 var $pages;
00024 var $state;
00025 var $compress;
00026 var $DefOrientation;
00027 var $CurOrientation;
00028 var $OrientationChanges;
00029 var $k;
00030 var $fwPt,$fhPt;
00031 var $fw,$fh;
00032 var $wPt,$hPt;
00033 var $w,$h;
00034 var $lMargin;
00035 var $tMargin;
00036 var $rMargin;
00037 var $bMargin;
00038 var $cMargin;
00039 var $x,$y;
00040 var $lasth;
00041 var $LineWidth;
00042 var $CoreFonts;
00043 var $fonts;
00044 var $FontFiles;
00045 var $diffs;
00046 var $images;
00047 var $PageLinks;
00048 var $links;
00049 var $FontFamily;
00050 var $FontStyle;
00051 var $underline;
00052 var $CurrentFont;
00053 var $FontSizePt;
00054 var $FontSize;
00055 var $DrawColor;
00056 var $FillColor;
00057 var $TextColor;
00058 var $ColorFlag;
00059 var $ws;
00060 var $AutoPageBreak;
00061 var $PageBreakTrigger;
00062 var $InFooter;
00063 var $ZoomMode;
00064 var $LayoutMode;
00065 var $title;
00066 var $subject;
00067 var $author;
00068 var $keywords;
00069 var $creator;
00070 var $AliasNbPages;
00071
00072
00073
00074
00075
00076
00077 function FPDF($orientation='P',$unit='mm',$format='A4')
00078 {
00079
00080 $this->_dochecks();
00081
00082 $this->page=0;
00083 $this->n=2;
00084 $this->buffer='';
00085 $this->pages=array();
00086 $this->OrientationChanges=array();
00087 $this->state=0;
00088 $this->fonts=array();
00089 $this->FontFiles=array();
00090 $this->diffs=array();
00091 $this->images=array();
00092 $this->links=array();
00093 $this->InFooter=false;
00094 $this->lasth=0;
00095 $this->FontFamily='';
00096 $this->FontStyle='';
00097 $this->FontSizePt=12;
00098 $this->underline=false;
00099 $this->DrawColor='0 G';
00100 $this->FillColor='0 g';
00101 $this->TextColor='0 g';
00102 $this->ColorFlag=false;
00103 $this->ws=0;
00104
00105 $this->CoreFonts=array('courier'=>'Courier','courierB'=>'Courier-Bold','courierI'=>'Courier-Oblique','courierBI'=>'Courier-BoldOblique',
00106 'helvetica'=>'Helvetica','helveticaB'=>'Helvetica-Bold','helveticaI'=>'Helvetica-Oblique','helveticaBI'=>'Helvetica-BoldOblique',
00107 'times'=>'Times-Roman','timesB'=>'Times-Bold','timesI'=>'Times-Italic','timesBI'=>'Times-BoldItalic',
00108 'symbol'=>'Symbol','zapfdingbats'=>'ZapfDingbats');
00109
00110 if($unit=='pt')
00111 $this->k=1;
00112 elseif($unit=='mm')
00113 $this->k=72/25.4;
00114 elseif($unit=='cm')
00115 $this->k=72/2.54;
00116 elseif($unit=='in')
00117 $this->k=72;
00118 else
00119 $this->Error('Incorrect unit: '.$unit);
00120
00121 if(is_string($format))
00122 {
00123 $format=strtolower($format);
00124 if($format=='a3')
00125 $format=array(841.89,1190.55);
00126 elseif($format=='a4')
00127 $format=array(595.28,841.89);
00128 elseif($format=='a5')
00129 $format=array(420.94,595.28);
00130 elseif($format=='letter')
00131 $format=array(612,792);
00132 elseif($format=='legal')
00133 $format=array(612,1008);
00134 else
00135 $this->Error('Unknown page format: '.$format);
00136 $this->fwPt=$format[0];
00137 $this->fhPt=$format[1];
00138 }
00139 else
00140 {
00141 $this->fwPt=$format[0]*$this->k;
00142 $this->fhPt=$format[1]*$this->k;
00143 }
00144 $this->fw=$this->fwPt/$this->k;
00145 $this->fh=$this->fhPt/$this->k;
00146
00147 $orientation=strtolower($orientation);
00148 if($orientation=='p' or $orientation=='portrait')
00149 {
00150 $this->DefOrientation='P';
00151 $this->wPt=$this->fwPt;
00152 $this->hPt=$this->fhPt;
00153 }
00154 elseif($orientation=='l' or $orientation=='landscape')
00155 {
00156 $this->DefOrientation='L';
00157 $this->wPt=$this->fhPt;
00158 $this->hPt=$this->fwPt;
00159 }
00160 else
00161 $this->Error('Incorrect orientation: '.$orientation);
00162 $this->CurOrientation=$this->DefOrientation;
00163 $this->w=$this->wPt/$this->k;
00164 $this->h=$this->hPt/$this->k;
00165
00166 $margin=28.35/$this->k;
00167 $this->SetMargins($margin,$margin);
00168
00169 $this->cMargin=$margin/10;
00170
00171 $this->LineWidth=.567/$this->k;
00172
00173 $this->SetAutoPageBreak(true,2*$margin);
00174
00175 $this->SetDisplayMode('fullwidth');
00176
00177 $this->SetCompression(true);
00178 }
00179
00180 function SetMargins($left,$top,$right=-1)
00181 {
00182
00183 $this->lMargin=$left;
00184 $this->tMargin=$top;
00185 if($right==-1)
00186 $right=$left;
00187 $this->rMargin=$right;
00188 }
00189
00190 function SetLeftMargin($margin)
00191 {
00192
00193 $this->lMargin=$margin;
00194 if($this->page>0 and $this->x<$margin)
00195 $this->x=$margin;
00196 }
00197
00198 function SetTopMargin($margin)
00199 {
00200
00201 $this->tMargin=$margin;
00202 }
00203
00204 function SetRightMargin($margin)
00205 {
00206
00207 $this->rMargin=$margin;
00208 }
00209
00210 function SetAutoPageBreak($auto,$margin=0)
00211 {
00212
00213 $this->AutoPageBreak=$auto;
00214 $this->bMargin=$margin;
00215 $this->PageBreakTrigger=$this->h-$margin;
00216 }
00217
00218 function SetDisplayMode($zoom,$layout='continuous')
00219 {
00220
00221 if($zoom=='fullpage' or $zoom=='fullwidth' or $zoom=='real' or $zoom=='default' or !is_string($zoom))
00222 $this->ZoomMode=$zoom;
00223 else
00224 $this->Error('Incorrect zoom display mode: '.$zoom);
00225 if($layout=='single' or $layout=='continuous' or $layout=='two' or $layout=='default')
00226 $this->LayoutMode=$layout;
00227 else
00228 $this->Error('Incorrect layout display mode: '.$layout);
00229 }
00230
00231 function SetCompression($compress)
00232 {
00233
00234 if(function_exists('gzcompress'))
00235 $this->compress=$compress;
00236 else
00237 $this->compress=false;
00238 }
00239
00240 function SetTitle($title)
00241 {
00242
00243 $this->title=$title;
00244 }
00245
00246 function SetSubject($subject)
00247 {
00248
00249 $this->subject=$subject;
00250 }
00251
00252 function SetAuthor($author)
00253 {
00254
00255 $this->author=$author;
00256 }
00257
00258 function SetKeywords($keywords)
00259 {
00260
00261 $this->keywords=$keywords;
00262 }
00263
00264 function SetCreator($creator)
00265 {
00266
00267 $this->creator=$creator;
00268 }
00269
00270 function AliasNbPages($alias='{nb}')
00271 {
00272
00273 $this->AliasNbPages=$alias;
00274 }
00275
00276 function Error($msg)
00277 {
00278
00279 die('<B>FPDF error: </B>'.$msg);
00280 }
00281
00282 function Open()
00283 {
00284
00285 if($this->state==0)
00286 $this->_begindoc();
00287 }
00288
00289 function Close()
00290 {
00291
00292 if($this->state==3)
00293 return;
00294 if($this->page==0)
00295 $this->AddPage();
00296
00297 $this->InFooter=true;
00298 $this->Footer();
00299 $this->InFooter=false;
00300
00301 $this->_endpage();
00302
00303 $this->_enddoc();
00304 }
00305
00306 function AddPage($orientation='')
00307 {
00308
00309 if($this->state==0)
00310 $this->Open();
00311 $family=$this->FontFamily;
00312 $style=$this->FontStyle.($this->underline ? 'U' : '');
00313 $size=$this->FontSizePt;
00314 $lw=$this->LineWidth;
00315 $dc=$this->DrawColor;
00316 $fc=$this->FillColor;
00317 $tc=$this->TextColor;
00318 $cf=$this->ColorFlag;
00319 if($this->page>0)
00320 {
00321
00322 $this->InFooter=true;
00323 $this->Footer();
00324 $this->InFooter=false;
00325
00326 $this->_endpage();
00327 }
00328
00329 $this->_beginpage($orientation);
00330
00331 $this->_out('2 J');
00332
00333 $this->LineWidth=$lw;
00334 $this->_out(sprintf('%.2f w',$lw*$this->k));
00335
00336 if($family)
00337 $this->SetFont($family,$style,$size);
00338
00339 $this->DrawColor=$dc;
00340 if($dc!='0 G')
00341 $this->_out($dc);
00342 $this->FillColor=$fc;
00343 if($fc!='0 g')
00344 $this->_out($fc);
00345 $this->TextColor=$tc;
00346 $this->ColorFlag=$cf;
00347
00348 $this->Header();
00349
00350 if($this->LineWidth!=$lw)
00351 {
00352 $this->LineWidth=$lw;
00353 $this->_out(sprintf('%.2f w',$lw*$this->k));
00354 }
00355
00356 if($family)
00357 $this->SetFont($family,$style,$size);
00358
00359 if($this->DrawColor!=$dc)
00360 {
00361 $this->DrawColor=$dc;
00362 $this->_out($dc);
00363 }
00364 if($this->FillColor!=$fc)
00365 {
00366 $this->FillColor=$fc;
00367 $this->_out($fc);
00368 }
00369 $this->TextColor=$tc;
00370 $this->ColorFlag=$cf;
00371 }
00372
00373 function Header()
00374 {
00375
00376 }
00377
00378 function Footer()
00379 {
00380
00381 }
00382
00383 function PageNo()
00384 {
00385
00386 return $this->page;
00387 }
00388
00389 function SetDrawColor($r,$g=-1,$b=-1)
00390 {
00391
00392 if(($r==0 and $g==0 and $b==0) or $g==-1)
00393 $this->DrawColor=sprintf('%.3f G',$r/255);
00394 else
00395 $this->DrawColor=sprintf('%.3f %.3f %.3f RG',$r/255,$g/255,$b/255);
00396 if($this->page>0)
00397 $this->_out($this->DrawColor);
00398 }
00399
00400 function SetFillColor($r,$g=-1,$b=-1)
00401 {
00402
00403 if(($r==0 and $g==0 and $b==0) or $g==-1)
00404 $this->FillColor=sprintf('%.3f g',$r/255);
00405 else
00406 $this->FillColor=sprintf('%.3f %.3f %.3f rg',$r/255,$g/255,$b/255);
00407 $this->ColorFlag=($this->FillColor!=$this->TextColor);
00408 if($this->page>0)
00409 $this->_out($this->FillColor);
00410 }
00411
00412 function SetTextColor($r,$g=-1,$b=-1)
00413 {
00414
00415 if(($r==0 and $g==0 and $b==0) or $g==-1)
00416 $this->TextColor=sprintf('%.3f g',$r/255);
00417 else
00418 $this->TextColor=sprintf('%.3f %.3f %.3f rg',$r/255,$g/255,$b/255);
00419 $this->ColorFlag=($this->FillColor!=$this->TextColor);
00420 }
00421
00422 function GetStringWidth($s)
00423 {
00424
00425 $s=(string)$s;
00426 $cw=&$this->CurrentFont['cw'];
00427 $w=0;
00428 $l=strlen($s);
00429 for($i=0;$i<$l;$i++)
00430 $w+=$cw[$s{$i}];
00431 return $w*$this->FontSize/1000;
00432 }
00433
00434 function SetLineWidth($width)
00435 {
00436
00437 $this->LineWidth=$width;
00438 if($this->page>0)
00439 $this->_out(sprintf('%.2f w',$width*$this->k));
00440 }
00441
00442 function Line($x1,$y1,$x2,$y2)
00443 {
00444
00445 $this->_out(sprintf('%.2f %.2f m %.2f %.2f l S',$x1*$this->k,($this->h-$y1)*$this->k,$x2*$this->k,($this->h-$y2)*$this->k));
00446 }
00447
00448 function Rect($x,$y,$w,$h,$style='')
00449 {
00450
00451 if($style=='F')
00452 $op='f';
00453 elseif($style=='FD' or $style=='DF')
00454 $op='B';
00455 else
00456 $op='S';
00457 $this->_out(sprintf('%.2f %.2f %.2f %.2f re %s',$x*$this->k,($this->h-$y)*$this->k,$w*$this->k,-$h*$this->k,$op));
00458 }
00459
00460 function AddFont($family,$style='',$file='')
00461 {
00462
00463 $family=strtolower($family);
00464 if($family=='arial')
00465 $family='helvetica';
00466 $style=strtoupper($style);
00467 if($style=='IB')
00468 $style='BI';
00469 if(isset($this->fonts[$family.$style]))
00470 $this->Error('Font already added: '.$family.' '.$style);
00471 if($file=='')
00472 $file=str_replace(' ','',$family).strtolower($style).'.php';
00473 if(defined('FPDF_FONTPATH'))
00474 $file=FPDF_FONTPATH.$file;
00475 include($file);
00476 if(!isset($name))
00477 $this->Error('Could not include font definition file');
00478 $i=count($this->fonts)+1;
00479 $this->fonts[$family.$style]=array('i'=>$i,'type'=>$type,'name'=>$name,'desc'=>$desc,'up'=>$up,'ut'=>$ut,'cw'=>$cw,'enc'=>$enc,'file'=>$file);
00480 if($diff)
00481 {
00482
00483 $d=0;
00484 $nb=count($this->diffs);
00485 for($i=1;$i<=$nb;$i++)
00486 if($this->diffs[$i]==$diff)
00487 {
00488 $d=$i;
00489 break;
00490 }
00491 if($d==0)
00492 {
00493 $d=$nb+1;
00494 $this->diffs[$d]=$diff;
00495 }
00496 $this->fonts[$family.$style]['diff']=$d;
00497 }
00498 if($file)
00499 {
00500 if($type=='TrueType')
00501 $this->FontFiles[$file]=array('length1'=>$originalsize);
00502 else
00503 $this->FontFiles[$file]=array('length1'=>$size1,'length2'=>$size2);
00504 }
00505 }
00506
00507 function SetFont($family,$style='',$size=0)
00508 {
00509
00510 global $fpdf_charwidths;
00511
00512 $family=strtolower($family);
00513 if($family=='')
00514 $family=$this->FontFamily;
00515 if($family=='arial')
00516 $family='helvetica';
00517 elseif($family=='symbol' or $family=='zapfdingbats')
00518 $style='';
00519 $style=strtoupper($style);
00520 if(is_int(strpos($style,'U')))
00521 {
00522 $this->underline=true;
00523 $style=str_replace('U','',$style);
00524 }
00525 else
00526 $this->underline=false;
00527 if($style=='IB')
00528 $style='BI';
00529 if($size==0)
00530 $size=$this->FontSizePt;
00531
00532 if($this->FontFamily==$family and $this->FontStyle==$style and $this->FontSizePt==$size)
00533 return;
00534
00535 $fontkey=$family.$style;
00536 if(!isset($this->fonts[$fontkey]))
00537 {
00538
00539 if(isset($this->CoreFonts[$fontkey]))
00540 {
00541 if(!isset($fpdf_charwidths[$fontkey]))
00542 {
00543
00544 $file=$family;
00545 if($family=='times' or $family=='helvetica')
00546 $file.=strtolower($style);
00547 $file.='.php';
00548 if(defined('FPDF_FONTPATH'))
00549 $file=FPDF_FONTPATH.$file;
00550 include($file);
00551 if(!isset($fpdf_charwidths[$fontkey]))
00552 $this->Error('Could not include font metric file');
00553 }
00554 $i=count($this->fonts)+1;
00555 $this->fonts[$fontkey]=array('i'=>$i,'type'=>'core','name'=>$this->CoreFonts[$fontkey],'up'=>-100,'ut'=>50,'cw'=>$fpdf_charwidths[$fontkey]);
00556 }
00557 else
00558 $this->Error('Undefined font: '.$family.' '.$style);
00559 }
00560
00561 $this->FontFamily=$family;
00562 $this->FontStyle=$style;
00563 $this->FontSizePt=$size;
00564 $this->FontSize=$size/$this->k;
00565 $this->CurrentFont=&$this->fonts[$fontkey];
00566 if($this->page>0)
00567 $this->_out(sprintf('BT /F%d %.2f Tf ET',$this->CurrentFont['i'],$this->FontSizePt));
00568 }
00569
00570 function SetFontSize($size)
00571 {
00572
00573 if($this->FontSizePt==$size)
00574 return;
00575 $this->FontSizePt=$size;
00576 $this->FontSize=$size/$this->k;
00577 if($this->page>0)
00578 $this->_out(sprintf('BT /F%d %.2f Tf ET',$this->CurrentFont['i'],$this->FontSizePt));
00579 }
00580
00581 function AddLink()
00582 {
00583
00584 $n=count($this->links)+1;
00585 $this->links[$n]=array(0,0);
00586 return $n;
00587 }
00588
00589 function SetLink($link,$y=0,$page=-1)
00590 {
00591
00592 if($y==-1)
00593 $y=$this->y;
00594 if($page==-1)
00595 $page=$this->page;
00596 $this->links[$link]=array($page,$y);
00597 }
00598
00599 function Link($x,$y,$w,$h,$link)
00600 {
00601
00602 $this->PageLinks[$this->page][]=array($x*$this->k,$this->hPt-$y*$this->k,$w*$this->k,$h*$this->k,$link);
00603 }
00604
00605 function Text($x,$y,$txt)
00606 {
00607
00608 $s=sprintf('BT %.2f %.2f Td (%s) Tj ET',$x*$this->k,($this->h-$y)*$this->k,$this->_escape($txt));
00609 if($this->underline and $txt!='')
00610 $s.=' '.$this->_dounderline($x,$y,$txt);
00611 if($this->ColorFlag)
00612 $s='q '.$this->TextColor.' '.$s.' Q';
00613 $this->_out($s);
00614 }
00615
00616 function AcceptPageBreak()
00617 {
00618
00619 return $this->AutoPageBreak;
00620 }
00621
00622 function Cell($w,$h=0,$txt='',$border=0,$ln=0,$align='',$fill=0,$link='')
00623 {
00624
00625 $k=$this->k;
00626 if($this->y+$h>$this->PageBreakTrigger and !$this->InFooter and $this->AcceptPageBreak())
00627 {
00628
00629 $x=$this->x;
00630 $ws=$this->ws;
00631 if($ws>0)
00632 {
00633 $this->ws=0;
00634 $this->_out('0 Tw');
00635 }
00636 $this->AddPage($this->CurOrientation);
00637 $this->x=$x;
00638 if($ws>0)
00639 {
00640 $this->ws=$ws;
00641 $this->_out(sprintf('%.3f Tw',$ws*$k));
00642 }
00643 }
00644 if($w==0)
00645 $w=$this->w-$this->rMargin-$this->x;
00646 $s='';
00647 if($fill==1 or $border==1)
00648 {
00649 if($fill==1)
00650 $op=($border==1) ? 'B' : 'f';
00651 else
00652 $op='S';
00653 $s=sprintf('%.2f %.2f %.2f %.2f re %s ',$this->x*$k,($this->h-$this->y)*$k,$w*$k,-$h*$k,$op);
00654 }
00655 if(is_string($border))
00656 {
00657 $x=$this->x;
00658 $y=$this->y;
00659 if(is_int(strpos($border,'L')))
00660 $s.=sprintf('%.2f %.2f m %.2f %.2f l S ',$x*$k,($this->h-$y)*$k,$x*$k,($this->h-($y+$h))*$k);
00661 if(is_int(strpos($border,'T')))
00662 $s.=sprintf('%.2f %.2f m %.2f %.2f l S ',$x*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-$y)*$k);
00663 if(is_int(strpos($border,'R')))
00664 $s.=sprintf('%.2f %.2f m %.2f %.2f l S ',($x+$w)*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-($y+$h))*$k);
00665 if(is_int(strpos($border,'B')))
00666 $s.=sprintf('%.2f %.2f m %.2f %.2f l S ',$x*$k,($this->h-($y+$h))*$k,($x+$w)*$k,($this->h-($y+$h))*$k);
00667 }
00668 if($txt!='')
00669 {
00670 if($align=='R')
00671 $dx=$w-$this->cMargin-$this->GetStringWidth($txt);
00672 elseif($align=='C')
00673 $dx=($w-$this->GetStringWidth($txt))/2;
00674 else
00675 $dx=$this->cMargin;
00676 if($this->ColorFlag)
00677 $s.='q '.$this->TextColor.' ';
00678 $txt2=str_replace(')','\\)',str_replace('(','\\(',str_replace('\\','\\\\',$txt)));
00679 $s.=sprintf('BT %.2f %.2f Td (%s) Tj ET',($this->x+$dx)*$k,($this->h-($this->y+.5*$h+.3*$this->FontSize))*$k,$txt2);
00680 if($this->underline)
00681 $s.=' '.$this->_dounderline($this->x+$dx,$this->y+.5*$h+.3*$this->FontSize,$txt);
00682 if($this->ColorFlag)
00683 $s.=' Q';
00684 if($link)
00685 $this->Link($this->x+$dx,$this->y+.5*$h-.5*$this->FontSize,$this->GetStringWidth($txt),$this->FontSize,$link);
00686 }
00687 if($s)
00688 $this->_out($s);
00689 $this->lasth=$h;
00690 if($ln>0)
00691 {
00692
00693 $this->y+=$h;
00694 if($ln==1)
00695 $this->x=$this->lMargin;
00696 }
00697 else
00698 $this->x+=$w;
00699 }
00700
00701 function MultiCell($w,$h,$txt,$border=0,$align='J',$fill=0)
00702 {
00703
00704 $cw=&$this->CurrentFont['cw'];
00705 if($w==0)
00706 $w=$this->w-$this->rMargin-$this->x;
00707 $wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
00708 $s=str_replace("\r",'',$txt);
00709 $nb=strlen($s);
00710 if($nb>0 and $s[$nb-1]=="\n")
00711 $nb--;
00712 $b=0;
00713 if($border)
00714 {
00715 if($border==1)
00716 {
00717 $border='LTRB';
00718 $b='LRT';
00719 $b2='LR';
00720 }
00721 else
00722 {
00723 $b2='';
00724 if(is_int(strpos($border,'L')))
00725 $b2.='L';
00726 if(is_int(strpos($border,'R')))
00727 $b2.='R';
00728 $b=is_int(strpos($border,'T')) ? $b2.'T' : $b2;
00729 }
00730 }
00731 $sep=-1;
00732 $i=0;
00733 $j=0;
00734 $l=0;
00735 $ns=0;
00736 $nl=1;
00737 while($i<$nb)
00738 {
00739
00740 $c=$s{$i};
00741 if($c=="\n")
00742 {
00743
00744 if($this->ws>0)
00745 {
00746 $this->ws=0;
00747 $this->_out('0 Tw');
00748 }
00749 $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill);
00750 $i++;
00751 $sep=-1;
00752 $j=$i;
00753 $l=0;
00754 $ns=0;
00755 $nl++;
00756 if($border and $nl==2)
00757 $b=$b2;
00758 continue;
00759 }
00760 if($c==' ')
00761 {
00762 $sep=$i;
00763 $ls=$l;
00764 $ns++;
00765 }
00766 $l+=isset($cw[ord($c)])?$cw[ord($c)]:0;
00767 if($l>$wmax)
00768 {
00769
00770 if($sep==-1)
00771 {
00772 if($i==$j)
00773 $i++;
00774 if($this->ws>0)
00775 {
00776 $this->ws=0;
00777 $this->_out('0 Tw');
00778 }
00779 $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill);
00780 }
00781 else
00782 {
00783 if($align=='J')
00784 {
00785 $this->ws=($ns>1) ? ($wmax-$ls)/1000*$this->FontSize/($ns-1) : 0;
00786 $this->_out(sprintf('%.3f Tw',$this->ws*$this->k));
00787 }
00788 $this->Cell($w,$h,substr($s,$j,$sep-$j),$b,2,$align,$fill);
00789 $i=$sep+1;
00790 }
00791 $sep=-1;
00792 $j=$i;
00793 $l=0;
00794 $ns=0;
00795 $nl++;
00796 if($border and $nl==2)
00797 $b=$b2;
00798 }
00799 else
00800 $i++;
00801 }
00802
00803 if($this->ws>0)
00804 {
00805 $this->ws=0;
00806 $this->_out('0 Tw');
00807 }
00808 if($border and is_int(strpos($border,'B')))
00809 $b.='B';
00810 $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill);
00811 $this->x=$this->lMargin;
00812 }
00813
00814 function Write($h,$txt,$link='')
00815 {
00816
00817 $cw=&$this->CurrentFont['cw'];
00818 $w=$this->w-$this->rMargin-$this->x;
00819 $wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
00820 $s=str_replace("\r",'',$txt);
00821 $nb=strlen($s);
00822 $sep=-1;
00823 $i=0;
00824 $j=0;
00825 $l=0;
00826 $nl=1;
00827 while($i<$nb)
00828 {
00829
00830 $c=$s{$i};
00831 if($c=="\n")
00832 {
00833
00834 $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link);
00835 $i++;
00836 $sep=-1;
00837 $j=$i;
00838 $l=0;
00839 if($nl==1)
00840 {
00841 $this->x=$this->lMargin;
00842 $w=$this->w-$this->rMargin-$this->x;
00843 $wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
00844 }
00845 $nl++;
00846 continue;
00847 }
00848 if($c==' ')
00849 $sep=$i;
00850 $l+=$cw[$c];
00851 if($l>$wmax)
00852 {
00853
00854 if($sep==-1)
00855 {
00856 if($this->x>$this->lMargin)
00857 {
00858
00859 $this->x=$this->lMargin;
00860 $this->y+=$h;
00861 $w=$this->w-$this->rMargin-$this->x;
00862 $wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
00863 $i++;
00864 $nl++;
00865 continue;
00866 }
00867 if($i==$j)
00868 $i++;
00869 $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link);
00870 }
00871 else
00872 {
00873 $this->Cell($w,$h,substr($s,$j,$sep-$j),0,2,'',0,$link);
00874 $i=$sep+1;
00875 }
00876 $sep=-1;
00877 $j=$i;
00878 $l=0;
00879 if($nl==1)
00880 {
00881 $this->x=$this->lMargin;
00882 $w=$this->w-$this->rMargin-$this->x;
00883 $wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
00884 }
00885 $nl++;
00886 }
00887 else
00888 $i++;
00889 }
00890
00891 if($i!=$j)
00892 $this->Cell($l/1000*$this->FontSize,$h,substr($s,$j),0,0,'',0,$link);
00893 }
00894
00895 function Image($file,$x,$y,$w=0,$h=0,$type='',$link='')
00896 {
00897
00898 if(!isset($this->images[$file]))
00899 {
00900
00901 if($type=='')
00902 {
00903 $pos=strrpos($file,'.');
00904 if(!$pos)
00905 $this->Error('Image file has no extension and no type was specified: '.$file);
00906 $type=substr($file,$pos+1);
00907 }
00908 $type=strtolower($type);
00909 $mqr=get_magic_quotes_runtime();
00910 set_magic_quotes_runtime(0);
00911 if($type=='jpg' or $type=='jpeg')
00912 $info=$this->_parsejpg($file);
00913 elseif($type=='png')
00914 $info=$this->_parsepng($file);
00915 else
00916 {
00917
00918 $mtd='_parse'.$type;
00919 if(!method_exists($this,$mtd))
00920 $this->Error('Unsupported image type: '.$type);
00921 $info=$this->$mtd($file);
00922 }
00923 set_magic_quotes_runtime($mqr);
00924 $info['i']=count($this->images)+1;
00925 $this->images[$file]=$info;
00926 }
00927 else
00928 $info=$this->images[$file];
00929
00930 if($w==0 and $h==0)
00931 {
00932
00933 $w=$info['w']/$this->k;
00934 $h=$info['h']/$this->k;
00935 }
00936 if($w==0)
00937 $w=$h*$info['w']/$info['h'];
00938 if($h==0)
00939 $h=$w*$info['h']/$info['w'];
00940 $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']));
00941 if($link)
00942 $this->Link($x,$y,$w,$h,$link);
00943 }
00944
00945 function Ln($h='')
00946 {
00947
00948 $this->x=$this->lMargin;
00949 if(is_string($h))
00950 $this->y+=$this->lasth;
00951 else
00952 $this->y+=$h;
00953 }
00954
00955 function GetX()
00956 {
00957
00958 return $this->x;
00959 }
00960
00961 function SetX($x)
00962 {
00963
00964 if($x>=0)
00965 $this->x=$x;
00966 else
00967 $this->x=$this->w+$x;
00968 }
00969
00970 function GetY()
00971 {
00972
00973 return $this->y;
00974 }
00975
00976 function SetY($y)
00977 {
00978
00979 $this->x=$this->lMargin;
00980 if($y>=0)
00981 $this->y=$y;
00982 else
00983 $this->y=$this->h+$y;
00984 }
00985
00986 function SetXY($x,$y)
00987 {
00988
00989 $this->SetY($y);
00990 $this->SetX($x);
00991 }
00992
00993 function Output($name='',$dest='')
00994 {
00995
00996
00997
00998
00999
01000 if($this->state<3)
01001 $this->Close();
01002
01003 if(is_bool($dest))
01004 $dest=$dest ? 'D' : 'F';
01005 $dest=strtoupper($dest);
01006 if($dest=='')
01007 {
01008 if($name=='')
01009 {
01010 $name='doc.pdf';
01011 $dest='I';
01012 }
01013 else
01014 $dest='F';
01015 }
01016 switch($dest)
01017 {
01018 case 'I':
01019
01020
01021
01022 if(isset($_SERVER['SERVER_NAME']))
01023 {
01024
01025 Header('Content-Type: application/pdf');
01026 if(headers_sent())
01027 $this->Error('Some data has already been output to browser, can\'t send PDF file');
01028 Header('Content-Length: '.strlen($this->buffer));
01029 Header('Content-disposition: inline; filename='.$name);
01030 }
01031 echo $this->buffer;
01032 break;
01033 case 'D':
01034
01035
01036
01037 if(isset($_SERVER['HTTP_USER_AGENT']) and strpos($_SERVER['HTTP_USER_AGENT'],'MSIE'))
01038 Header('Content-Type: application/force-download');
01039 else
01040 Header('Content-Type: application/octet-stream');
01041 if(headers_sent())
01042 $this->Error('Some data has already been output to browser, can\'t send PDF file');
01043 Header('Content-Length: '.strlen($this->buffer));
01044 Header('Content-disposition: attachment; filename='.$name);
01045 echo $this->buffer;
01046 break;
01047 case 'F':
01048
01049 $f=fopen($name,'wb');
01050 if(!$f)
01051 $this->Error('Unable to create output file: '.$name);
01052 fwrite($f,$this->buffer,strlen($this->buffer));
01053 fclose($f);
01054 break;
01055 case 'S':
01056
01057 return $this->buffer;
01058 default:
01059 $this->Error('Incorrect output destination: '.$dest);
01060 }
01061 return '';
01062 }
01063
01064
01065
01066
01067
01068
01069 function _dochecks()
01070 {
01071
01072 if(1.1==1)
01073 $this->Error('Don\'t alter the locale before including class file');
01074
01075 if(sprintf('%.1f',1.0)!='1.0')
01076 setlocale(LC_NUMERIC,'C');
01077 }
01078
01079 function _begindoc()
01080 {
01081
01082 $this->state=1;
01083 $this->_out('%PDF-1.3');
01084 }
01085
01086 function _strreplace($what, $to, $where) {
01087 return str_replace($what, $to, $where);
01088 }
01089
01090 function _putpages()
01091 {
01092 $nb=$this->page;
01093 if(!empty($this->AliasNbPages))
01094 {
01095
01096 for($n=1;$n<=$nb;$n++)
01097 $this->pages[$n]=$this->_strreplace($this->AliasNbPages,$nb,$this->pages[$n]);
01098 }
01099 if($this->DefOrientation=='P')
01100 {
01101 $wPt=$this->fwPt;
01102 $hPt=$this->fhPt;
01103 }
01104 else
01105 {
01106 $wPt=$this->fhPt;
01107 $hPt=$this->fwPt;
01108 }
01109 $filter=($this->compress) ? '/Filter /FlateDecode ' : '';
01110 for($n=1;$n<=$nb;$n++)
01111 {
01112
01113 $this->_newobj();
01114 $this->_out('<</Type /Page');
01115 $this->_out('/Parent 1 0 R');
01116 if(isset($this->OrientationChanges[$n]))
01117 $this->_out(sprintf('/MediaBox [0 0 %.2f %.2f]',$hPt,$wPt));
01118 $this->_out('/Resources 2 0 R');
01119 if(isset($this->PageLinks[$n]))
01120 {
01121
01122 $annots='/Annots [';
01123 foreach($this->PageLinks[$n] as $pl)
01124 {
01125 $rect=sprintf('%.2f %.2f %.2f %.2f',$pl[0],$pl[1],$pl[0]+$pl[2],$pl[1]-$pl[3]);
01126 $annots.='<</Type /Annot /Subtype /Link /Rect ['.$rect.'] /Border [0 0 0] ';
01127 if(is_string($pl[4]))
01128 $annots.='/A <</S /URI /URI '.$this->_textstring($pl[4]).'>>>>';
01129 else
01130 {
01131 $l=$this->links[$pl[4]];
01132 $h=isset($this->OrientationChanges[$l[0]]) ? $wPt : $hPt;
01133 $annots.=sprintf('/Dest [%d 0 R /XYZ 0 %.2f null]>>',1+2*$l[0],$h-$l[1]*$this->k);
01134 }
01135 }
01136 $this->_out($annots.']');
01137 }
01138 $this->_out('/Contents '.($this->n+1).' 0 R>>');
01139 $this->_out('endobj');
01140
01141 $p=($this->compress) ? gzcompress($this->pages[$n]) : $this->pages[$n];
01142 $this->_newobj();
01143 $this->_out('<<'.$filter.'/Length '.strlen($p).'>>');
01144 $this->_putstream($p);
01145 $this->_out('endobj');
01146 }
01147
01148 $this->offsets[1]=strlen($this->buffer);
01149 $this->_out('1 0 obj');
01150 $this->_out('<</Type /Pages');
01151 $kids='/Kids [';
01152 for($i=0;$i<$nb;$i++)
01153 $kids.=(3+2*$i).' 0 R ';
01154 $this->_out($kids.']');
01155 $this->_out('/Count '.$nb);
01156 $this->_out(sprintf('/MediaBox [0 0 %.2f %.2f]',$wPt,$hPt));
01157 $this->_out('>>');
01158 $this->_out('endobj');
01159 }
01160
01161 function _putfonts()
01162 {
01163 $nf=$this->n;
01164 foreach($this->diffs as $diff)
01165 {
01166
01167 $this->_newobj();
01168 $this->_out('<</Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences ['.$diff.']>>');
01169 $this->_out('endobj');
01170 }
01171 $mqr=get_magic_quotes_runtime();
01172 set_magic_quotes_runtime(0);
01173 foreach($this->FontFiles as $file=>$info)
01174 {
01175
01176 $this->_newobj();
01177 $this->FontFiles[$file]['n']=$this->n;
01178 if(defined('FPDF_FONTPATH'))
01179 $file=FPDF_FONTPATH.$file;
01180 $size=filesize($file);
01181 if(!$size)
01182 $this->Error('Font file not found');
01183 $this->_out('<</Length '.$size);
01184 if(substr($file,-2)=='.z')
01185 $this->_out('/Filter /FlateDecode');
01186 $this->_out('/Length1 '.$info['length1']);
01187 if(isset($info['length2']))
01188 $this->_out('/Length2 '.$info['length2'].' /Length3 0');
01189 $this->_out('>>');
01190 $f=fopen($file,'rb');
01191 $this->_putstream(fread($f,$size));
01192 fclose($f);
01193 $this->_out('endobj');
01194 }
01195 set_magic_quotes_runtime($mqr);
01196 foreach($this->fonts as $k=>$font)
01197 {
01198
01199 $this->fonts[$k]['n']=$this->n+1;
01200 $type=$font['type'];
01201 $name=$font['name'];
01202 if($type=='core')
01203 {
01204
01205 $this->_newobj();
01206 $this->_out('<</Type /Font');
01207 $this->_out('/BaseFont /'.$name);
01208 $this->_out('/Subtype /Type1');
01209 if($name!='Symbol' and $name!='ZapfDingbats')
01210 $this->_out('/Encoding /WinAnsiEncoding');
01211 $this->_out('>>');
01212 $this->_out('endobj');
01213 }
01214 elseif($type=='Type1' or $type=='TrueType')
01215 {
01216
01217 $this->_newobj();
01218 $this->_out('<</Type /Font');
01219 $this->_out('/BaseFont /'.$name);
01220 $this->_out('/Subtype /'.$type);
01221 $this->_out('/FirstChar 32 /LastChar 255');
01222 $this->_out('/Widths '.($this->n+1).' 0 R');
01223 $this->_out('/FontDescriptor '.($this->n+2).' 0 R');
01224 if($font['enc'])
01225 {
01226 if(isset($font['diff']))
01227 $this->_out('/Encoding '.($nf+$font['diff']).' 0 R');
01228 else
01229 $this->_out('/Encoding /WinAnsiEncoding');
01230 }
01231 $this->_out('>>');
01232 $this->_out('endobj');
01233
01234 $this->_newobj();
01235 $cw=&$font['cw'];
01236 $s='[';
01237 for($i=32;$i<=255;$i++)
01238 $s.=$cw[chr($i)].' ';
01239 $this->_out($s.']');
01240 $this->_out('endobj');
01241
01242 $this->_newobj();
01243 $s='<</Type /FontDescriptor /FontName /'.$name;
01244 foreach($font['desc'] as $k=>$v)
01245 $s.=' /'.$k.' '.$v;
01246 $file=$font['file'];
01247 if($file)
01248 $s.=' /FontFile'.($type=='Type1' ? '' : '2').' '.$this->FontFiles[$file]['n'].' 0 R';
01249 $this->_out($s.'>>');
01250 $this->_out('endobj');
01251 }
01252 else
01253 {
01254
01255 $mtd='_put'.strtolower($type);
01256 if(!method_exists($this,$mtd))
01257 $this->Error('Unsupported font type: '.$type);
01258 $this->$mtd($font);
01259 }
01260 }
01261 }
01262
01263 function _putimages()
01264 {
01265 $filter=($this->compress) ? '/Filter /FlateDecode ' : '';
01266 reset($this->images);
01267 while(list($file,$info)=each($this->images))
01268 {
01269 $this->_newobj();
01270 $this->images[$file]['n']=$this->n;
01271 $this->_out('<</Type /XObject');
01272 $this->_out('/Subtype /Image');
01273 $this->_out('/Width '.$info['w']);
01274 $this->_out('/Height '.$info['h']);
01275 if($info['cs']=='Indexed')
01276 $this->_out('/ColorSpace [/Indexed /DeviceRGB '.(strlen($info['pal'])/3-1).' '.($this->n+1).' 0 R]');
01277 else
01278 {
01279 $this->_out('/ColorSpace /'.$info['cs']);
01280 if($info['cs']=='DeviceCMYK')
01281 $this->_out('/Decode [1 0 1 0 1 0 1 0]');
01282 }
01283 $this->_out('/BitsPerComponent '.$info['bpc']);
01284 $this->_out('/Filter /'.$info['f']);
01285 if(isset($info['parms']))
01286 $this->_out($info['parms']);
01287 if(isset($info['trns']) and is_array($info['trns']))
01288 {
01289 $trns='';
01290 for($i=0;$i<count($info['trns']);$i++)
01291 $trns.=$info['trns'][$i].' '.$info['trns'][$i].' ';
01292 $this->_out('/Mask ['.$trns.']');
01293 }
01294 $this->_out('/Length '.strlen($info['data']).'>>');
01295 $this->_putstream($info['data']);
01296 unset($this->images[$file]['data']);
01297 $this->_out('endobj');
01298
01299 if($info['cs']=='Indexed')
01300 {
01301 $this->_newobj();
01302 $pal=($this->compress) ? gzcompress($info['pal']) : $info['pal'];
01303 $this->_out('<<'.$filter.'/Length '.strlen($pal).'>>');
01304 $this->_putstream($pal);
01305 $this->_out('endobj');
01306 }
01307 }
01308 }
01309
01310 function _putresources()
01311 {
01312 $this->_putfonts();
01313 $this->_putimages();
01314
01315 $this->offsets[2]=strlen($this->buffer);
01316 $this->_out('2 0 obj');
01317 $this->_out('<</ProcSet [/PDF /Text /ImageB /ImageC /ImageI]');
01318 $this->_out('/Font <<');
01319 foreach($this->fonts as $font)
01320 $this->_out('/F'.$font['i'].' '.$font['n'].' 0 R');
01321 $this->_out('>>');
01322 if(count($this->images))
01323 {
01324 $this->_out('/XObject <<');
01325 foreach($this->images as $image)
01326 $this->_out('/I'.$image['i'].' '.$image['n'].' 0 R');
01327 $this->_out('>>');
01328 }
01329 $this->_out('>>');
01330 $this->_out('endobj');
01331 }
01332
01333 function _putinfo()
01334 {
01335 $this->_out('/Producer '.$this->_textstring('FPDF '.FPDF_VERSION));
01336 if(!empty($this->title))
01337 $this->_out('/Title '.$this->_textstring($this->title));
01338 if(!empty($this->subject))
01339 $this->_out('/Subject '.$this->_textstring($this->subject));
01340 if(!empty($this->author))
01341 $this->_out('/Author '.$this->_textstring($this->author));
01342 if(!empty($this->keywords))
01343 $this->_out('/Keywords '.$this->_textstring($this->keywords));
01344 if(!empty($this->creator))
01345 $this->_out('/Creator '.$this->_textstring($this->creator));
01346 $this->_out('/CreationDate '.$this->_textstring('D:'.date('YmdHis')));
01347 }
01348
01349 function _putcatalog()
01350 {
01351 $this->_out('/Type /Catalog');
01352 $this->_out('/Pages 1 0 R');
01353 if($this->ZoomMode=='fullpage')
01354 $this->_out('/OpenAction [3 0 R /Fit]');
01355 elseif($this->ZoomMode=='fullwidth')
01356 $this->_out('/OpenAction [3 0 R /FitH null]');
01357 elseif($this->ZoomMode=='real')
01358 $this->_out('/OpenAction [3 0 R /XYZ null null 1]');
01359 elseif(!is_string($this->ZoomMode))
01360 $this->_out('/OpenAction [3 0 R /XYZ null null '.($this->ZoomMode/100).']');
01361 if($this->LayoutMode=='single')
01362 $this->_out('/PageLayout /SinglePage');
01363 elseif($this->LayoutMode=='continuous')
01364 $this->_out('/PageLayout /OneColumn');
01365 elseif($this->LayoutMode=='two')
01366 $this->_out('/PageLayout /TwoColumnLeft');
01367 }
01368
01369 function _puttrailer()
01370 {
01371 $this->_out('/Size '.($this->n+1));
01372 $this->_out('/Root '.$this->n.' 0 R');
01373 $this->_out('/Info '.($this->n-1).' 0 R');
01374 }
01375
01376 function _enddoc()
01377 {
01378 $this->_putpages();
01379 $this->_putresources();
01380
01381 $this->_newobj();
01382 $this->_out('<<');
01383 $this->_putinfo();
01384 $this->_out('>>');
01385 $this->_out('endobj');
01386
01387 $this->_newobj();
01388 $this->_out('<<');
01389 $this->_putcatalog();
01390 $this->_out('>>');
01391 $this->_out('endobj');
01392
01393 $o=strlen($this->buffer);
01394 $this->_out('xref');
01395 $this->_out('0 '.($this->n+1));
01396 $this->_out('0000000000 65535 f ');
01397 for($i=1;$i<=$this->n;$i++)
01398 $this->_out(sprintf('%010d 00000 n ',$this->offsets[$i]));
01399
01400 $this->_out('trailer');
01401 $this->_out('<<');
01402 $this->_puttrailer();
01403 $this->_out('>>');
01404 $this->_out('startxref');
01405 $this->_out($o);
01406 $this->_out('%%EOF');
01407 $this->state=3;
01408 }
01409
01410 function _beginpage($orientation)
01411 {
01412 $this->page++;
01413 $this->pages[$this->page]='';
01414 $this->state=2;
01415 $this->x=$this->lMargin;
01416 $this->y=$this->tMargin;
01417 $this->FontFamily='';
01418
01419 if(!$orientation)
01420 $orientation=$this->DefOrientation;
01421 else
01422 {
01423 $orientation=strtoupper($orientation{0});
01424 if($orientation!=$this->DefOrientation)
01425 $this->OrientationChanges[$this->page]=true;
01426 }
01427 if($orientation!=$this->CurOrientation)
01428 {
01429
01430 if($orientation=='P')
01431 {
01432 $this->wPt=$this->fwPt;
01433 $this->hPt=$this->fhPt;
01434 $this->w=$this->fw;
01435 $this->h=$this->fh;
01436 }
01437 else
01438 {
01439 $this->wPt=$this->fhPt;
01440 $this->hPt=$this->fwPt;
01441 $this->w=$this->fh;
01442 $this->h=$this->fw;
01443 }
01444 $this->PageBreakTrigger=$this->h-$this->bMargin;
01445 $this->CurOrientation=$orientation;
01446 }
01447 }
01448
01449 function _endpage()
01450 {
01451
01452 $this->state=1;
01453 }
01454
01455 function _newobj()
01456 {
01457
01458 $this->n++;
01459 $this->offsets[$this->n]=strlen($this->buffer);
01460 $this->_out($this->n.' 0 obj');
01461 }
01462
01463 function _dounderline($x,$y,$txt)
01464 {
01465
01466 $up=$this->CurrentFont['up'];
01467 $ut=$this->CurrentFont['ut'];
01468 $w=$this->GetStringWidth($txt)+$this->ws*substr_count($txt,' ');
01469 return sprintf('%.2f %.2f %.2f %.2f re f',$x*$this->k,($this->h-($y-$up/1000*$this->FontSize))*$this->k,$w*$this->k,-$ut/1000*$this->FontSizePt);
01470 }
01471
01472 function _parsejpg($file)
01473 {
01474
01475 $a=GetImageSize($file);
01476 if(!$a)
01477 $this->Error('Missing or incorrect image file: '.$file);
01478 if($a[2]!=2)
01479 $this->Error('Not a JPEG file: '.$file);
01480 if(!isset($a['channels']) or $a['channels']==3)
01481 $colspace='DeviceRGB';
01482 elseif($a['channels']==4)
01483 $colspace='DeviceCMYK';
01484 else
01485 $colspace='DeviceGray';
01486 $bpc=isset($a['bits']) ? $a['bits'] : 8;
01487
01488 $f=fopen($file,'rb');
01489 $data='';
01490 while(!feof($f))
01491 $data.=fread($f,4096);
01492 fclose($f);
01493 return array('w'=>$a[0],'h'=>$a[1],'cs'=>$colspace,'bpc'=>$bpc,'f'=>'DCTDecode','data'=>$data);
01494 }
01495
01496 function _parsepng($file)
01497 {
01498
01499 $f=fopen($file,'rb');
01500 if(!$f)
01501 $this->Error('Can\'t open image file: '.$file);
01502
01503 if(fread($f,8)!=chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10))
01504 $this->Error('Not a PNG file: '.$file);
01505
01506 fread($f,4);
01507 if(fread($f,4)!='IHDR')
01508 $this->Error('Incorrect PNG file: '.$file);
01509 $w=$this->_freadint($f);
01510 $h=$this->_freadint($f);
01511 $bpc=ord(fread($f,1));
01512 if($bpc>8)
01513 $this->Error('16-bit depth not supported: '.$file);
01514 $ct=ord(fread($f,1));
01515 if($ct==0)
01516 $colspace='DeviceGray';
01517 elseif($ct==2)
01518 $colspace='DeviceRGB';
01519 elseif($ct==3)
01520 $colspace='Indexed';
01521 else
01522 $this->Error('Alpha channel not supported: '.$file);
01523 if(ord(fread($f,1))!=0)
01524 $this->Error('Unknown compression method: '.$file);
01525 if(ord(fread($f,1))!=0)
01526 $this->Error('Unknown filter method: '.$file);
01527 if(ord(fread($f,1))!=0)
01528 $this->Error('Interlacing not supported: '.$file);
01529 fread($f,4);
01530 $parms='/DecodeParms <</Predictor 15 /Colors '.($ct==2 ? 3 : 1).' /BitsPerComponent '.$bpc.' /Columns '.$w.'>>';
01531
01532 $pal='';
01533 $trns='';
01534 $data='';
01535 do
01536 {
01537 $n=$this->_freadint($f);
01538 $type=fread($f,4);
01539 if($type=='PLTE')
01540 {
01541
01542 $pal=fread($f,$n);
01543 fread($f,4);
01544 }
01545 elseif($type=='tRNS')
01546 {
01547
01548 $t=fread($f,$n);
01549 if($ct==0)
01550 $trns=array(ord(substr($t,1,1)));
01551 elseif($ct==2)
01552 $trns=array(ord(substr($t,1,1)),ord(substr($t,3,1)),ord(substr($t,5,1)));
01553 else
01554 {
01555 $pos=strpos($t,chr(0));
01556 if(is_int($pos))
01557 $trns=array($pos);
01558 }
01559 fread($f,4);
01560 }
01561 elseif($type=='IDAT')
01562 {
01563
01564 $data.=fread($f,$n);
01565 fread($f,4);
01566 }
01567 elseif($type=='IEND')
01568 break;
01569 else
01570 fread($f,$n+4);
01571 }
01572 while($n);
01573 if($colspace=='Indexed' and empty($pal))
01574 $this->Error('Missing palette in '.$file);
01575 fclose($f);
01576 return array('w'=>$w,'h'=>$h,'cs'=>$colspace,'bpc'=>$bpc,'f'=>'FlateDecode','parms'=>$parms,'pal'=>$pal,'trns'=>$trns,'data'=>$data);
01577 }
01578
01579 function _freadint($f)
01580 {
01581
01582 $i=ord(fread($f,1))<<24;
01583 $i+=ord(fread($f,1))<<16;
01584 $i+=ord(fread($f,1))<<8;
01585 $i+=ord(fread($f,1));
01586 return $i;
01587 }
01588
01589 function _textstring($s)
01590 {
01591
01592 return '('.$this->_escape($s).')';
01593 }
01594
01595 function _escape($s)
01596 {
01597
01598 return str_replace(')','\\)',str_replace('(','\\(',str_replace('\\','\\\\',$s)));
01599 }
01600
01601 function _putstream($s)
01602 {
01603 $this->_out('stream');
01604 $this->_out($s);
01605 $this->_out('endstream');
01606 }
01607
01608 function _out($s)
01609 {
01610
01611 if($this->state==2)
01612 $this->pages[$this->page].=$s."\n";
01613 else
01614 $this->buffer.=$s."\n";
01615 }
01616
01617 }
01618
01619
01620
01621
01622 if(isset($_SERVER['HTTP_USER_AGENT']) and $_SERVER['HTTP_USER_AGENT']=='contype')
01623 {
01624 Header('Content-Type: application/pdf');
01625 exit;
01626 }
01627
01628 }
01629 ?>