📄 fpdf.php
字号:
}
if($c == ' ') $sep=$i;
$l += $cw[$c];
if($l > $wmax)
{
//Automatic line break
if($sep==-1)
{
if($this->x > $this->lMargin)
{
//Move to next line
if ($currentx != 0) $this->x=$currentx;//EDITEI
else $this->x=$this->lMargin;
$this->y+=$h;
$w=$this->w-$this->rMargin-$this->x;
$wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
$i++;
$nl++;
continue;
}
if($i==$j) $i++;
$this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link);
}
else
{
$this->Cell($w,$h,substr($s,$j,$sep-$j),0,2,'',0,$link);
$i=$sep+1;
}
$sep=-1;
$j=$i;
$l=0;
if($nl==1)
{
if ($currentx != 0) $this->x=$currentx;//EDITEI
else $this->x=$this->lMargin;
$w=$this->w-$this->rMargin-$this->x;
$wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
}
$nl++;
}
else $i++;
}
//Last chunk
if($i!=$j) $this->Cell($l/1000*$this->FontSize,$h,substr($s,$j),0,0,'',0,$link);
}
//-------------------------FLOWING BLOCK------------------------------------//
//EDITEI some things (added/changed) //
//The following functions were originally written by Damon Kohler //
//--------------------------------------------------------------------------//
function saveFont()
{
$saved = array();
$saved[ 'family' ] = $this->FontFamily;
$saved[ 'style' ] = $this->FontStyle;
$saved[ 'sizePt' ] = $this->FontSizePt;
$saved[ 'size' ] = $this->FontSize;
$saved[ 'curr' ] =& $this->CurrentFont;
$saved[ 'color' ] = $this->TextColor; //EDITEI
$saved[ 'bgcolor' ] = $this->FillColor; //EDITEI
$saved[ 'HREF' ] = $this->HREF; //EDITEI
$saved[ 'underline' ] = $this->underline; //EDITEI
$saved[ 'strike' ] = $this->strike; //EDITEI
$saved[ 'SUP' ] = $this->SUP; //EDITEI
$saved[ 'SUB' ] = $this->SUB; //EDITEI
$saved[ 'linewidth' ] = $this->LineWidth; //EDITEI
$saved[ 'drawcolor' ] = $this->DrawColor; //EDITEI
$saved[ 'is_outline' ] = $this->outline_on; //EDITEI
return $saved;
}
function restoreFont( $saved )
{
$this->FontFamily = $saved[ 'family' ];
$this->FontStyle = $saved[ 'style' ];
$this->FontSizePt = $saved[ 'sizePt' ];
$this->FontSize = $saved[ 'size' ];
$this->CurrentFont =& $saved[ 'curr' ];
$this->TextColor = $saved[ 'color' ]; //EDITEI
$this->FillColor = $saved[ 'bgcolor' ]; //EDITEI
$this->ColorFlag = ($this->FillColor != $this->TextColor); //Restore ColorFlag as well
$this->HREF = $saved[ 'HREF' ]; //EDITEI
$this->underline = $saved[ 'underline' ]; //EDITEI
$this->strike = $saved[ 'strike' ]; //EDITEI
$this->SUP = $saved[ 'SUP' ]; //EDITEI
$this->SUB = $saved[ 'SUB' ]; //EDITEI
$this->LineWidth = $saved[ 'linewidth' ]; //EDITEI
$this->DrawColor = $saved[ 'drawcolor' ]; //EDITEI
$this->outline_on = $saved[ 'is_outline' ]; //EDITEI
if( $this->page > 0)
$this->_out( sprintf( 'BT /F%d %.2f Tf ET', $this->CurrentFont[ 'i' ], $this->FontSizePt ) );
}
function newFlowingBlock( $w, $h, $b = 0, $a = 'J', $f = 0 , $is_table = false )
{
// cell width in points
if ($is_table) $this->flowingBlockAttr[ 'width' ] = ($w * $this->k);
else $this->flowingBlockAttr[ 'width' ] = ($w * $this->k) - (2*$this->cMargin*$this->k);
// line height in user units
$this->flowingBlockAttr[ 'is_table' ] = $is_table;
$this->flowingBlockAttr[ 'height' ] = $h;
$this->flowingBlockAttr[ 'lineCount' ] = 0;
$this->flowingBlockAttr[ 'border' ] = $b;
$this->flowingBlockAttr[ 'align' ] = $a;
$this->flowingBlockAttr[ 'fill' ] = $f;
$this->flowingBlockAttr[ 'font' ] = array();
$this->flowingBlockAttr[ 'content' ] = array();
$this->flowingBlockAttr[ 'contentWidth' ] = 0;
}
function finishFlowingBlock($outofblock=false)
{
if (!$outofblock) $currentx = $this->x; //EDITEI - in order to make the Cell method work better
//prints out the last chunk
$is_table = $this->flowingBlockAttr[ 'is_table' ];
$maxWidth =& $this->flowingBlockAttr[ 'width' ];
$lineHeight =& $this->flowingBlockAttr[ 'height' ];
$border =& $this->flowingBlockAttr[ 'border' ];
$align =& $this->flowingBlockAttr[ 'align' ];
$fill =& $this->flowingBlockAttr[ 'fill' ];
$content =& $this->flowingBlockAttr[ 'content' ];
$font =& $this->flowingBlockAttr[ 'font' ];
$contentWidth =& $this->flowingBlockAttr[ 'contentWidth' ];
$lineCount =& $this->flowingBlockAttr[ 'lineCount' ];
// set normal spacing
$this->_out( sprintf( '%.3f Tw', 0 ) );
$this->ws = 0;
// the amount of space taken up so far in user units
$usedWidth = 0;
// Print out each chunk
//EDITEI - Print content according to alignment
$empty = $maxWidth - $contentWidth;
$empty /= $this->k;
$b = ''; //do not use borders
$arraysize = count($content);
$margins = (2*$this->cMargin);
if ($outofblock)
{
$align = 'C';
$empty = 0;
$margins = $this->cMargin;
}
switch($align)
{
case 'R':
foreach ( $content as $k => $chunk )
{
$this->restoreFont( $font[ $k ] );
$stringWidth = $this->GetStringWidth( $chunk ) + ( $this->ws * substr_count( $chunk, ' ' ) / $this->k );
// determine which borders should be used
$b = '';
if ( $lineCount == 1 && is_int( strpos( $border, 'T' ) ) ) $b .= 'T';
if ( $k == count( $content ) - 1 && is_int( strpos( $border, 'R' ) ) ) $b .= 'R';
if ($k == $arraysize-1 and !$outofblock) $skipln = 1;
else $skipln = 0;
if ($arraysize == 1) $this->Cell( $stringWidth + $margins + $empty, $lineHeight, $chunk, $b, $skipln, $align, $fill, $this->HREF , $currentx ); //mono-style line
elseif ($k == 0) $this->Cell( $stringWidth + ($margins/2) + $empty, $lineHeight, $chunk, $b, 0, 'R', $fill, $this->HREF );//first part
elseif ($k == $arraysize-1 ) $this->Cell( $stringWidth + ($margins/2), $lineHeight, $chunk, $b, $skipln, '', $fill, $this->HREF, $currentx );//last part
else $this->Cell( $stringWidth , $lineHeight, $chunk, $b, 0, '', $fill, $this->HREF );//middle part
}
break;
case 'L':
case 'J':
foreach ( $content as $k => $chunk )
{
$this->restoreFont( $font[ $k ] );
$stringWidth = $this->GetStringWidth( $chunk ) + ( $this->ws * substr_count( $chunk, ' ' ) / $this->k );
// determine which borders should be used
$b = '';
if ( $lineCount == 1 && is_int( strpos( $border, 'T' ) ) ) $b .= 'T';
if ( $k == 0 && is_int( strpos( $border, 'L' ) ) ) $b .= 'L';
if ($k == $arraysize-1 and !$outofblock) $skipln = 1;
else $skipln = 0;
if (!$is_table and !$outofblock and !$fill and $align=='L' and $k == 0) {$align='';$margins=0;} //Remove margins in this special (though often) case
if ($arraysize == 1) $this->Cell( $stringWidth + $margins + $empty, $lineHeight, $chunk, $b, $skipln, $align, $fill, $this->HREF , $currentx ); //mono-style line
elseif ($k == 0) $this->Cell( $stringWidth + ($margins/2), $lineHeight, $chunk, $b, $skipln, $align, $fill, $this->HREF );//first part
elseif ($k == $arraysize-1 ) $this->Cell( $stringWidth + ($margins/2) + $empty, $lineHeight, $chunk, $b, $skipln, '', $fill, $this->HREF, $currentx );//last part
else $this->Cell( $stringWidth , $lineHeight, $chunk, $b, $skipln, '', $fill, $this->HREF );//middle part
}
break;
case 'C':
foreach ( $content as $k => $chunk )
{
$this->restoreFont( $font[ $k ] );
$stringWidth = $this->GetStringWidth( $chunk ) + ( $this->ws * substr_count( $chunk, ' ' ) / $this->k );
// determine which borders should be used
$b = '';
if ( $lineCount == 1 && is_int( strpos( $border, 'T' ) ) ) $b .= 'T';
if ($k == $arraysize-1 and !$outofblock) $skipln = 1;
else $skipln = 0;
if ($arraysize == 1) $this->Cell( $stringWidth + $margins + $empty, $lineHeight, $chunk, $b, $skipln, $align, $fill, $this->HREF , $currentx ); //mono-style line
elseif ($k == 0) $this->Cell( $stringWidth + ($margins/2) + ($empty/2), $lineHeight, $chunk, $b, 0, 'R', $fill, $this->HREF );//first part
elseif ($k == $arraysize-1 ) $this->Cell( $stringWidth + ($margins/2) + ($empty/2), $lineHeight, $chunk, $b, $skipln, 'L', $fill, $this->HREF, $currentx );//last part
else $this->Cell( $stringWidth , $lineHeight, $chunk, $b, 0, '', $fill, $this->HREF );//middle part
}
break;
default: break;
}
}
function WriteFlowingBlock( $s , $outofblock = false )
{
if (!$outofblock) $currentx = $this->x; //EDITEI - in order to make the Cell method work better
$is_table = $this->flowingBlockAttr[ 'is_table' ];
// width of all the content so far in points
$contentWidth =& $this->flowingBlockAttr[ 'contentWidth' ];
// cell width in points
$maxWidth =& $this->flowingBlockAttr[ 'width' ];
$lineCount =& $this->flowingBlockAttr[ 'lineCount' ];
// line height in user units
$lineHeight =& $this->flowingBlockAttr[ 'height' ];
$border =& $this->flowingBlockAttr[ 'border' ];
$align =& $this->flowingBlockAttr[ 'align' ];
$fill =& $this->flowingBlockAttr[ 'fill' ];
$content =& $this->flowingBlockAttr[ 'content' ];
$font =& $this->flowingBlockAttr[ 'font' ];
$font[] = $this->saveFont();
$content[] = '';
$currContent =& $content[ count( $content ) - 1 ];
// where the line should be cutoff if it is to be justified
$cutoffWidth = $contentWidth;
// for every character in the string
for ( $i = 0; $i < strlen( $s ); $i++ )
{
// extract the current character
$c = $s{$i};
// get the width of the character in points
$cw = $this->CurrentFont[ 'cw' ][ $c ] * ( $this->FontSizePt / 1000 );
if ( $c == ' ' )
{
$currContent .= ' ';
$cutoffWidth = $contentWidth;
$contentWidth += $cw;
continue;
}
// try adding another char
if ( $contentWidth + $cw > $maxWidth )
{
// it won't fit, output what we already have
$lineCount++;
//Readjust MaxSize in order to use the whole page width
if ($outofblock and ($lineCount == 1) ) $maxWidth = $this->pgwidth * $this->k;
// contains any content that didn't make it into this print
$savedContent = '';
$savedFont = array();
// first, cut off and save any partial words at the end of the string
$words = explode( ' ', $currContent );
// if it looks like we didn't finish any words for this chunk
if ( count( $words ) == 1 )
{
// save and crop off the content currently on the stack
$savedContent = array_pop( $content );
$savedFont = array_pop( $font );
// trim any trailing spaces off the last bit of content
$currContent =& $content[ count( $content ) - 1 ];
$currContent = rtrim( $currContent );
}
else // otherwise, we need to find which bit to cut off
{
$lastContent = '';
for ( $w = 0; $w < count( $words ) - 1; $w++) $lastContent .= "{$words[ $w ]} ";
$savedContent = $words[ count( $words ) - 1 ];
$savedFont = $this->saveFont();
// replace the current content with the cropped version
$currContent = rtrim( $lastContent );
}
// update $contentWidth and $cutoffWidth since they changed with cropping
$contentWidth = 0;
foreach ( $content as $k => $chunk )
{
$this->restoreFont( $font[ $k ] );
$contentWidth += $this->GetStringWidth( $chunk ) * $this->k;
}
$cutoffWidth = $contentWidth;
// if it's justified, we need to find the char spacing
if( $align == 'J' )
{
// count how many spaces there are in the entire content string
$numSpaces = 0;
foreach ( $content as $chunk ) $numSpaces += substr_count( $chunk, ' ' );
// if there's more than one space, find word spacing in points
if ( $numSpaces > 0 ) $this->ws = ( $maxWidth - $cutoffWidth ) / $numSpaces;
else $this->ws = 0;
$this->_out( sprintf( '%.3f Tw', $this->ws ) );
}
// otherwise, we want normal spacing
else $this->_out( sprintf( '%.3f Tw', 0 ) );
//EDITEI - Print content according to alignment
if (!isset($numSpaces)) $numSpaces = 0;
$contentWidth -= ($this->ws*$numSpaces);
$empty = $maxWidth - $contentWidth - 2*($this->ws*$numSpaces);
$empty /= $this->k;
$b = ''; //do not use borders
/*'If' below used in order to fix "first-line of other page with justify on" bug*/
if($this->y+$this->divheight>$this->PageBreakTrigger and !$this->InFooter and $this->AcceptPageBreak())
{
$bak_x=$this->x;//Current X position
$ws=$this->ws;//Word Spacing
if($ws>0)
{
$this->ws=0;
$this->_out('0 Tw');
}
$this->AddPage($this->CurOrientation);
$this->x=$bak_x;
if($ws>0)
{
$this->ws=$ws;
$this->_out(sprintf('%.3f Tw',$ws));
}
}
$arraysize = count($content);
$margins = (2*$this->cMargin);
if ($outofblock)
{
$align = 'C';
$empty = 0;
$margins = $this->cMargin;
}
switch($align)
{
case 'R':
foreach ( $content as $k => $chunk )
{
$this->restoreFont( $font[ $k ] );
$stringWidth = $this->GetStringWidth( $chunk ) + ( $this->ws * substr_count( $chunk, ' ' ) / $this->k );
// determine which borders should be used
$b = '';
if ( $lineCount == 1 && is_int( strpos( $border, 'T' ) ) ) $b .= 'T';
if ( $k == count( $content ) - 1 && is_int( strpos( $border, 'R' ) ) ) $b .= 'R';
if ($arraysize == 1) $this->Cell( $stringWidth + $margins + $empty, $lineHeight, $chunk, $b, 1, $align, $fill, $this->HREF , $currentx ); //mono-style line
elseif ($k == 0) $this->Cell( $stringWidth + ($margins/2) + $empty, $lineHeight, $chunk, $b, 0, 'R', $fill, $this->HREF );//first part
elseif ($k == $arraysize-1 ) $this->Cell( $stringWidth + ($margins/2), $lineHeight, $chunk, $b, 1, '', $fill, $this->HREF, $currentx );//last part
else $this->Cell( $stringWidth , $lineHeight, $chunk, $b, 0, '', $fill, $this->HREF );//middle part
}
break;
case 'L':
case 'J':
foreach ( $content as $k => $chunk )
{
$this->restoreFont( $font[ $k ] );
$stringWidth = $this->GetStringWidth( $chunk ) + ( $this->ws * substr_count( $chunk, ' ' ) / $this->k );
// determine which borders should be used
$b = '';
if ( $lineCount == 1 && is_int( strpos( $border, 'T' ) ) ) $b .= 'T';
if ( $k == 0 && is_int( strpos( $border, 'L' ) ) ) $b .= 'L';
if (!$is_table and !$outofblock and !$fill and $align=='L' and $k == 0)
{
//Remove margins in this special (though often) case
$align='';
$margins=0;
}
if ($arraysize == 1) $this->Cell( $stringWidth + $margins + $empty, $lineHeight, $chunk, $b, 1, $align, $fill, $this->HREF , $currentx ); //mono-style line
elseif ($k == 0) $this->Cell( $stringWidth + ($margins/2), $lineHeight, $chunk, $b, 0, $align, $fill, $this->HREF );//first part
elseif ($k == $arraysize-1 ) $this->Cell( $stringWidth + ($margins/2) + $empty, $lineHeight, $chunk, $b, 1, '', $fill, $this->HREF, $currentx );//last part
else $this->Cell( $stringWidth , $lineHeight, $chunk, $b, 0, '', $fill, $this->HREF );//middle part
if (!$is_table and !$outofblock and !$fill and $align=='' and $k == 0)
{
$align = 'L';
$margins = (2*$this->cMargin);
}
}
break;
case 'C':
foreach ( $content as $k => $chunk )
{
$this->restoreFont( $font[ $k ] );
$stringWidth = $this->GetStringWidth( $chunk ) + ( $this->ws * substr_count( $chunk, ' ' ) / $this->k );
// determine which borders should be used
$b = '';
if ( $lineCount == 1 && is_int( strpos( $border, 'T' ) ) ) $b .= 'T';
if ($arraysize == 1) $this->Cell( $stringWidth + $margins + $empty, $lineHeight, $chunk, $b, 1, $align, $fill, $this->HREF , $currentx ); //mono-style line
elseif ($k == 0) $this->Cell( $stringWidth + ($margins/2) + ($empty/2), $lineHeight, $chunk, $b, 0, 'R', $fill, $this->HREF );//first part
elseif ($k == $arraysize-1 ) $this->Cell( $stringWidth + ($margins/2) + ($empty/2), $lineHeight, $chunk, $b, 1, 'L', $fill, $this->HREF, $currentx );//last part
else $this->Cell( $stringWidth , $lineHeight, $chunk, $b, 0, '', $fill, $this->HREF );//middle part
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -