hcportal-dev/Aiko/Libs/MyPdf.php

1303 lines
37 KiB
PHP

<?php
namespace Aiko;
use \fpdf\FPDF;
/**
* mypdf merupakan class untuk membuat laporan pdf
*/
class MyPdf extends FPDF
{
var $encrypted = false; //whether document is protected
var $Uvalue; //U entry in pdf document
var $Ovalue; //O entry in pdf document
var $Pvalue; //P entry in pdf document
var $enc_obj_id; //encryption object id
private $widths;
private $aligns;
private $angle=0;
protected $wLine; // Maximum width of the line
protected $hLine; // Height of the line
protected $Text; // Text to display
protected $border;
protected $align; // Justification of the text
protected $fill;
protected $Padding;
protected $lPadding;
protected $tPadding;
protected $bPadding;
protected $rPadding;
protected $TagStyle; // Style for each tag
protected $Indent;
protected $Space; // Minimum space between words
protected $PileStyle;
protected $Line2Print; // Line to display
protected $NextLineBegin; // Buffer between lines
protected $TagName;
protected $Delta; // Maximum width minus width
protected $StringLength;
protected $LineLength;
protected $wTextLine; // Width minus paddings
protected $nbSpace; // Number of spaces in the line
protected $Xini; // Initial position
protected $href; // Current URL
protected $TagHref; // URL for a cell
function __construct($orientation='P', $unit='mm', $size='A4') {
parent::__construct($orientation, $unit, $size);
}
public function SetWidths($w)
{
//Set the array of column widths
$this->widths=$w;
}
public function SetAligns($a)
{
//Set the array of column alignments
$this->aligns=$a;
}
function RowAja($data)
{
//Calculate the height of the row
$nb=0;
for($i=0;$i<count($data);$i++)
$nb=max($nb,$this->NbLines($this->widths[$i],$data[$i]));
$h=5*$nb;
//Issue a page break first if needed
$this->CheckPageBreak($h);
//Draw the cells of the row
for($i=0;$i<count($data);$i++)
{
$w=$this->widths[$i];
$a=isset($this->aligns[$i]) ? $this->aligns[$i] : 'L';
//Save the current position
$x=$this->GetX();
$y=$this->GetY();
//Draw the border
$this->Rect($x,$y,$w,$h);
//Print the text
$this->MultiCell($w,5,$data[$i],0,$a);
//Put the position to the right of the cell
$this->SetXY($x+$w,$y);
}
//Go to the next line
$this->Ln($h);
}
public function Row($data,$border=0,$fill=0,$draw=0)
{
//Calculate the height of the row
$nb=0;
for($i=0;$i<count($data);$i++){
$nb=max($nb,$this->NbLines($this->widths[$i],$data[$i]));
}
$h=5*$nb;
//Issue a page break first if needed
$this->CheckPageBreak($h);
//Draw the cells of the row
for($i=0;$i<count($data);$i++)
{
$w=$this->widths[$i];
$nb1=$this->NbLines($this->widths[$i],$data[$i]);
$a=isset($this->aligns[$i]) ? $this->aligns[$i] : 'L';
// $h1=isset($this->height[$i]) ? $this->height[$i] :5;
//Save the current position
$x=$this->GetX();
$y=$this->GetY();
//Draw the border
$this->Rect($x,$y,$w,$h,$draw);
//Print the text
$this->MultiCell($w,($h/$nb1),$data[$i],$border,$a,$fill);
//Put the position to the right of the cell
$this->SetXY($x+$w,$y);
}
//Go to the next line
$this->Ln($h);
}
public function RowNoBorder($data,$border=0,$fill=0,$draw=0)
{
//Calculate the height of the row
$border=0;
$nb=0;
for($i=0;$i<count($data);$i++){
$nb=max($nb,$this->NbLines($this->widths[$i],$data[$i]));
}
$h=5*$nb;
//Issue a page break first if needed
$this->CheckPageBreak($h);
//Draw the cells of the row
for($i=0;$i<count($data);$i++)
{
$w=$this->widths[$i];
$nb1=$this->NbLines($this->widths[$i],$data[$i]);
$a=isset($this->aligns[$i]) ? $this->aligns[$i] : 'L';
// $h1=isset($this->height[$i]) ? $this->height[$i] :5;
//Save the current position
$x=$this->GetX();
$y=$this->GetY();
//Draw the border
// $this->Rect($x,$y,$w,$h,$draw);
//Print the text
$this->MultiCell($w,($h/$nb1),$data[$i],$border,$a,$fill);
//Put the position to the right of the cell
$this->SetXY($x+$w,$y);
}
//Go to the next line
$this->Ln($h);
}
public function Rowb($data,$border=0,$fill=0,$draw=0,$besar=10)
{
//Calculate the height of the row
$nb=0;
for($i=0;$i<count($data);$i++){
$nb=max($nb,$this->NbLines($this->widths[$i],$data[$i]));
}
$h=$besar*$nb;
//Issue a page break first if needed
$this->CheckPageBreak($h);
//Draw the cells of the row
for($i=0;$i<count($data);$i++)
{
$w=$this->widths[$i];
$nb1=$this->NbLines($this->widths[$i],$data[$i]);
$a=isset($this->aligns[$i]) ? $this->aligns[$i] : 'L';
// $h1=isset($this->height[$i]) ? $this->height[$i] :5;
//Save the current position
$x=$this->GetX();
$y=$this->GetY();
//Draw the border
$this->Rect($x,$y,$w,$h,$draw);
//Print the text
$this->MultiCell($w,($h/$nb1),$data[$i],$border,$a,$fill);
//Put the position to the right of the cell
$this->SetXY($x+$w,$y);
}
//Go to the next line
$this->Ln($h);
}
public function Rowbp($data,$border=0,$fill=0,$draw=0,$besar=10,$padding=0)
{
//Calculate the height of the row
$nb=0;
for($i=0;$i<count($data);$i++){
$nb=max($nb,$this->NbLines($this->widths[$i]-($padding*2),$data[$i]));
}
$h=$besar*$nb;
//Issue a page break first if needed
$this->CheckPageBreak($h);
//Draw the cells of the row
for($i=0;$i<count($data);$i++)
{
$w=$this->widths[$i]-($padding*2);
$nb1=$this->NbLines($this->widths[$i]-($padding*2),$data[$i]);
$a=isset($this->aligns[$i]) ? $this->aligns[$i] : 'L';
// $h1=isset($this->height[$i]) ? $this->height[$i] :5;
//Save the current position
$xB=$x=$this->GetX();
$yB=$y=$this->GetY();
//Draw the border
if($border)
$this->Rect($x,$y,$w+($padding*2),$h+($padding*2),$draw);
if($padding > 0) {
// $x+=$padding;
// $y+=$padding;
// $w-=$padding;
// $h-=$padding;
$this->SetXY($x+$padding,$y+$padding);
}
//Print the text
$this->MultiCell($w,$besar,$data[$i],0,$a,$fill);
//Put the position to the right of the cell
$this->SetXY($x+$w+($padding*2),$y);
}
//Go to the next line
$this->Ln($h+($padding*2));
}
public function CheckPageBreak($h)
{
//If the height h would cause an overflow, add a new page immediately
if($this->GetY()+$h>$this->PageBreakTrigger)
$this->AddPage($this->CurOrientation);
}
public function NbLines($w,$txt)
{
//Computes the number of lines a MultiCell of width w will take
$cw=&$this->CurrentFont['cw'];
if($w==0)
$w=$this->w-$this->rMargin-$this->x;
$wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
$s=str_replace("\r",'',$txt);
$nb=strlen($s);
if($nb>0 and $s[$nb-1]=="\n")
$nb--;
$sep=-1;
$i=0;
$j=0;
$l=0;
$nl=1;
while($i<$nb)
{
$c=$s[$i];
if($c=="\n")
{
$i++;
$sep=-1;
$j=$i;
$l=0;
$nl++;
continue;
}
if($c==' ')
$sep=$i;
$l+=$cw[$c];
if($l>$wmax)
{
if($sep==-1)
{
if($i==$j)
$i++;
}
else
$i=$sep+1;
$sep=-1;
$j=$i;
$l=0;
$nl++;
}
else
$i++;
}
return $nl;
}
public function Header()
{
}
public function Footer() {
}
public function Rotate($angle,$x=-1,$y=-1)
{
if($x==-1)
$x=$this->x;
if($y==-1)
$y=$this->y;
if($this->angle!=0)
$this->_out('Q');
$this->angle=$angle;
if($angle!=0)
{
$angle*=M_PI/180;
$c=cos($angle);
$s=sin($angle);
$cx=$x*$this->k;
$cy=($this->h-$y)*$this->k;
$this->_out(sprintf('q %.5F %.5F %.5F %.5F %.2F %.2F cm 1 0 0 1 %.2F %.2F cm',$c,$s,-$s,$c,$cx,$cy,-$cx,-$cy));
}
}
public function _endpage()
{
if($this->angle!=0)
{
$this->angle=0;
$this->_out('Q');
}
parent::_endpage();
}
public function RotatedText($x,$y,$txt,$angle)
{
//Text rotated around its origin
$this->Rotate($angle,$x,$y);
$this->Text($x,$y,$txt);
$this->Rotate(0);
}
public function RotatedImage($file,$x,$y,$w,$h,$angle)
{
//Image rotated around its upper-left corner
$this->Rotate($angle,$x,$y);
$this->Image($file,$x,$y,$w,$h);
$this->Rotate(0);
}
function SetDash($black=false, $white=false)
{
if($black and $white)
$s=sprintf('[%.3f %.3f] 0 d', $black*$this->k, $white*$this->k);
else
$s='[] 0 d';
$this->_out($s);
}
function CustomMultiCell($widthBeforeCell=0, $width, $height, $text, $border=0, $align='L', $fill=0)
{
if($widthBeforeCell<>0){
$this->cell($widthBeforeCell);
}
$nb1=$this->NbLines($width,$text);
// var_dump($nb1);exit;
$this->MultiCell($width,3,$text,$border,$align,$fill);
}
/**
* Function to set permissions as well as user and owner passwords
*
* - permissions is an array with values taken from the following list:
* copy, print, modify, annot-forms
* If a value is present it means that the permission is granted
* - If a user password is set, user will be prompted before document is opened
* - If an owner password is set, document can be opened in privilege mode with no
* restriction if that password is entered
*/
function SetProtection($permissions=array(), $user_pass='', $owner_pass=null)
{
$options = array('print' => 4, 'modify' => 8, 'copy' => 16, 'annot-forms' => 32 );
$protection = 192;
foreach($permissions as $permission)
{
if (!isset($options[$permission]))
$this->Error('Incorrect permission: '.$permission);
$protection += $options[$permission];
}
if ($owner_pass === null)
$owner_pass = uniqid(rand());
$this->encrypted = true;
$this->padding = "\x28\xBF\x4E\x5E\x4E\x75\x8A\x41\x64\x00\x4E\x56\xFF\xFA\x01\x08".
"\x2E\x2E\x00\xB6\xD0\x68\x3E\x80\x2F\x0C\xA9\xFE\x64\x53\x69\x7A";
$this->_generateencryptionkey($user_pass, $owner_pass, $protection);
}
function CustomMultiCellResultOnb($widthBeforeCell=0, $width, $height, $text, $border=0, $align='L', $fill=0)
{
if($widthBeforeCell<>0){
$this->cell($widthBeforeCell);
}
$this->MultiCell($width,$height,$text,$border,$align,$fill);
}
/****************************************************************************
* *
* Private methods *
* *
****************************************************************************/
function _putstream($s)
{
if ($this->encrypted) {
$s = RC4($this->_objectkey($this->n), $s);
}
parent::_putstream($s);
}
function _textstring($s)
{
if ($this->encrypted) {
$s = RC4($this->_objectkey($this->n), $s);
}
return parent::_textstring($s);
}
/**
* Compute key depending on object number where the encrypted data is stored
*/
function _objectkey($n)
{
return substr($this->_md5_16($this->encryption_key.pack('VXxx',$n)),0,10);
}
function _putresources()
{
parent::_putresources();
if ($this->encrypted) {
$this->_newobj();
$this->enc_obj_id = $this->n;
$this->_out('<<');
$this->_putencryption();
$this->_out('>>');
$this->_out('endobj');
}
}
function _putencryption()
{
$this->_out('/Filter /Standard');
$this->_out('/V 1');
$this->_out('/R 2');
$this->_out('/O ('.$this->_escape($this->Ovalue).')');
$this->_out('/U ('.$this->_escape($this->Uvalue).')');
$this->_out('/P '.$this->Pvalue);
}
function _puttrailer()
{
parent::_puttrailer();
if ($this->encrypted) {
$this->_out('/Encrypt '.$this->enc_obj_id.' 0 R');
$this->_out('/ID [()()]');
}
}
/**
* Get MD5 as binary string
*/
function _md5_16($string)
{
return pack('H*',md5($string));
}
/**
* Compute O value
*/
function _Ovalue($user_pass, $owner_pass)
{
$tmp = $this->_md5_16($owner_pass);
$owner_RC4_key = substr($tmp,0,5);
return RC4($owner_RC4_key, $user_pass);
}
/**
* Compute U value
*/
function _Uvalue()
{
return RC4($this->encryption_key, $this->padding);
}
/**
* Compute encryption key
*/
function _generateencryptionkey($user_pass, $owner_pass, $protection)
{
// Pad passwords
$user_pass = substr($user_pass.$this->padding,0,32);
$owner_pass = substr($owner_pass.$this->padding,0,32);
// Compute O value
$this->Ovalue = $this->_Ovalue($user_pass,$owner_pass);
// Compute encyption key
$tmp = $this->_md5_16($user_pass.$this->Ovalue.chr($protection)."\xFF\xFF\xFF");
$this->encryption_key = substr($tmp,0,5);
// Compute U value
$this->Uvalue = $this->_Uvalue();
// Compute P value
$this->Pvalue = -(($protection^255)+1);
}
function WriteTag($w, $h, $txt, $border=0, $align="J", $fill=false, $padding=0)
{
$this->wLine=$w;
$this->hLine=$h;
$this->Text=trim($txt);
$this->Text=preg_replace("/\n|\r|\t/","",$this->Text);
$this->border=$border;
$this->align=$align;
$this->fill=$fill;
$this->Padding=$padding;
$this->Xini=$this->GetX();
$this->href="";
$this->PileStyle=array();
$this->TagHref=array();
$this->LastLine=false;
$this->NextLineBegin=array();
$this->SetSpace();
$this->Padding();
$this->LineLength();
$this->BorderTop();
while($this->Text!="")
{
$this->MakeLine();
$this->PrintLine();
}
$this->BorderBottom();
}
function SetStyle($tag, $family, $style, $size, $color, $indent=-1)
{
$tag=trim($tag);
$this->TagStyle[$tag]['family']=trim($family);
$this->TagStyle[$tag]['style']=trim($style);
$this->TagStyle[$tag]['size']=trim($size);
$this->TagStyle[$tag]['color']=trim($color);
$this->TagStyle[$tag]['indent']=$indent;
}
// Private Functions
function SetSpace() // Minimal space between words
{
$tag=$this->Parser($this->Text);
$this->FindStyle($tag[2],0);
$this->DoStyle(0);
$this->Space=$this->GetStringWidth(" ");
}
function Padding()
{
if(preg_match("/^.+,/",$this->Padding)) {
$tab=explode(",",$this->Padding);
$this->lPadding=$tab[0];
$this->tPadding=$tab[1];
if(isset($tab[2]))
$this->bPadding=$tab[2];
else
$this->bPadding=$this->tPadding;
if(isset($tab[3]))
$this->rPadding=$tab[3];
else
$this->rPadding=$this->lPadding;
}
else
{
$this->lPadding=$this->Padding;
$this->tPadding=$this->Padding;
$this->bPadding=$this->Padding;
$this->rPadding=$this->Padding;
}
if($this->tPadding<$this->LineWidth)
$this->tPadding=$this->LineWidth;
}
function LineLength()
{
if($this->wLine==0)
$this->wLine=$this->w - $this->Xini - $this->rMargin;
$this->wTextLine = $this->wLine - $this->lPadding - $this->rPadding;
}
function BorderTop()
{
$border=0;
if($this->border==1)
$border="TLR";
else if(!is_numeric($this->border)) {
$border = $this->border;
if(empty($this->border)) {
$border = 0;
} else {
$border = '';
$border.=strpos($this->border, 'T') !== false ? 'T' : '';
$border.=strpos($this->border, 'L') !== false ? 'L' : '';
$border.=strpos($this->border, 'R') !== false ? 'R' : '';
}
}
$this->Cell($this->wLine,$this->tPadding,"",$border,0,'C',$this->fill);
$y=$this->GetY()+$this->tPadding;
$this->SetXY($this->Xini,$y);
}
function BorderBottom()
{
$border=0;
if($this->border==1)
$border="BLR";
else if(!is_numeric($this->border)) {
$border = $this->border;
if(empty($this->border)) {
$border = 0;
} else {
$border = '';
$border.=strpos($this->border, 'B') !== false ? 'B' : '';
$border.=strpos($this->border, 'L') !== false ? 'L' : '';
$border.=strpos($this->border, 'R') !== false ? 'R' : '';
}
}
$this->Cell($this->wLine,$this->bPadding,"",$border,0,'C',$this->fill);
}
function DoStyle($tag) // Applies a style
{
$tag=trim($tag);
$this->SetFont($this->TagStyle[$tag]['family'],
$this->TagStyle[$tag]['style'],
$this->TagStyle[$tag]['size']);
$tab=explode(",",$this->TagStyle[$tag]['color']);
if(count($tab)==1)
$this->SetTextColor($tab[0]);
else
$this->SetTextColor($tab[0],$tab[1],$tab[2]);
}
function FindStyle($tag, $ind) // Inheritance from parent elements
{
$tag=trim($tag);
// Family
if($this->TagStyle[$tag]['family']!="")
$family=$this->TagStyle[$tag]['family'];
else
{
foreach($this->PileStyle as $val)
{
$val=trim($val);
if($this->TagStyle[$val]['family']!="") {
$family=$this->TagStyle[$val]['family'];
break;
}
}
}
// Style
$style="";
$style1=strtoupper($this->TagStyle[$tag]['style']);
if($style1!="N")
{
$bold=false;
$italic=false;
$underline=false;
foreach($this->PileStyle as $val)
{
$val=trim($val);
$style1=strtoupper($this->TagStyle[$val]['style']);
if($style1=="N")
break;
else
{
if(strpos($style1,"B")!==false)
$bold=true;
if(strpos($style1,"I")!==false)
$italic=true;
if(strpos($style1,"U")!==false)
$underline=true;
}
}
if($bold)
$style.="B";
if($italic)
$style.="I";
if($underline)
$style.="U";
}
// Size
if($this->TagStyle[$tag]['size']!=0)
$size=$this->TagStyle[$tag]['size'];
else
{
foreach($this->PileStyle as $val)
{
$val=trim($val);
if($this->TagStyle[$val]['size']!=0) {
$size=$this->TagStyle[$val]['size'];
break;
}
}
}
// Color
if($this->TagStyle[$tag]['color']!="")
$color=$this->TagStyle[$tag]['color'];
else
{
foreach($this->PileStyle as $val)
{
$val=trim($val);
if($this->TagStyle[$val]['color']!="") {
$color=$this->TagStyle[$val]['color'];
break;
}
}
}
// Result
$this->TagStyle[$ind]['family']=$family;
$this->TagStyle[$ind]['style']=$style;
$this->TagStyle[$ind]['size']=$size;
$this->TagStyle[$ind]['color']=$color;
$this->TagStyle[$ind]['indent']=$this->TagStyle[$tag]['indent'];
}
function Parser($text)
{
$tab=array();
// Closing tag
if(preg_match("|^(</([^>]+)>)|",$text,$regs)) {
$tab[1]="c";
$tab[2]=trim($regs[2]);
}
// Opening tag
else if(preg_match("|^(<([^>]+)>)|",$text,$regs)) {
$regs[2]=preg_replace("/^a/","a ",$regs[2]);
$tab[1]="o";
$tab[2]=trim($regs[2]);
// Presence of attributes
if(preg_match("/(.+) (.+)='(.+)'/",$regs[2])) {
$tab1=preg_split("/ +/",$regs[2]);
$tab[2]=trim($tab1[0]);
foreach($tab1 as $i=>$couple)
{
if($i>0) {
$tab2=explode("=",$couple);
$tab2[0]=trim($tab2[0]);
$tab2[1]=trim($tab2[1]);
$end=strlen($tab2[1])-2;
$tab[$tab2[0]]=substr($tab2[1],1,$end);
}
}
}
}
// Space
else if(preg_match("/^( )/",$text,$regs)) {
$tab[1]="s";
$tab[2]=' ';
}
// Text
else if(preg_match("/^([^< ]+)/",$text,$regs)) {
$tab[1]="t";
$tab[2]=trim($regs[1]);
}
$begin=strlen($regs[1]);
$end=strlen($text);
$text=substr($text, $begin, $end);
$tab[0]=$text;
return $tab;
}
function MakeLine()
{
$this->Text.=" ";
$this->LineLength=array();
$this->TagHref=array();
$Length=0;
$this->nbSpace=0;
$i=$this->BeginLine();
$this->TagName=array();
if($i==0) {
$Length=$this->StringLength[0];
$this->TagName[0]=1;
$this->TagHref[0]=$this->href;
}
while($Length<$this->wTextLine)
{
$tab=$this->Parser($this->Text);
$this->Text=$tab[0];
if($this->Text=="") {
$this->LastLine=true;
break;
}
if($tab[1]=="o") {
array_unshift($this->PileStyle,$tab[2]);
$this->FindStyle($this->PileStyle[0],$i+1);
$this->DoStyle($i+1);
$this->TagName[$i+1]=1;
if($this->TagStyle[$tab[2]]['indent']!=-1) {
$Length+=$this->TagStyle[$tab[2]]['indent'];
$this->Indent=$this->TagStyle[$tab[2]]['indent'];
}
if($tab[2]=="a")
$this->href=$tab['href'];
}
if($tab[1]=="c") {
array_shift($this->PileStyle);
if(isset($this->PileStyle[0]))
{
$this->FindStyle($this->PileStyle[0],$i+1);
$this->DoStyle($i+1);
}
$this->TagName[$i+1]=1;
if($this->TagStyle[$tab[2]]['indent']!=-1) {
$this->LastLine=true;
$this->Text=trim($this->Text);
break;
}
if($tab[2]=="a")
$this->href="";
}
if($tab[1]=="s") {
$i++;
$Length+=$this->Space;
$this->Line2Print[$i]="";
if($this->href!="")
$this->TagHref[$i]=$this->href;
}
if($tab[1]=="t") {
$i++;
$this->StringLength[$i]=$this->GetStringWidth($tab[2]);
$Length+=$this->StringLength[$i];
$this->LineLength[$i]=$Length;
$this->Line2Print[$i]=$tab[2];
if($this->href!="")
$this->TagHref[$i]=$this->href;
}
}
trim($this->Text);
if($Length>$this->wTextLine || $this->LastLine==true)
$this->EndLine();
}
function BeginLine()
{
$this->Line2Print=array();
$this->StringLength=array();
if(isset($this->PileStyle[0]))
{
$this->FindStyle($this->PileStyle[0],0);
$this->DoStyle(0);
}
if(count($this->NextLineBegin)>0) {
$this->Line2Print[0]=$this->NextLineBegin['text'];
$this->StringLength[0]=$this->NextLineBegin['length'];
$this->NextLineBegin=array();
$i=0;
}
else {
preg_match("/^(( *(<([^>]+)>)* *)*)(.*)/",$this->Text,$regs);
$regs[1]=str_replace(" ", "", $regs[1]);
$this->Text=$regs[1].$regs[5];
$i=-1;
}
return $i;
}
function EndLine()
{
if(end($this->Line2Print)!="" && $this->LastLine==false) {
$this->NextLineBegin['text']=array_pop($this->Line2Print);
$this->NextLineBegin['length']=end($this->StringLength);
array_pop($this->LineLength);
}
while(end($this->Line2Print)==="")
array_pop($this->Line2Print);
$this->Delta=$this->wTextLine-end($this->LineLength);
$this->nbSpace=0;
for($i=0; $i<count($this->Line2Print); $i++) {
if($this->Line2Print[$i]=="")
$this->nbSpace++;
}
}
function PrintLine()
{
$border=0;
if($this->border==1)
$border="LR";
else if(!is_numeric($this->border)) {
$border = $this->border;
if(empty($this->border)) {
$border = 0;
} else {
$border = '';
$border.=strpos($this->border, 'L') !== false ? 'L' : '';
$border.=strpos($this->border, 'R') !== false ? 'R' : '';
}
}
$this->Cell($this->wLine,$this->hLine,"",$border,0,'C',$this->fill);
$y=$this->GetY();
$this->SetXY($this->Xini+$this->lPadding,$y);
if($this->Indent!=-1) {
if($this->Indent!=0)
$this->Cell($this->Indent,$this->hLine);
$this->Indent=-1;
}
$space=$this->LineAlign();
$this->DoStyle(0);
for($i=0; $i<count($this->Line2Print); $i++)
{
if(isset($this->TagName[$i]))
$this->DoStyle($i);
if(isset($this->TagHref[$i]))
$href=$this->TagHref[$i];
else
$href='';
if($this->Line2Print[$i]=="")
$this->Cell($space,$this->hLine," ",0,0,'C',false,$href);
else
$this->Cell($this->StringLength[$i],$this->hLine,$this->Line2Print[$i],0,0,'C',false,$href);
}
$this->LineBreak();
if($this->LastLine && $this->Text!="")
$this->EndParagraph();
$this->LastLine=false;
}
function LineAlign()
{
$space=$this->Space;
if($this->align=="J") {
if($this->nbSpace!=0)
$space=$this->Space + ($this->Delta/$this->nbSpace);
if($this->LastLine)
$space=$this->Space;
}
if($this->align=="R")
$this->Cell($this->Delta,$this->hLine);
if($this->align=="C")
$this->Cell($this->Delta/2,$this->hLine);
return $space;
}
function LineBreak()
{
$x=$this->Xini;
$y=$this->GetY()+$this->hLine;
$this->SetXY($x,$y);
}
function EndParagraph()
{
$border=0;
if($this->border==1)
$border="LR";
$this->Cell($this->wLine,$this->hLine/2,"",$border,0,'C',$this->fill);
$x=$this->Xini;
$y=$this->GetY()+$this->hLine/2;
$this->SetXY($x,$y);
}
//Cell with horizontal scaling if text is too wide
function CellFit($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='', $scale=false, $force=true)
{
//Get string width
$str_width=$this->GetStringWidth($txt);
//Calculate ratio to fit cell
if($w==0)
$w = $this->w-$this->rMargin-$this->x;
$ratio = ($w-$this->cMargin*2)/$str_width;
$fit = ($ratio < 1 || ($ratio > 1 && $force));
if ($fit)
{
if ($scale)
{
//Calculate horizontal scaling
$horiz_scale=$ratio*100.0;
//Set horizontal scaling
$this->_out(sprintf('BT %.2F Tz ET',$horiz_scale));
}
else
{
//Calculate character spacing in points
$char_space=($w-$this->cMargin*2-$str_width)/max(strlen($txt)-1,1)*$this->k;
//Set character spacing
$this->_out(sprintf('BT %.2F Tc ET',$char_space));
}
//Override user alignment (since text will fill up cell)
$align='';
}
//Pass on to Cell method
$this->Cell($w,$h,$txt,$border,$ln,$align,$fill,$link);
//Reset character spacing/horizontal scaling
if ($fit)
$this->_out('BT '.($scale ? '100 Tz' : '0 Tc').' ET');
}
//Cell with character spacing only if necessary
function CellFitSpace($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='')
{
$this->CellFit($w,$h,$txt,$border,$ln,$align,$fill,$link,false,false);
}
public function RowForDownloadAttendance($data,$border=0,$fill=0,$draw=0)
{
//Calculate the height of the row
$nb=0;
for($i=0;$i<count($data);$i++){
$nb=max($nb,$this->NbLines($this->widths[$i],$data[$i]));
}
$h=4*$nb;
//Issue a page break first if needed
$this->CheckPageBreak($h);
//Draw the cells of the row
for($i=0;$i<count($data);$i++)
{
$w=$this->widths[$i];
$nb1=$this->NbLines($this->widths[$i],$data[$i]);
$a=isset($this->aligns[$i]) ? $this->aligns[$i] : 'L';
//Save the current position
$x=$this->GetX();
$y=$this->GetY();
//Draw the border
$this->Rect($x,$y,$w,$h,$draw);
$this->SetTextColor(0, 0, 0);
$tempNote = explode(' ',$data[$i]);
if($data[$i]=='Missing'|| $data[$i]=='Missing Finger In' || $data[$i]=='AWN' || $data[$i]=='Late In' || $data[$i]=='time in not in range shift !!' || $data[$i]=='Missing Finger Out' || $data[$i]=='Early Out' || $data[$i]=='Late In Early Out' || $tempNote[0]=='Undisciplined'){
// $this->SetTextColor(81, 156, 132);
$this->SetTextColor(255, 48, 33);
}
if($i==3&& $data[9]=='Late In'){
$this->SetTextColor(255, 48, 33);
}
if($i==6&& $data[9]=='Early Out'){
$this->SetTextColor(255, 48, 33);
}
if(($i==3||$i==6)&& $data[9]=='Late In Early Out'){
$this->SetTextColor(255, 48, 33);
}
//Print the text
$this->MultiCell($w,($h/$nb1),$data[$i],$border,$a,$fill);
//Put the position to the right of the cell
$this->SetXY($x+$w,$y);
}
//Go to the next line
$this->Ln($h);
}
function drawTextBox($strText, $w, $h, $align='L', $valign='T', $border=true, $withLine = false) {
$xi=$this->GetX();
$yi=$this->GetY();
$hrow=$this->FontSize;
$textrows=$this->drawRows($w,$hrow,$strText,0,$align,0,0,0);
$maxrows=floor($h/$this->FontSize);
$rows=min($textrows,$maxrows);
$dy=0;
if (strtoupper($valign)=='M')
$dy=($h-$rows*$this->FontSize)/2;
if (strtoupper($valign)=='B')
$dy=$h-$rows*$this->FontSize;
$this->SetY($yi+$dy);
$this->SetX($xi);
$this->drawRows($w,$hrow,$strText,0,$align,false,$rows,1);
if ($border)
$this->Rect($xi,$yi,$w,$h);
}
function drawRows($w, $h, $txt, $border=0, $align='J', $fill=false, $maxline=0, $prn=0)
{
if(!isset($this->CurrentFont))
$this->Error('No font has been set');
$cw=$this->CurrentFont['cw'];
if($w==0)
$w=$this->w-$this->rMargin-$this->x;
$wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
$s=str_replace("\r",'',(string)$txt);
$nb=strlen($s);
if($nb>0 && $s[$nb-1]=="\n")
$nb--;
$b=0;
if($border)
{
if($border==1)
{
$border='LTRB';
$b='LRT';
$b2='LR';
}
else
{
$b2='';
if(is_int(strpos($border,'L')))
$b2.='L';
if(is_int(strpos($border,'R')))
$b2.='R';
$b=is_int(strpos($border,'T')) ? $b2.'T' : $b2;
}
}
$sep=-1;
$i=0;
$j=0;
$l=0;
$ns=0;
$nl=1;
while($i<$nb)
{
//Get next character
$c=$s[$i];
if($c=="\n")
{
//Explicit line break
if($this->ws>0)
{
$this->ws=0;
if ($prn==1) $this->_out('0 Tw');
}
if ($prn==1) {
$this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill);
}
$i++;
$sep=-1;
$j=$i;
$l=0;
$ns=0;
$nl++;
if($border && $nl==2)
$b=$b2;
if ( $maxline && $nl > $maxline )
return substr($s,$i);
continue;
}
if($c==' ')
{
$sep=$i;
$ls=$l;
$ns++;
}
$l+=$cw[$c];
if($l>$wmax)
{
//Automatic line break
if($sep==-1)
{
if($i==$j)
$i++;
if($this->ws>0)
{
$this->ws=0;
if ($prn==1) $this->_out('0 Tw');
}
if ($prn==1) {
$this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill);
}
}
else
{
if($align=='J')
{
$this->ws=($ns>1) ? ($wmax-$ls)/1000*$this->FontSize/($ns-1) : 0;
if ($prn==1) $this->_out(sprintf('%.3F Tw',$this->ws*$this->k));
}
if ($prn==1){
$this->Cell($w,$h,substr($s,$j,$sep-$j),$b,2,$align,$fill);
}
$i=$sep+1;
}
$sep=-1;
$j=$i;
$l=0;
$ns=0;
$nl++;
if($border && $nl==2)
$b=$b2;
if ( $maxline && $nl > $maxline )
return substr($s,$i);
}
else
$i++;
}
//Last chunk
if($this->ws>0)
{
$this->ws=0;
if ($prn==1) $this->_out('0 Tw');
}
if($border && is_int(strpos($border,'B')))
$b.='B';
if ($prn==1) {
$this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill);
}
$this->x=$this->lMargin;
return $nl;
}
}
// if(function_exists('mcrypt_encrypt'))
// {
// function RC4($key, $data)
// {
// return mcrypt_encrypt(MCRYPT_ARCFOUR, $key, $data, MCRYPT_MODE_STREAM, '');
// }
// }
// else
// {
function RC4($key, $data)
{
static $last_key, $last_state;
if($key != $last_key)
{
$k = str_repeat($key, 256/strlen($key)+1);
$state = range(0, 255);
$j = 0;
for ($i=0; $i<256; $i++){
$t = $state[$i];
$j = ($j + $t + ord($k[$i])) % 256;
$state[$i] = $state[$j];
$state[$j] = $t;
}
$last_key = $key;
$last_state = $state;
}
else
$state = $last_state;
$len = strlen($data);
$a = 0;
$b = 0;
$out = '';
for ($i=0; $i<$len; $i++){
$a = ($a+1) % 256;
$t = $state[$a];
$b = ($b+$t) % 256;
$state[$a] = $state[$b];
$state[$b] = $t;
$k = $state[($state[$a]+$state[$b]) % 256];
$out .= chr(ord($data[$i]) ^ $k);
}
return $out;
}
// }