Files
aportil/themes/codebase4.0/grid-pdf-php/gridPdfGenerator.php

449 lines
14 KiB
PHP

<?php
class gridPdfGenerator {
public $minOffsetTop = 10;
public $minOffsetBottom = 10;
public $minOffsetLeft = 10;
public $minOffsetRight = 10;
public $headerHeight = 7;
public $rowHeight = 5;
public $minColumnWidth = 13;
public $pageNumberHeight = 10;
public $fontSize = 8;
public $dpi = 96;
public $strip_tags = false;
public $bgColor = 'D1E5FE';
public $lineColor = 'A4BED4';
public $headerTextColor = '000000';
public $scaleOneColor = 'FFFFFF';
public $scaleTwoColor = 'E3EFFF';
public $gridTextColor = '000000';
public $pageTextColor = '000000';
public $footerImgHeight = 50;
public $headerImgHeight = 50;
public $lang = Array('a_meta_charset' => 'UTF-8', 'a_meta_dir' => 'ltr', 'a_meta_language' => 'en', 'w_page' => 'Page');
private $orientation = 'P';
private $columns = Array();
private $rows = Array();
private $summaryWidth;
private $profile;
private $header = false;
private $footer = false;
private $headerFile;
private $footerFile;
private $pageHeader = false;
private $pageFooter = false;
private $coll_options = Array();
private $hiddenCols = Array();
// print grid
public function printGrid($xml) {
$this->headerParse($xml->head);
$this->footerParse($xml->foot);
$this->mainParse($xml);
$this->collectionsParse($xml->coll_options);
$this->rowsParse($xml->row);
$this->printGridPdf();
}
// sets colors according profile
private function setProfile() {
switch ($this->profile) {
case 'color':
$this->bgColor = 'D1E5FE';
$this->lineColor = 'A4BED4';
$this->headerTextColor = '000000';
$this->scaleOneColor = 'FFFFFF';
$this->scaleTwoColor = 'E3EFFF';
$this->gridTextColor = '000000';
$this->pageTextColor = '000000';
break;
case 'gray':
$this->bgColor = 'E3E3E3';
$this->lineColor = 'B8B8B8';
$this->headerTextColor = '000000';
$this->scaleOneColor = 'FFFFFF';
$this->scaleTwoColor = 'EDEDED';
$this->gridTextColor = '000000';
$this->pageTextColor = '000000';
break;
case 'bw':
$this->bgColor = 'FFFFFF';
$this->lineColor = '000000';
$this->headerTextColor = '000000';
$this->scaleOneColor = 'FFFFFF';
$this->scaleTwoColor = 'FFFFFF';
$this->gridTextColor = '000000';
$this->pageTextColor = '000000';
break;
}
}
// parses main settings
private function mainParse($xml) {
$this->profile = (string) $xml->attributes()->profile;
if ($xml->attributes()->header) {
$this->header = (string) $xml->attributes()->header;
}
if ($xml->attributes()->footer) {
$this->footer = (string) $xml->attributes()->footer;
}
if ($xml->attributes()->pageheader) {
$this->pageHeader = (string) $xml->attributes()->pageheader;
}
if ($xml->attributes()->pagefooter) {
$this->pageFooter = $xml->attributes()->pagefooter;
}
if (100/count($this->widths) < $this->minColumnWidth) {
$this->orientation = 'L';
}
if ($xml->attributes()->orientation) {
if ($xml->attributes()->orientation == 'landscape') {
$this->orientation = 'L';
} else {
$this->orientation = 'P';
}
}
$this->setProfile();
}
// parses grid header
private function headerParse($header) {
if (isset($header->column)) {
$columnsRows = Array($header->column);
} else {
$columnsRows = $header->columns;
}
$i = 0;
foreach ($columnsRows as $columns) {
$summaryWidth = 0;
$k = 0;
foreach ($columns as $column) {
$columnArr = Array();
$columnArr['hidden'] = ($column->attributes()->hidden == 'true') ? true : false;
if ($columnArr['hidden'] == true) {
$this->hiddenCols[$k] = true;
$k++;
continue;
}
if ($this->strip_tags == true) {
$columnArr['text'] = strip_tags(trim((string) $column));
} else {
$columnArr['text'] = trim((string) $column);
}
$columnArr['width'] = trim((string) $column->attributes()->width);
$columnArr['type'] = trim((string) $column->attributes()->type);
$columnArr['align'] = trim((string) $column->attributes()->align);
$columnArr['colspan'] = trim((string) $column->attributes()->colspan);
$columnArr['rowspan'] = trim((string) $column->attributes()->rowspan);
$summaryWidth += $columnArr['width'];
$this->columns[$i][] = $columnArr;
if ($i == 0) {
$widths[] = $columnArr['width'];
}
if ($columnArr['colspan'] != '') {
$columnArr['width'] = 0;
}
$k++;
}
$this->columns[$i]['width'] = $summaryWidth;
if ($i == 0) {
$this->summaryWidth = $summaryWidth;
}
$i++;
}
for ($i = 0; $i < count($this->columns); $i++) {
$offset = 0;
for ($j = 0; $j < count($widths); $j++) {
if ($this->columns[$i][$j]['colspan'] != '') {
$w = $widths[$j];
for ($k = 1; $k < $this->columns[$i][$j]['colspan']; $k++) {
$w += $widths[$j + $k];
$this->columns[$i][$j + $k]['width'] = 0;
}
$this->columns[$i][$j]['width'] = $w;
$j += $this->columns[$i][$j]['colspan'] - 1;
} else {
$this->columns[$i][$j]['width'] = $widths[$j];
}
}
}
for ($i = 0; $i < count($this->columns); $i++) {
for ($j = 0; $j < count($widths); $j++) {
if ((isset($this->columns[$i][$j]))&&($this->columns[$i][$j]['rowspan'] != '')&&(!isset($this->columns[$i][$j]['rowspanPos']))) {
for ($k = 1; $k < $this->columns[$i][$j]['rowspan']; $k++) {
$this->columns[$i + $k][$j]['rowspanPos'] = $this->columns[$i][$j]['rowspan'] - $k;
$this->columns[$i + $k][$j]['rowspan'] = $this->columns[$i][$j]['rowspan'];
}
$this->columns[$i][$j]['rowspanPos'] = 'top';
}
}
}
$this->widths = $widths;
}
// parses grid footer
private function footerParse($footer) {
if (isset($footer->columns)) {
$this->footerColumns = Array();
$columnsRows = $footer->columns;
$i = 0;
foreach ($columnsRows as $columns) {
$summaryWidth = 0;
$j = 0;
foreach ($columns as $column) {
$columnArr = Array();
if ($this->strip_tags == true) {
$columnArr['text'] = strip_tags(trim((string) $column));
} else {
$columnArr['text'] = trim((string) $column);
}
$columnArr['width'] = isset($this->columns[0][$j]['width']) ? $this->columns[0][$j]['width'] : 1;
$columnArr['type'] = trim((string) $column->attributes()->type);
$columnArr['align'] = trim((string) $column->attributes()->align);
$columnArr['colspan'] = trim((string) $column->attributes()->colspan);
$columnArr['rowspan'] = trim((string) $column->attributes()->rowspan);
$summaryWidth += $columnArr['width'];
$this->footerColumns[$i][] = $columnArr;
if ($columnArr['colspan'] != '') {
$columnArr['width'] = 0;
}
$j++;
}
$this->footerColumns[$i]['width'] = $summaryWidth;
$i++;
}
for ($i = 0; $i < count($this->footerColumns); $i++) {
$offset = 0;
for ($j = 0; $j < count($this->widths); $j++) {
if ($this->footerColumns[$i][$j]['colspan'] != '') {
$w = $this->widths[$j];
for ($k = 1; $k < $this->footerColumns[$i][$j]['colspan']; $k++) {
$w += $this->widths[$j + $k];
$this->footerColumns[$i][$j + $k]['width'] = 0;
}
$this->footerColumns[$i][$j]['width'] = $w;
$j += $this->footerColumns[$i][$j]['colspan'] - 1;
} else {
$this->footerColumns[$i][$j]['width'] = $this->widths[$j];
}
}
}
for ($i = 0; $i < count($this->footerColumns); $i++) {
for ($j = 0; $j < count($this->widths); $j++) {
if (($this->footerColumns[$i][$j]['rowspan'] != '')&&(!isset($this->footerColumns[$i][$j]['rowspanPos']))) {
for ($k = 1; $k < $this->footerColumns[$i][$j]['rowspan']; $k++) {
$this->footerColumns[$i + $k][$j]['rowspanPos'] = $this->footerColumns[$i][$j]['rowspan'] - $k;
$this->footerColumns[$i + $k][$j]['rowspan'] = $this->footerColumns[$i][$j]['rowspan'];
}
$this->footerColumns[$i][$j]['rowspanPos'] = 'top';
}
}
}
} else {
$this->footerColumns = false;
}
}
private function collectionsParse($coll_options) {
for ($i = 0; $i < count($coll_options); $i++) {
$index = (int) $coll_options[$i]->attributes()->for;
$this->coll_options[$index] = Array();
for ($j = 0; $j < count($coll_options[$i]->item); $j++) {
$item = $coll_options[$i]->item[$j];
$value = (string) $item->attributes()->value;
$label = (string) $item->attributes()->label;
$this->coll_options[$index][$value] = $label;
}
}
}
// parses rows
private function rowsParse($rows) {
$i = 0;
foreach ($rows as $row) {
$rowArr = Array();
$cells = $row->cell;
$k = 0;
foreach ($cells as $cell) {
if (isset($this->hiddenCols[$k])) {
$k++;
continue;
}
$cell_p = Array();
if ($this->strip_tags == true) {
if (isset($this->coll_options[$k][trim((string) $cell)]))
$cell_p['text'] = strip_tags($this->coll_options[$k][trim((string) $cell)]);
else
$cell_p['text'] = strip_tags(trim((string) $cell));
} else {
if (isset($this->coll_options[$k][trim((string) $cell)]))
$cell_p['text'] = $this->coll_options[$k][trim((string) $cell)];
else
$cell_p['text'] = trim((string) $cell);
}
if (isset($cell->attributes()->bgColor)) {
$cell_p['bg'] = (string) $cell->attributes()->bgColor;
} else {
$color = ($i%2 == 0) ? $this->scaleOneColor : $this->scaleTwoColor;
$cell_p['bg'] = $color;
}
if (isset($cell->attributes()->textColor)) {
$cell_p['textColor'] = (string) $cell->attributes()->textColor;
} else {
$cell_p['textColor'] = $this->gridTextColor;
}
$cell_p['bold'] = (isset($cell->attributes()->bold) && $cell->attributes()->bold == 'bold') ? true : false;
$cell_p['italic'] = (isset($cell->attributes()->italic) && $cell->attributes()->italic == 'italic') ? true : false;
$cell_p['align'] = isset($cell->attributes()->align) ? $cell->attributes()->align : false;
$rowArr[] = $cell_p;
$k++;
}
$this->rows[] = $rowArr;
$i++;
}
}
// returns header image name
private function headerImgInit() {
if (file_exists('./header.png')) {
$this->headerFile = './header.png';
return true;
}
$this->header = false;
$this->pageHeader = false;
return false;
}
// returns footer image name
private function footerImgInit() {
if (file_exists('./footer.png')) {
$this->footerFile = './footer.png';
return true;
}
$this->footer = false;
$this->pageFooter = false;
return false;
}
public function printGridPdf() {
if (($this->header)||($this->pageHeader)) {
$this->headerImgInit();
}
if (($this->footer)||($this->pageFooter)) {
$this->footerImgInit();
}
// initials PDF-wrapper
$this->wrapper = new gridPdfWrapper($this->minOffsetTop, $this->minOffsetRight, $this->minOffsetBottom, $this->minOffsetLeft, $this->orientation, $this->fontSize, $this->dpi, $this->lang);
// checking if document will have one page
$pageHeight = $this->wrapper->getPageHeight() - $this->minOffsetTop - $this->minOffsetBottom;
if (($this->header)||($this->pageHeader)) {
$pageHeight -= $this->headerImgHeight;
}
if (($this->footer)||($this->pageFooter)) {
$pageHeight -= $this->footerImgHeight;
}
$numRows = floor(($pageHeight - $this->headerHeight)/$this->rowHeight);
// denies page numbers if dpcument have one page
if ($numRows >= count($this->rows)) {
$this->wrapper->setNoPages();
}
$rows = Array();
$pageNumber = 1;
$startRow = 0;
// circle for printing all pages
while ($startRow < count($this->rows)) {
$numRows = $this->printGridPage($startRow, $pageNumber);
$startRow += $numRows;
if ($numRows == 0) $startRow++;
$pageNumber++;
}
// outputs PDF in browser
$this->wrapper->pdfOut();
}
// prints one page
private function printGridPage($startRow, $pageNumber) {
// adds new page
$this->wrapper->addPage();
// calculates top offset
if ((($this->header)&&($pageNumber == 1))||($this->pageHeader)) {
$offsetTop = $this->headerImgHeight;
} else {
$offsetTop = 0;
}
// calculates bottom offset
if ($this->pageFooter) {
$offsetBottom = $this->footerImgHeight;
} else {
$offsetBottom = 0;
}
// calculates page height without top and bottom offsets
$pageHeight = $this->wrapper->getPageHeight() - $offsetTop - $offsetBottom - $this->minOffsetTop - $this->minOffsetTop;
// calculates rows number on current page
$numRows = floor(($pageHeight - $this->headerHeight*count($this->columns) - $this->headerHeight*count($this->footerColumns))/$this->rowHeight);
// check if it's last page
$lastPage = ((count($this->rows) - $startRow) <= $numRows);
// prints footer if needs
// if (($this->footer)&&($lastPage)) {
// $offsetBottom = $this->footerImgHeight;
// }
$offsetRight = $this->minOffsetRight;
$offsetLeft = $this->minOffsetLeft;
// sets page offsets
$this->wrapper->setPageSize($offsetTop, $offsetRight, $offsetBottom, $offsetLeft);
// prints grid header
$this->wrapper->headerDraw($this->headerHeight, $this->columns, $this->summaryWidth, $this->headerTextColor, $this->bgColor, $this->lineColor);
// prints grid footer
$this->wrapper->footerDraw($this->headerHeight, $this->footerColumns);
// prints grid values
$rowsNum = $this->wrapper->gridDraw($this->rowHeight, $this->rows, $this->widths, $startRow, $numRows, $this->scaleOneColor, $this->scaleTwoColor, $this->profile);
// prints footer if needs
if (($this->pageFooter)||((count($this->rows) <= $startRow + $rowsNum)&&($this->footer))) {
$this->wrapper->drawImgFooter($this->footerFile, $this->footerImgHeight);
}
// prints header if needs
if ((($this->header)&&($pageNumber == 1))||($this->pageHeader)) {
$this->wrapper->drawImgHeader($this->headerFile, $this->headerImgHeight);
}
// returns number of printed rows ;
return $rowsNum;
}
}
?>