> = false - the split is made only if the cell width does not fit into a page height = true - the split of a cell will ocuur whenever necesary */ var $Draw_Header_Command; //command which determines in the DrawData first the header draw var $Data_On_Current_Page; // = true/false ... if on current page was some data written //returns the width of the page in user units function PageWidth(){ return (int) $this->w-$this->rMargin-$this->lMargin; } //constructor(not a real one, but have to call it first) //we initialize all the variables that we use function Table_Init($col_no = 0, $header_draw = true, $border_draw = true){ $this->tb_columns = $col_no; $this->tb_header_type = Array(); $this->tb_header_draw = $header_draw; $this->tb_header_height = 0; $this->tb_border_draw = $border_draw; $this->tb_data_type = Array(); $this->tb_split_normal = true; $this->tb_type = Array(); $this->table_startx = $this->GetX(); $this->table_starty = $this->GetY(); $this->Draw_Header_Command = false; //by default we don't draw the header $this->Data_On_Current_Page = false; } //Sets the number of columns of the table function Set_Table_Columns($nr){ $this->tb_columns = $nr; } //Sets the number of columns of the table function Set_Table_SplitMode($pSplit = true){ $this->tb_split_normal = $pSplit; } /* Characteristics constants for Header Type: EVERY CELL FROM THE TABLE IS A MULTICELL WIDTH - this is the cell width. This value must be sent only to the HEADER!!!!!!!! T_COLOR - text color = array(r,g,b); T_SIZE - text size T_FONT - text font - font type = "Arial", "Times" T_ALIGN - text align - "RLCJ" V_ALIGN - text vertical alignment - "TMB" T_TYPE - text type (Bold Italic etc) LN_SPACE - space between lines BG_COLOR - background color = array(r,g,b); BRD_COLOR - border color = array(r,g,b); BRD_SIZE - border size -- BRD_TYPE - border size -- up down, with border without!!! etc BRD_TYPE_NEW_PAGE - border type on new page - this is user only if specified(<>'') TEXT - header text -- THIS ALSO BELONGS ONLY TO THE HEADER!!!! all these setting conform to the settings from the multicell functions!!!! */ /* Function: Set_Header_Type($type_arr) -- sets the array for the header type type array = array( 0=>array( "WIDTH" => 10, "T_COLOR" => array(120,120,120), "T_SIZE" => 5, ... "TEXT" => "Header text 1" ), 1=>array( ... ), ); where 0,1... are the column number */ function Set_Header_Type($type_arr){ $this->tb_header_type = $type_arr; } /* Characteristics constants for Data Type: EVERY CELL FROM THE TABLE IS A MULTICELL T_COLOR - text color = array(r,g,b); T_SIZE - text size T_FONT - text font - font type = "Arial", "Times" T_ALIGN - text align - "RLCJ" V_ALIGN - text vertical alignment - "TMB" T_TYPE - text type (Bold Italic etc) LN_SPACE - space between lines BG_COLOR - background color = array(r,g,b); BRD_COLOR - border color = array(r,g,b); BRD_SIZE - border size -- BRD_TYPE - border size -- up down, with border without!!! etc BRD_TYPE_NEW_PAGE - border type on new page - this is user only if specified(<>'') all these settings conform to the settings from the multicell functions!!!! */ /* Function: Set_data_Type($type_arr) -- sets the array for the header type type array = array( 0=>array( "T_COLOR" => array(120,120,120), "T_SIZE" => 5, ... "BRD_TYPE" => 1 ), 1=>array( ... ), ); where 0,1... are the column number */ function Set_Data_Type($type_arr){ $this->tb_data_type = $type_arr; } /* Function Set_Table_Type $type_arr = array( "BRD_COLOR"=> array (120,120,120), //border color "BRD_SIZE"=>5), //border line width "TB_COLUMNS"=>5), //the number of columns "TB_ALIGN"=>"L"), //the align of the table, possible values = L, R, C equivalent to Left, Right, Center 'L_MARGIN' => 0// left margin... reference from this->lmargin values ) */ function Set_Table_Type($type_arr){ if (isset($type_arr['TB_COLUMNS'])) $this->tb_columns = $type_arr['TB_COLUMNS']; if (!isset($type_arr['L_MARGIN'])) $type_arr['L_MARGIN']=0;//default values $this->tb_table_type = $type_arr; } //this functiondraws the exterior table border!!!! function Draw_Table_Border(){ /* "BRD_COLOR"=> array (120,120,120), //border color "BRD_SIZE"=>5), //border line width "TB_COLUMNS"=>5), //the number of columns "TB_ALIGN"=>"L"), //the align of the table, possible values = L, R, C equivalent to Left, Right, Center */ if ( ! $this->tb_border_draw ) return; if ( ! $this->Data_On_Current_Page) return; //there was no data on the current page //set the colors list($r, $g, $b) = $this->tb_table_type['BRD_COLOR']; $this->SetDrawColor($r, $g, $b); //set the line width $this->SetLineWidth($this->tb_table_type['BRD_SIZE']); #echo $this->GetY()-$this->table_starty." ";; //draw the border $this->Rect( $this->table_startx, $this->table_starty, $this->Get_Table_Width(), $this->GetY()-$this->table_starty); } function End_Page_Border(){ if (isset($this->tb_table_type['BRD_TYPE_END_PAGE'])){ if (strpos($this->tb_table_type['BRD_TYPE_END_PAGE'], 'B') >= 0){ //set the colors list($r, $g, $b) = $this->tb_table_type['BRD_COLOR']; $this->SetDrawColor($r, $g, $b); //set the line width $this->SetLineWidth($this->tb_table_type['BRD_SIZE']); //draw the line $this->Line($this->table_startx, $this->GetY(), $this->table_startx + $this->Get_Table_Width(), $this->GetY()); } } } //returns the table width in user units function Get_Table_Width() { //calculate the table width $tb_width = 0; for ($i=0; $i < $this->tb_columns; $i++){ $tb_width += $this->tb_header_type[$i]['WIDTH']; } return $tb_width; } //alignes the table to C, L or R(default is L) function Table_Align(){ //check if the table is aligned if (isset($this->tb_table_type['TB_ALIGN'])) $tb_align = $this->tb_table_type['TB_ALIGN']; else $tb_align=''; //set the table align switch($tb_align){ case 'C': $this->SetX($this->lMargin + $this->tb_table_type['L_MARGIN'] + ($this->PageWidth() - $this->Get_Table_Width())/2); break; case 'R': $this->SetX($this->lMargin + $this->tb_table_type['L_MARGIN'] + ($this->PageWidth() - $this->Get_Table_Width())); break; default: $this->SetX($this->lMargin + $this->tb_table_type['L_MARGIN']); break; }//if (isset($this->tb_table_type['TB_ALIGN'])){ } //Draws the Header function Draw_Header(){ $this->Draw_Header_Command = true; $this->tb_header_height = 0; } function Init_Table_Position(){ $this->Table_Align(); $this->table_startx = $this->GetX(); $this->table_starty = $this->GetY(); } /** Draws the header line from a table. Call: @param none @return nothing */ function Draw_Header_(){ $this->tb_header_height = 0; $this->Init_Table_Position(); $this->Draw_Header_Command = false; //if the header will be showed if ( ! $this->tb_header_draw ) return; $this->DrawTableLine($this->tb_header_type, false, 1, $height); $this->Data_On_Current_Page = true; } /** Draws a data line from the table. Call this function after the table initialization, table, header and data types are set Call: @param $data - array containing line informations $header - header will be drawed or not in case of new page @return nothing */ function Draw_Data($data, $header = true, $height){ $this->DrawTableLine($data, $header, 0, $height); } /** Draws a data or header line from the table. Call: @param $data - array containing line informations $header - header will be drawed or not in case of new page $pDataType = 0 - normal line 1 - header line 2 - not implemented $heigt = Zellenhöhe @return nothing */ function DrawTableLine($data, $header, $pDataType = 0, $height){ $h = $height; $hm = 0; $xx = Array(); $tt = Array(); if (!$this->Data_On_Current_Page) $this->Init_Table_Position(); if ($pDataType == 0){//data line if ($this->Draw_Header_Command){//draw the header $this->Draw_Header_(); } } //maximum Height available on this page $AvailPageH = $this->PageBreakTrigger - $this->GetY(); if ($AvailPageH <= 0){ //there is no more space on this page $this->TableAddPage($header);//add a page without header $this->DrawTableLine($data, $header, $pDataType, $height);//recall this function return;//exit this function } $MaxPageH = $this->PageBreakTrigger - $this->tMargin; $split = false; $backdata = $data; //backup data in case of split or recall; //calculate the maximum height of the cells for($i=0; $i < $this->tb_columns; $i++) { if (!isset($data[$i]['TEXT']) || ($data[$i]['TEXT']=='')) $data[$i]['TEXT'] = " "; if (!isset($data[$i]['T_FONT'])) $data[$i]['T_FONT'] = $this->tb_data_type[$i]['T_FONT']; if (!isset($data[$i]['T_TYPE'])) $data[$i]['T_TYPE'] = $this->tb_data_type[$i]['T_TYPE']; if (!isset($data[$i]['T_SIZE'])) $data[$i]['T_SIZE'] = $this->tb_data_type[$i]['T_SIZE']; if (!isset($data[$i]['T_COLOR'])) $data[$i]['T_COLOR'] = $this->tb_data_type[$i]['T_COLOR']; if (!isset($data[$i]['T_ALIGN'])) $data[$i]['T_ALIGN'] = $this->tb_data_type[$i]['T_ALIGN']; if (!isset($data[$i]['V_ALIGN'])) $data[$i]['V_ALIGN'] = $this->tb_data_type[$i]['V_ALIGN']; if (!isset($data[$i]['LN_SIZE'])) $data[$i]['LN_SIZE'] = $this->tb_data_type[$i]['LN_SIZE']; if (!isset($data[$i]['BRD_SIZE'])) $data[$i]['BRD_SIZE'] = $this->tb_data_type[$i]['BRD_SIZE']; if (!isset($data[$i]['BRD_COLOR'])) $data[$i]['BRD_COLOR'] = $this->tb_data_type[$i]['BRD_COLOR']; if (!isset($data[$i]['BRD_TYPE'])) $data[$i]['BRD_TYPE'] = $this->tb_data_type[$i]['BRD_TYPE']; if (!isset($data[$i]['BG_COLOR'])) $data[$i]['BG_COLOR'] = $this->tb_data_type[$i]['BG_COLOR']; $this->SetFont( $data[$i]['T_FONT'], $data[$i]['T_TYPE'], $data[$i]['T_SIZE']); $data[$i]['CELL_WIDTH'] = $this->tb_header_type[$i]['WIDTH']; if (isset($data[$i]['COLSPAN'])){ $colspan = (int) $data[$i]['COLSPAN'];//convert to integer for ($j = 1; $j < $colspan; $j++){ //if there is a colspan, then calculate the number of lines also with the with of the next cell if (($i + $j) < $this->tb_columns) $data[$i]['CELL_WIDTH'] += $this->tb_header_type[$i + $j]['WIDTH']; } } $MaxLines = floor($AvailPageH / $data[$i]['LN_SIZE']);//floor this value, must be the lowest possible if (!isset($data[$i]['TEXT_STRLINES'])) $data[$i]['TEXT_STRLINES'] = $this->StringToLines($data[$i]['CELL_WIDTH'], $data[$i]['TEXT']); $NoLines = count($data[$i]['TEXT_STRLINES']); $hm = max($hm, $data[$i]['LN_SIZE'] * $NoLines);//this would be the normal height if ($NoLines > $MaxLines){ $split = true; $NoLines = $MaxLines; $data[$i]['TEXT_SPLITLINES'] = array_splice($data[$i]['TEXT_STRLINES'], $MaxLines); } $data[$i]['CELL_LINES'] = $NoLines; //this is the maximum cell height $h = max($h, $data[$i]['LN_SIZE'] * $data[$i]['CELL_LINES']); if (isset($data[$i]['COLSPAN'])){ //just skip the other cells $i = $i + $colspan - 1; } } if ($pDataType == 0){//data line if (!$this->tb_split_normal){//split only if the cell height is bigger than a page size if ($split && (($hm + $this->tb_header_height) < $MaxPageH)){//if the header is splitted and it has space on a page $this->TableAddPage($header);//add a page without header $this->DrawTableLine($backdata, $header, 0, $height);//recall this function return; } } } if ($pDataType == 1){//header line $this->tb_header_height = $hm; if ($split && ($hm < $MaxPageH)){//if the header is splitted and it has space on a page //new page $this->TableAddPage(false);//add a page without header $this->DrawTableLine($backdata, $header, 1, $height);//recall this function return; } if ( ((2*$h) > $AvailPageH) && ((2*$h) < $MaxPageH)){ /* if the header double size is bigger then the available size but the double size is smaller than a page size >>> we draw a new page **/ $this->TableAddPage(false);//add a page withot header $this->DrawTableLine($backdata, $header, 1, $height);//recall this function return; } } $this->Table_Align(); //Draw the cells of the row for( $i = 0; $i < $this->tb_columns; $i++ ) { //border size BRD_SIZE $this->SetLineWidth($data[$i]['BRD_SIZE']); //fill color = BG_COLOR list($r, $g, $b) = $data[$i]['BG_COLOR']; $this->SetFillColor($r, $g, $b); //Draw Color = BRD_COLOR list($r, $g, $b) = $data[$i]['BRD_COLOR']; $this->SetDrawColor($r, $g, $b); //Text Color = T_COLOR list($r, $g, $b) = $data[$i]['T_COLOR']; $this->SetTextColor($r, $g, $b); //Set the font, font type and size $this->SetFont( $data[$i]['T_FONT'], $data[$i]['T_TYPE'], $data[$i]['T_SIZE']); //Save the current position $x=$this->GetX(); $y=$this->GetY(); //print the text $this->MultiCellTable( $data[$i]['CELL_WIDTH'], $data[$i]['LN_SIZE'], $data[$i]['TEXT_STRLINES'], $data[$i]['BRD_TYPE'], $data[$i]['T_ALIGN'], $data[$i]['V_ALIGN'], 1, $h - $data[$i]['LN_SIZE'] * $data[$i]['CELL_LINES'] ); //Put the position to the right of the cell $this->SetXY($x + $data[$i]['CELL_WIDTH'],$y); //if we have colspan, just ignore the next cells if (isset($data[$i]['COLSPAN'])){ $i = $i + (int)$data[$i]['COLSPAN'] - 1; } } $this->Data_On_Current_Page = true; //Go to the next line $this->Ln($h); if ($split){ //calculate the maximum height of the cells for($i=0; $i < $this->tb_columns; $i++){ $backdata[$i]['TEXT_STRLINES'] = isset($data[$i]['TEXT_SPLITLINES']) ? $data[$i]['TEXT_SPLITLINES'] : array(); } $this->TableAddPage($header);//we have a page split, add a page if ($pDataType == 1) $header = false; $this->DrawTableLine($backdata, $header, $pDataType, $height); } }//DrawTableLine /** Adds a new page in the pdf document and initializes the table and the header if necessary. Call: @param $header - boolean - if the header is drawed or not @return nothing */ function TableAddPage($header = true){ $this->Draw_Table_Border();//draw the table border $this->End_Page_Border();//if there is a special handling for end page??? this is specific for me $this->AddPage($this->CurOrientation);//add a new page $this->Data_On_Current_Page = false; $this->table_startx = $this->GetX(); $this->table_starty = $this->GetY(); if ($header) $this ->Draw_Header();//if we have to draw the header!!! }//TableAddPage /** This method allows printing text with line breaks. It works like a modified MultiCell Call: @param $w - width $h - line height $txtData - the outputed text $border - border(LRTB 0 or 1) $align - horizontal align 'JLR' $valign - Vertical Alignment - Top, Middle, Bottom $fill - fill (1/0) $vh - vertical adjustment - the Multicell Height will be with this VH Higher!!!! @return nothing */ function MultiCellTable($w, $h, $txtData, $border=0, $align='J', $valign='T', $fill=0, $vh=0) { $b1 = '';//border for top cell $b2 = '';//border for middle cell $b3 = '';//border for bottom cell if($border) { if($border==1) { $border = 'LTRB'; $b1 = 'LRT';//without the bottom $b2 = 'LR';//without the top and bottom $b3 = 'LRB';//without the top } else { $b2=''; if(is_int(strpos($border,'L'))) $b2.='L'; if(is_int(strpos($border,'R'))) $b2.='R'; $b1=is_int(strpos($border,'T')) ? $b2.'T' : $b2; $b3=is_int(strpos($border,'B')) ? $b2.'B' : $b2; } } switch ($valign){ case 'T': $wh_T = 0;//Top width $wh_B = $vh - $wh_T;//Bottom width break; case 'M': $wh_T = $vh/2; $wh_B = $vh/2; break; case 'B': $wh_T = $vh; $wh_B = 0; break; default://default is TOP ALIGN $wh_T = 0;//Top width $wh_B = $vh - $wh_T;//Bottom width } //save the X position $x = $this->x; /* if $wh_T == 0 that means that we have no vertical adjustments so I will skip the cells that draws the top and bottom borders */ if ($wh_T != 0)//only when there is a difference { //draw the top borders!!! $this->Cell($w,$wh_T,'',$b1,2,$align,$fill); } $b2 = is_int(strpos($border,'T')) && ($wh_T == 0) ? $b2.'T' : $b2; $b2 = is_int(strpos($border,'B')) && ($wh_B == 0) ? $b2.'B' : $b2; #$this->MultiCell($w,$h,$txt,$b2,$align,$fill); $this->MultiCellTag($w, $h, $txtData, $b2, $align, 1, false); if ($wh_B != 0){//only when there is a difference //go to the saved X position //a multicell always runs to the begin of line $this->x = $x; $this->Cell($w, $wh_B, '', $b3, 2, $align,$fill); $this->x=$this->lMargin; } } }//end of pdf_table class ?>