<?php
namespace Jackbooted\Util;
/**
* @copyright Confidential and copyright (c) 2016 Jackbooted Software. All rights reserved.
*
* Written by Brett Dutton of Jackbooted Software
* brett at brettdutton dot com
*
* This software is written and distributed under the GNU General Public
* License which means that its source code is freely-distributed and
* available to the general public.
*/
class PDFUtil extends FPDF {
private $pageNumber = 1;
private $fontHeight = 10;
public function __construct ( $orientation='L', $unit='mm', $format='A4' ) {
parent::__construct( $orientation, $unit, $format );
}
public function Header ( $border=0 ) {
if ( $this->pageNumber == 1 ) {
$this->SetXY( $this->lMargin, $this->tMargin );
//$this->Image( './pic5.jpg');
}
if ( ( $border & 1 ) != 0 ) {
// Horizontal
$this->Line ( $this->lMargin, $this->tMargin, $this->w - $this->rMargin, $this->tMargin );
$this->Line ( $this->lMargin, $this->h - $this->bMargin, $this->w - $this->rMargin, $this->h - $this->bMargin );
}
if ( ( $border & 2 ) != 0 ) {
// Vertical
$this->Line ( $this->lMargin, $this->tMargin, $this->lMargin, $this->h - $this->bMargin );
$this->Line ( $this->w - $this->rMargin, $this->tMargin, $this->w - $this->rMargin, $this->h - $this->bMargin );
}
}
public function Footer ( ) {
$oldFontSize = $this->FontSizePt;
$this->SetFont( 'Arial', 'I', 8 );
$this->SetY( $this->h - $this->bMargin + ( $this->FontSize / 2 ) + 1 );
$this->Cell( 0, 0, "Page: $this->pageNumber/{nb} ", 0, 0, 'R' );
$this->SetFont( 'Arial', '', $oldFontSize );
$this->pageNumber ++;
}
public function resetLocation () {
$this->SetXY ( $this->lMargin, $this->tMargin );
}
public function cross ( $crossSize = 2 ) {
$this->Line ( $this->GetX() - $crossSize, $this->GetY() - $crossSize, $this->GetX() + $crossSize, $this->GetY() + $crossSize );
$this->Line ( $this->GetX() + $crossSize, $this->GetY() - $crossSize, $this->GetX() - $crossSize, $this->GetY() + $crossSize );
}
public function displayRow ( $arr ) {
$cellHeight = $this->FontSize + 1;
if ( is_array ( $arr ) ) {
foreach ( $arr as $key => $value ) {
$this->Cell( 0, $cellHeight, $key . ': ' . $value );
$this->Ln ();
}
$this->Ln ();
}
}
public function h3 ( $msg ) {
$cellHeight = $this->FontSize + 1;
$oldFontSize = $this->FontSizePt;
$this->SetFont ( 'Arial', 'B', 13 );
$this->Cell ( 0, $cellHeight, $msg );
$this->Ln ();
$this->SetFont ( 'Arial', '', $oldFontSize );
}
public function h4 ( $msg ) {
$cellHeight = $this->FontSize + 1;
$oldFontSize = $this->FontSizePt;
$this->SetFont ( 'Arial', 'B', 12 );
$this->Cell ( 0, $cellHeight, $msg );
$this->Ln ();
$this->SetFont ( 'Arial', '', $oldFontSize );
}
public function th ( $msg, $cellWidth ) {
$oldFontSize = $this->FontSizePt;
$this->SetFont ( 'Arial', 'B', $this->fontHeight );
$cellHeight = $this->FontSize + 1;
$this->Cell ( $cellWidth, $cellHeight, $msg, 0, 0, 'C' );
$this->Ln ();
$this->SetFont ( 'Arial', '', $oldFontSize );
}
public function td ( $msg, $cellWidth ) {
$x = $this->GetX();
$cellHeight = $this->FontSize + 1;
$line = '';
foreach ( explode( ' ', $msg ) as $idx => $word ) {
if ( $idx == 0 ) {
$line = $word;
}
else if ( $this->GetStringWidth ( $line ) + $this->GetStringWidth ( ' ' . $word ) + 2 > $cellWidth ) {
$this->Cell ( $cellWidth, $cellHeight, $line );
$this->Ln ();
$this->SetX ( $x );
$line = $word;
}
else {
$line .= ' ' . $word;
}
}
$this->Cell ( $cellWidth, $cellHeight, $line );
$this->Ln ();
}
public function drawTable ( $tab, $widthList=null, $border=3, $x=0, $y=0, $totalWidth='100%' ) {
// If this is just one row then convert to 2D array
if ( ! isset ( $tab[0] ) || ! is_array ( $tab[0] ) ) {
$tab = [ $tab ];
}
$rowCount = count ( $tab );
$colCount = count ( $tab[0] );
$colNames = array_keys( $tab[0] );
if ( $x != 0 ) $this->SetX ( $x );
if ( $y != 0 ) $this->SetY ( $y );
$topY = $this->GetY ();
$rMargin = $this->w - $this->rMargin;
$oneHundredPercent = $rMargin - $this->GetX ();
if ( is_string( $totalWidth ) ) {
$totalWidth = $oneHundredPercent * $this->percentToDecimal ( $totalWidth );
}
else if ( $totalWidth > $oneHundredPercent ) {
$totalWidth = $oneHundredPercent;
}
if ( $widthList == null ) {
$widthList = array_fill( 0, $colCount, ( 100.0 / $colCount ) . '%' );
}
// Calculate the tab stops
$tabStops = [ $this->GetX () ];
foreach ( $widthList as $idx => $w ) {
if ( is_string( $w ) ) {
$tabStops[] = $tabStops[$idx] + $oneHundredPercent * $this->percentToDecimal ( $w );
}
else {
$tabStops[] = $tabStops[$idx] + $w;
}
}
$y = $topY = $this->GetY ();
if ( ( $border & 1 ) != 0 ) {
// Line at top of table
$this->Line( $tabStops[0], $topY, end( $tabStops ), $topY );
}
for ( $col=0; $col<$colCount; $col++ ) {
$this->SetXY ( $tabStops[$col], $y );
$colWidth = $tabStops[$col+1] - $tabStops[$col];
$this->th ( $colNames[$col], $colWidth );
}
if ( ( $border & 1 ) != 0 ) {
// Line at bottom of headers
$this->Line( $tabStops[0], $this->GetY (), end( $tabStops ), $this->GetY () );
}
if ( ( $border & 2 ) != 0 ) {
foreach ( $tabStops as $tabS ) {
$this->Line( $tabS, $topY, $tabS, $this->GetY () );
}
}
$nextRow = $this->GetY ();
for ( $row=0; $row<$rowCount; $row++ ) {
$y = $nextRow;
$rowSize = 0;
for ( $col=0; $col<$colCount; $col++ ) {
$cellHt = $this->cellHeight ( $tab[$row][$colNames[$col]], $colWidth );
if ( $cellHt > $rowSize ) {
$rowSize = $cellHt;
}
}
if ( $y + $rowSize > ( $this->h - $this->bMargin ) ) {
$this->AddPage ();
$nextRow = $y = $this->GetY ();
if ( ( $border & 1 ) != 0 ) {
$this->Line( $tabStops[0], $y, end( $tabStops ), $y );
}
}
for ( $col=0; $col<$colCount; $col++ ) {
$this->SetXY ( $tabStops[$col], $y );
$colWidth = $tabStops[$col+1] - $tabStops[$col];
$this->td ( $tab[$row][$colNames[$col]], $colWidth );
if ( $nextRow < $this->GetY () ) $nextRow = $this->GetY ();
}
if ( ( $border & 1 ) != 0 ) {
$this->Line( $tabStops[0], $nextRow, end( $tabStops ), $nextRow );
}
if ( ( $border & 2 ) != 0 ) {
foreach ( $tabStops as $tabS ) {
$this->Line( $tabS, $y, $tabS, $nextRow );
}
}
}
$this->SetXY ( $tabStops[0], $nextRow );
}
private function percentToDecimal ( $perc ) {
return floatval ( trim ( str_replace('%', '', $perc ) ) ) / 100.0;
}
private function cellHeight ( $msg, $cellWidth ) {
$cellHt = 0;
$line = '';
foreach ( explode( ' ', $msg ) as $idx => $word ) {
if ( $idx == 0 ) {
$line = $word;
}
else if ( $this->GetStringWidth ( $line ) + $this->GetStringWidth ( ' ' . $word ) + 2 > $cellWidth ) {
$cellHt += $this->lasth;
$line = $word;
}
else {
$line .= ' ' . $word;
}
}
$cellHt += $this->lasth;
return $cellHt;
}
}
|