| 
<?phpnamespace 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;
 }
 }
 
 |