- Move the start/end table logic into functions

- If a multi-line table row spills off the bottom of the page, start a new page
				/
  and then print that row.
This commit is contained in:
dave 2008-01-26 20:41:33 +00:00
parent 8980275627
commit 8b38f44501

225
lpdf.php
View File

@ -568,46 +568,23 @@ class lpdf
} }
function addTable($table,$align="center") function addTableStart(&$table, $xpos_of_table, $table_width)
{ {
//if we get a table passed in that doesnt look like a table (not an array) then just return doing nothing if(is_array($table['header'])) {
if(!is_array($table)) return;
if(is_array($table['header']))
{
$table_cols=count($table['header']); $table_cols=count($table['header']);
$height['tableheader']=0.2; $height_header=0.2;
} } else {
else
{
$table_cols=count($table['data']); $table_cols=count($table['data']);
$height['tableheader']=0; $height_header=0;
} }
$height['tabledata']=0.18;
$this->yloc-=$height['tableheader']; $this->yloc-=$height_header;
$top_of_table=$this->yloc; $top_of_table=$this->yloc;
$table_width=array_sum($table['widths']); //draw the top line of the table (above the table header)
$table_padding=0.03; pdf_moveto($this->pdf,$this->loc($xpos_of_table),$this->loc($this->yloc+$height_header));
pdf_lineto($this->pdf,$this->loc($xpos_of_table+$table_width),$this->loc($this->yloc+$height_header));
pdf_stroke($this->pdf);
$allow_multiline = false;
if(is_array($table['option'])) {
$allow_multiline = ($table['option']['allow_multiline'] == true) ? true : false;
}
switch($align)
{
case "center"; $xpos_of_table=($this->page_width-$table_width)/2; break;
case "left"; $xpos_of_table=$this->page_margin; break;
case "right"; $xpos_of_table=$this->page_width-$this->page_margin-$table_width; break;
}
//draw the top line of the table (above the table header)
pdf_moveto($this->pdf,$this->loc($xpos_of_table),$this->loc($this->yloc+$height['tableheader']));
pdf_lineto($this->pdf,$this->loc($xpos_of_table+$table_width),$this->loc($this->yloc+$height['tableheader']));
pdf_stroke($this->pdf);
//do the header first //do the header first
if(is_array($table['header'])) if(is_array($table['header']))
@ -625,34 +602,98 @@ class lpdf
$head=$table['header'][$c]; $head=$table['header'][$c];
$width=$table['widths'][$c]; $width=$table['widths'][$c];
pdf_show_boxed($this->pdf,$head,$this->loc($xpos),$this->loc($this->yloc),$this->loc($width),$this->loc($height['tableheader']),"center",null); pdf_show_boxed($this->pdf,$head,$this->loc($xpos),$this->loc($this->yloc),$this->loc($width),$this->loc($height_header),"center",null);
$xpos+=$width; $xpos+=$width;
} }
pdf_setfont($this->pdf,$this->normalfont,10);
} }
return $top_of_table;
}
function addTableEnd(&$table, $xpos_of_table, $top_of_table)
{
if(is_array($table['header'])) {
$table_cols=count($table['header']);
$height_header=0.2;
} else {
$table_cols=count($table['data']);
$height_header=0;
}
//now draw all the vertical lines
$xpos=$xpos_of_table;
for($c=0;$c<$table_cols;$c++)
{
$width=$table['widths'][$c];
//draw the line below the table data)
pdf_moveto($this->pdf,$this->loc($xpos),$this->loc($top_of_table+$height_header));
pdf_lineto($this->pdf,$this->loc($xpos),$this->loc($this->yloc));
pdf_stroke($this->pdf);
$xpos+=$width;
}
//and the final line on the right side of the table:
pdf_moveto($this->pdf,$this->loc($xpos),$this->loc($top_of_table+$height_header));
pdf_lineto($this->pdf,$this->loc($xpos),$this->loc($this->yloc));
pdf_stroke($this->pdf);
}
function addTable($table,$align="center")
{
//if we get a table passed in that doesnt look like a table (not an array) then just return doing nothing
if(!is_array($table)) return;
if(is_array($table['header'])) {
$table_cols=count($table['header']);
} else {
$table_cols=count($table['data']);
}
$line_height=0.18;
$table_width=array_sum($table['widths']);
$table_padding=0.03;
$allow_multiline = false;
if(is_array($table['option'])) {
$allow_multiline = ($table['option']['allow_multiline'] == true) ? true : false;
}
switch($align)
{
case "center"; $xpos_of_table=($this->page_width-$table_width)/2; break;
case "left"; $xpos_of_table=$this->page_margin; break;
case "right"; $xpos_of_table=$this->page_width-$this->page_margin-$table_width; break;
}
$top_of_table = $this->addTableStart($table, $xpos_of_table, $table_width);
//now do the data in the table //now do the data in the table
if($table['data']) if($table['data'])
{ {
pdf_setfont($this->pdf,$this->normalfont,10); pdf_setfont($this->pdf,$this->normalfont,10);
foreach($table['data'] AS $dataline) foreach($table['data'] AS $dataline)
{ {
$this->yloc-=$height['tabledata']; // $this->yloc-=$line_height;
$xpos=$xpos_of_table; $xpos=$xpos_of_table;
$extralinestomove=0;
/* Fit first */
$col_width = array();
$col_height = 1;
for($c=0;$c<$table_cols;$c++) for($c=0;$c<$table_cols;$c++)
{ {
$width=$table['widths'][$c]; $width=$table['widths'][$c];
$textstr=trim($dataline[$c]); $textstr=trim($dataline[$c]);
$h=1;
$try=0; $try=0;
$h = $col_height;
$last_notfit = 0; $last_notfit = 0;
//echo "allow=$allow_multiline\n";
while(1) { while(1) {
// echo "h=$h, width=$width, text=[$textstr]\n"; // echo "h=$h, width=$width, text=[$textstr]\n";
$notfit=pdf_show_boxed($this->pdf,$textstr, $notfit=pdf_show_boxed($this->pdf,$textstr,
$this->loc($xpos+$table_padding),$this->loc($this->yloc-($h-1)*$height['tabledata']), $this->loc($xpos+$table_padding),$this->loc($this->yloc-($h)*$line_height),
$this->loc($width-2*$table_padding),$this->loc($height['tabledata']*$h), $this->loc($width-2*$table_padding),$this->loc($line_height*$h),
$table['dataalign'][$c],'blind'); $table['dataalign'][$c],'blind');
// echo " nofit=$notfit\n"; // echo " nofit=$notfit\n";
@ -685,28 +726,45 @@ class lpdf
/* Increase the height and try again */ /* Increase the height and try again */
$h++; $h++;
} }
$col_width[$c] = $width;
if($h > $col_height) $col_height = $h;
}
/* If this entry goes off the bottom of the
* page, start a new page, and then blindly
* dump this entry on it (but try to squeeze on
* as much as possible) */
if($this->yloc - ($line_height * $col_height) < 0.75)
{
$this->addTableEnd($table, $xpos_of_table, $top_of_table);
$this->newPage($this->page_width,$this->page_height);
$top_of_table = $this->addTableStart($table, $xpos_of_table, $table_width);
}
/* Do it for real */
for($c=0;$c<$table_cols;$c++)
{
$width = $col_width[$c];
$h = $col_height * $line_height;
$textstr=trim($dataline[$c]);
/* Do it for real */
pdf_show_boxed($this->pdf,$textstr, pdf_show_boxed($this->pdf,$textstr,
$this->loc($xpos+$table_padding),$this->loc($this->yloc-($h-1)*$height['tabledata']), $this->loc($xpos+$table_padding),$this->loc($this->yloc-$h),
$this->loc($width-2*$table_padding),$this->loc($height['tabledata']*$h), $this->loc($width-2*$table_padding),$this->loc($h),
$table['dataalign'][$c],null); $table['dataalign'][$c],null);
if($h-1>$extralinestomove) $extralinestomove=$h-1;
//put a little "..." at the end of the field //put a little "..." at the end of the field
if($notfit) if($notfit)
{ {
pdf_setfont($this->pdf,$this->normalfont,8); pdf_setfont($this->pdf,$this->normalfont,8);
pdf_show_boxed($this->pdf,"...",$this->loc($xpos+$width-0.10),$this->loc($this->yloc-0.05),$this->loc(0.10),$this->loc($height['tabledata']),$table['dataalign'][$c],null); pdf_show_boxed($this->pdf,"...",$this->loc($xpos+$width-0.10),$this->loc($this->yloc-0.05),$this->loc(0.10),$this->loc($line_height),$table['dataalign'][$c],null);
pdf_setfont($this->pdf,$this->normalfont,10); pdf_setfont($this->pdf,$this->normalfont,10);
} }
$xpos+=$width; $xpos+=$width;
} }
$this->yloc -= $height['tabledata']*$extralinestomove; $this->yloc -= $line_height*$col_height;
//draw the line below the table data) //draw the line below the table data)
pdf_moveto($this->pdf,$this->loc($xpos_of_table),$this->loc($this->yloc)); pdf_moveto($this->pdf,$this->loc($xpos_of_table),$this->loc($this->yloc));
@ -715,76 +773,15 @@ class lpdf
if($this->yloc<1.1) if($this->yloc<1.1)
{ {
//now draw all the vertical lines $this->addTableEnd($table, $xpos_of_table, $top_of_table);
$xpos=$xpos_of_table;
for($c=0;$c<$table_cols;$c++)
{
$width=$table['widths'][$c];
//draw the line below the table data)
pdf_moveto($this->pdf,$this->loc($xpos),$this->loc($top_of_table+$height['tableheader']));
pdf_lineto($this->pdf,$this->loc($xpos),$this->loc($this->yloc));
pdf_stroke($this->pdf);
$xpos+=$width;
}
//and the final line on the right side of the table:
pdf_moveto($this->pdf,$this->loc($xpos),$this->loc($top_of_table+$height['tableheader']));
pdf_lineto($this->pdf,$this->loc($xpos),$this->loc($this->yloc));
pdf_stroke($this->pdf);
$this->newPage($this->page_width,$this->page_height); $this->newPage($this->page_width,$this->page_height);
$top_of_table = $this->addTableStart($table, $xpos_of_table, $table_width);
$this->yloc-=$height['tableheader'];
$top_of_table=$this->yloc;
//draw the top line of the table (above the table header)
pdf_moveto($this->pdf,$this->loc($xpos_of_table),$this->loc($this->yloc+$height['tableheader']));
pdf_lineto($this->pdf,$this->loc($xpos_of_table+$table_width),$this->loc($this->yloc+$height['tableheader']));
pdf_stroke($this->pdf);
//draw the top line of the table (below the table header)
pdf_moveto($this->pdf,$this->loc($xpos_of_table),$this->loc($this->yloc));
pdf_lineto($this->pdf,$this->loc($xpos_of_table+$table_width),$this->loc($this->yloc));
pdf_stroke($this->pdf);
//do the header first
if($table['header'])
{
pdf_setfont($this->pdf,$this->headerfont,12);
$xpos=$xpos_of_table;
for($c=0;$c<$table_cols;$c++)
{
$head=$table['header'][$c];
$width=$table['widths'][$c];
pdf_show_boxed($this->pdf,$head,$this->loc($xpos),$this->loc($this->yloc),$this->loc($width),$this->loc($height['tableheader']),"center",null);
$xpos+=$width;
}
}
pdf_setfont($this->pdf,$this->normalfont,10);
} }
} }
} }
//now draw all the vertical lines /* Finish the table */
$xpos=$xpos_of_table; $this->addTableEnd($table, $xpos_of_table, $top_of_table);
for($c=0;$c<$table_cols;$c++)
{
$width=$table['widths'][$c];
//draw the line below the table data)
pdf_moveto($this->pdf,$this->loc($xpos),$this->loc($top_of_table+$height['tableheader']));
pdf_lineto($this->pdf,$this->loc($xpos),$this->loc($this->yloc));
pdf_stroke($this->pdf);
$xpos+=$width;
}
//and the final line on the right side of the table:
pdf_moveto($this->pdf,$this->loc($xpos),$this->loc($top_of_table+$height['tableheader']));
pdf_lineto($this->pdf,$this->loc($xpos),$this->loc($this->yloc));
pdf_stroke($this->pdf);
// print the total in th etable at the bottom of the table // print the total in th etable at the bottom of the table
if($table['total'] != 0) { if($table['total'] != 0) {