📄 class.ezpdf.php
字号:
} else {
$totalPages = $totalPages1;
}
}
foreach ($this->ezPages as $pageNum=>$id){
if (isset($tmp[$pageNum])){
if (is_array($tmp[$pageNum])){
// then this must be starting page numbers
$status=1;
$info = $tmp[$pageNum];
$info['dnum']=$info['num']-$pageNum;
// also check for the special case of the numbering stopping and starting on the same page
if (isset($info['stopn']) || isset($info['stoptn']) ){
$status=2;
}
} else if ($tmp[$pageNum]=='stop' || $tmp[$pageNum]=='stopt'){
// then we are stopping page numbers
$status=0;
} else if ($status==1 && ($tmp[$pageNum]=='stoptn' || $tmp[$pageNum]=='stopn')){
// then we are stopping page numbers
$status=2;
}
}
if ($status){
// then add the page numbering to this page
if (strlen($info['num'])){
$num=$pageNum+$info['dnum'];
} else {
$num=$pageNum;
}
$total = $totalPages+$num-$pageNum;
$pat = str_replace('{PAGENUM}',$num,$info['pattern']);
$pat = str_replace('{TOTALPAGENUM}',$total,$pat);
$this->reopenObject($id);
switch($info['pos']){
case 'right':
$this->addText($info['x'],$info['y'],$info['size'],$pat);
break;
default:
$w=$this->getTextWidth($info['size'],$pat);
$this->addText($info['x']-$w,$info['y'],$info['size'],$pat);
break;
}
$this->closeObject();
}
if ($status==2){
$status=0;
}
}
}
}
}
// ------------------------------------------------------------------------------
function ezPRVTcleanUp(){
$this->ezPRVTaddPageNumbers();
}
// ------------------------------------------------------------------------------
function ezStream($options=''){
$this->ezPRVTcleanUp();
$this->stream($options);
}
// ------------------------------------------------------------------------------
function ezOutput($options=0){
$this->ezPRVTcleanUp();
return $this->output($options);
}
// ------------------------------------------------------------------------------
function ezSetY($y){
// used to change the vertical position of the writing point.
$this->y = $y;
if ( $this->y < $this->ez['bottomMargin']){
// then make a new page
$this->ezNewPage();
}
}
// ------------------------------------------------------------------------------
function ezSetDy($dy,$mod=''){
// used to change the vertical position of the writing point.
// changes up by a positive increment, so enter a negative number to go
// down the page
// if $mod is set to 'makeSpace' and a new page is forced, then the pointed will be moved
// down on the new page, this will allow space to be reserved for graphics etc.
$this->y += $dy;
if ( $this->y < $this->ez['bottomMargin']){
// then make a new page
$this->ezNewPage();
if ($mod=='makeSpace'){
$this->y += $dy;
}
}
}
// ------------------------------------------------------------------------------
function ezPrvtTableDrawLines($pos,$gap,$x0,$x1,$y0,$y1,$y2,$col,$inner,$outer,$opt=1){
$x0=1000;
$x1=0;
$this->setStrokeColor($col[0],$col[1],$col[2]);
$cnt=0;
$n = count($pos);
foreach($pos as $x){
$cnt++;
if ($cnt==1 || $cnt==$n){
$this->setLineStyle($outer);
} else {
$this->setLineStyle($inner);
}
$this->line($x-$gap/2,$y0,$x-$gap/2,$y2);
if ($x>$x1){ $x1=$x; };
if ($x<$x0){ $x0=$x; };
}
$this->setLineStyle($outer);
$this->line($x0-$gap/2-$outer/2,$y0,$x1-$gap/2+$outer/2,$y0);
// only do the second line if it is different to the first, AND each row does not have
// a line on it.
if ($y0!=$y1 && $opt<2){
$this->line($x0-$gap/2,$y1,$x1-$gap/2,$y1);
}
$this->line($x0-$gap/2-$outer/2,$y2,$x1-$gap/2+$outer/2,$y2);
}
// ------------------------------------------------------------------------------
function ezPrvtTableColumnHeadings($cols,$pos,$maxWidth,$height,$decender,$gap,$size,&$y,$optionsAll=array()){
// uses ezText to add the text, and returns the height taken by the largest heading
// this page will move the headings to a new page if they will not fit completely on this one
// transaction support will be used to implement this
if (isset($optionsAll['cols'])){
$options = $optionsAll['cols'];
} else {
$options = array();
}
$mx=0;
$startPage = $this->ezPageCount;
$secondGo=0;
// $y is the position at which the top of the table should start, so the base
// of the first text, is $y-$height-$gap-$decender, but ezText starts by dropping $height
// the return from this function is the total cell height, including gaps, and $y is adjusted
// to be the postion of the bottom line
// begin the transaction
$this->transaction('start');
$ok=0;
// $y-=$gap-$decender;
$y-=$gap;
while ($ok==0){
foreach($cols as $colName=>$colHeading){
$this->ezSetY($y);
if (isset($options[$colName]) && isset($options[$colName]['justification'])){
$justification = $options[$colName]['justification'];
} else {
$justification = 'left';
}
$this->ezText($colHeading,$size,array('aleft'=> $pos[$colName],'aright'=>($maxWidth[$colName]+$pos[$colName]),'justification'=>$justification));
$dy = $y-$this->y;
if ($dy>$mx){
$mx=$dy;
}
}
$y = $y - $mx - $gap + $decender;
// $y -= $mx-$gap+$decender;
// now, if this has moved to a new page, then abort the transaction, move to a new page, and put it there
// do not check on the second time around, to avoid an infinite loop
if ($this->ezPageCount != $startPage && $secondGo==0){
$this->transaction('rewind');
$this->ezNewPage();
$y = $this->y - $gap-$decender;
$ok=0;
$secondGo=1;
// $y = $store_y;
$mx=0;
} else {
$this->transaction('commit');
$ok=1;
}
}
return $mx+$gap*2-$decender;
}
// ------------------------------------------------------------------------------
function ezPrvtGetTextWidth($size,$text){
// will calculate the maximum width, taking into account that the text may be broken
// by line breaks.
$mx=0;
$lines = explode("\n",$text);
foreach ($lines as $line){
$w = $this->getTextWidth($size,$line);
if ($w>$mx){
$mx=$w;
}
}
return $mx;
}
// ------------------------------------------------------------------------------
function ezTable(&$data,$cols='',$title='',$options=''){
// add a table of information to the pdf document
// $data is a two dimensional array
// $cols (optional) is an associative array, the keys are the names of the columns from $data
// to be presented (and in that order), the values are the titles to be given to the columns
// $title (optional) is the title to be put on the top of the table
//
// $options is an associative array which can contain:
// 'showLines'=> 0,1,2, default is 1 (show outside and top lines only), 2=> lines on each row
// 'showHeadings' => 0 or 1
// 'shaded'=> 0,1,2,3 default is 1 (1->alternate lines are shaded, 0->no shading, 2-> both shaded, second uses shadeCol2)
// 'shadeCol' => (r,g,b) array, defining the colour of the shading, default is (0.8,0.8,0.8)
// 'shadeCol2' => (r,g,b) array, defining the colour of the shading of the other blocks, default is (0.7,0.7,0.7)
// 'fontSize' => 10
// 'textCol' => (r,g,b) array, text colour
// 'titleFontSize' => 12
// 'rowGap' => 2 , the space added at the top and bottom of each row, between the text and the lines
// 'colGap' => 5 , the space on the left and right sides of each cell
// 'lineCol' => (r,g,b) array, defining the colour of the lines, default, black.
// 'xPos' => 'left','right','center','centre',or coordinate, reference coordinate in the x-direction
// 'xOrientation' => 'left','right','center','centre', position of the table w.r.t 'xPos'
// 'width'=> <number> which will specify the width of the table, if it turns out to not be this
// wide, then it will stretch the table to fit, if it is wider then each cell will be made
// proportionalty smaller, and the content may have to wrap.
// 'maxWidth'=> <number> similar to 'width', but will only make table smaller than it wants to be
// 'options' => array(<colname>=>array('justification'=>'left','width'=>100,'link'=>linkDataName),<colname>=>....)
// allow the setting of other paramaters for the individual columns
// 'minRowSpace'=> the minimum space between the bottom of each row and the bottom margin, in which a new row will be started
// if it is less, then a new page would be started, default=-100
// 'innerLineThickness'=>1
// 'outerLineThickness'=>1
// 'splitRows'=>0, 0 or 1, whether or not to allow the rows to be split across page boundaries
// 'protectRows'=>number, the number of rows to hold with the heading on page, ie, if there less than this number of
// rows on the page, then move the whole lot onto the next page, default=1
//
// note that the user will have had to make a font selection already or this will not
// produce a valid pdf file.
if (!is_array($data)){
return;
}
if (!is_array($cols)){
// take the columns from the first row of the data set
reset($data);
list($k,$v)=each($data);
if (!is_array($v)){
return;
}
$cols=array();
foreach($v as $k1=>$v1){
$cols[$k1]=$k1;
}
}
if (!is_array($options)){
$options=array();
}
$defaults = array(
'shaded'=>1,'showLines'=>1,'shadeCol'=>array(0.8,0.8,0.8),'shadeCol2'=>array(0.7,0.7,0.7),'fontSize'=>10,'titleFontSize'=>12
,'titleGap'=>5,'lineCol'=>array(0,0,0),'gap'=>5,'xPos'=>'centre','xOrientation'=>'centre'
,'showHeadings'=>1,'textCol'=>array(0,0,0),'width'=>0,'maxWidth'=>0,'cols'=>array(),'minRowSpace'=>-100,'rowGap'=>2,'colGap'=>5
,'innerLineThickness'=>1,'outerLineThickness'=>1,'splitRows'=>0,'protectRows'=>1
);
foreach($defaults as $key=>$value){
if (is_array($value)){
if (!isset($options[$key]) || !is_array($options[$key])){
$options[$key]=$value;
}
} else {
if (!isset($options[$key])){
$options[$key]=$value;
}
}
}
$options['gap']=2*$options['colGap'];
$middle = ($this->ez['pageWidth']-$this->ez['rightMargin'])/2+($this->ez['leftMargin'])/2;
// figure out the maximum widths of the text within each column
$maxWidth=array();
foreach($cols as $colName=>$colHeading){
$maxWidth[$colName]=0;
}
// find the maximum cell widths based on the data
foreach($data as $row){
foreach($cols as $colName=>$colHeading){
$w = $this->ezPrvtGetTextWidth($options['fontSize'],(string)$row[$colName])*1.01;
if ($w > $maxWidth[$colName]){
$maxWidth[$colName]=$w;
}
}
}
// and the maximum widths to fit in the headings
foreach($cols as $colName=>$colTitle){
$w = $this->ezPrvtGetTextWidth($options['fontSize'],(string)$colTitle)*1.01;
if ($w > $maxWidth[$colName]){
$maxWidth[$colName]=$w;
}
}
// calculate the start positions of each of the columns
$pos=array();
$x=0;
$t=$x;
$adjustmentWidth=0;
$setWidth=0;
foreach($maxWidth as $colName => $w){
$pos[$colName]=$t;
// if the column width has been specified then set that here, also total the
// width avaliable for adjustment
if (isset($options['cols'][$colName]) && isset($options['cols'][$colName]['width']) && $options['cols'][$colName]['width']>0){
$t=$t+$options['cols'][$colName]['width'];
$maxWidth[$colName] = $options['cols'][$colName]['width']-$options['gap'];
$setWidth += $options['cols'][$colName]['width'];
} else {
$t=$t+$w+$options['gap'];
$adjustmentWidth += $w;
$setWidth += $options['gap'];
}
}
$pos['_end_']=$t;
// if maxWidth is specified, and the table is too wide, and the width has not been set,
// then set the width.
if ($options['width']==0 && $options['maxWidth'] && ($t-$x)>$options['maxWidth']){
// then need to make this one smaller
$options['width']=$options['maxWidth'];
}
if ($options['width'] && $adjustmentWidth>0 && $setWidth<$options['width']){
// first find the current widths of the columns involved in this mystery
$cols0 = array();
$cols1 = array();
$xq=0;
$presentWidth=0;
$last='';
foreach($pos as $colName=>$p){
if (!isset($options['cols'][$last]) || !isset($options['cols'][$last]['width']) || $options['cols'][$last]['width']<=0){
if (strlen($last)){
$cols0[$last]=$p-$xq -$options['gap'];
$presentWidth += ($p-$xq - $options['gap']);
}
} else {
$cols1[$last]=$p-$xq;
}
$last=$colName;
$xq=$p;
}
// $cols0 contains the widths of all the columns which are not set
$neededWidth = $options['width']-$setWidth;
// if needed width is negative then add it equally to each column, else get more tricky
if ($presentWidth<$neededWidth){
foreach($cols0 as $colName=>$w){
$cols0[$colName]+= ($neededWidth-$presentWidth)/count($cols0);
}
} else {
$cnt=0;
while ($presentWidth>$neededWidth && $cnt<100){
$cnt++; // insurance policy
// find the widest columns, and the next to widest width
$aWidest = array();
$nWidest=0;
$widest=0;
foreach($cols0 as $colName=>$w){
if ($w>$widest){
$aWidest=array($colName);
$nWidest = $widest;
$widest=$w;
} else if ($w==$widest){
$aWidest[]=$colName;
}
}
// then figure out what the width of the widest columns would have to be to take up all the slack
$newWidestWidth = $widest - ($presentWidth-$neededWidth)/count($aWidest);
if ($newWidestWidth > $nWidest){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -