이 확장 프로그램을 FPDF 클래스에 사용했습니다. MultiCell 메서드를 소개합니다 (편의상 OutputLines 메서드에 래핑됩니다). 이 방법에서는 최대 줄 수를 지정할 수 있습니다. 맞지 않을 문자열의 모든 부분이 함수에서 반환됩니다. 이 경우 ''
을 반환 할 때까지 새 함수를 만들고 MultiCell을 다시 호출 할 수 있습니다.
<?
require 'fpdf.php';
// Class voor implementate van handige aanvullende features.
class EPDF extends FPDF {
function MultiCell($w, $h, $txt, $border=0, $align='J', $fill=false, $maxline=0)
{
//Output text with automatic or explicit line breaks, at most $maxline lines
$cw=&$this->CurrentFont['cw'];
if($w==0)
$w=$this->w-$this->rMargin-$this->x;
$wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
$s=str_replace("\r",'',$txt);
$nb=strlen($s);
if($nb>0 && $s[$nb-1]=="\n")
$nb--;
$b=0;
if($border)
{
if($border==1)
{
$border='LTRB';
$b='LRT';
$b2='LR';
}
else
{
$b2='';
if(is_int(strpos($border,'L')))
$b2.='L';
if(is_int(strpos($border,'R')))
$b2.='R';
$b=is_int(strpos($border,'T')) ? $b2.'T' : $b2;
}
}
$sep=-1;
$shy=-1;
$shy1=-1;
$brk=-1;
$lshy=0;
$cx = '';
$i=0;
$j=0;
$l=0;
$ns=0;
$nl=1;
while($i<$nb)
{
//Get next character
$c=$s[$i];
if($c=="\n")
{
//Explicit line break
if($this->ws>0)
{
$this->ws=0;
$this->_out('0 Tw');
}
$this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill);
$i++;
$sep=-1;
$shy=-1;
$shy1=-1;
$brk=-1;
$cx='';
$j=$i;
$l=0;
$ns=0;
$nl++;
if($border && $nl==2)
$b=$b2;
if($maxline && $nl>$maxline)
return substr($s,$i);
continue;
}
if($c==' ')
{
$sep=$i;
$ls=$l;
$ns++;
}
// Soft break (­)
if ($c==$GLOBALS["hyphen"])
{
// Afbreektekentje. Onthouden van laatste en voorlaatste positie.
$shy1=$shy;
$shy=$i;
$lshy1=$lshy;
$lshy = $l;
$l-=$cw[$c];
}
if ($c=='-')
{
$brk=$i;
$ls = $l + $cw[$c];
$ns++;
$cy = '-';
}
$l+=$cw[$c];
if($l>$wmax)
{
// Woord past niet meer. Kijken of het af te breken is op een hard afbreekstreepje
if ($brk>$shy)
{
if ($brk>$sep)
{
$sep=$brk;
$cx='-';
}
}
elseif ($shy > $sep) // Of op een soft afbreekstreepje
{
if ($lshy + $cw['-'] > $wmax)
{
if ($shy1 > $sep)
{
$sep = $shy1;
$ls = $lshy1;
$cx = '-';
}
}
else
{
$sep = $shy;
$ls = $lshy;
$cx = '-';
}
}
//Automatic line break
if($sep==-1)
{
if($i==$j)
$i++;
if($this->ws>0)
{
$this->ws=0;
$this->_out('0 Tw');
}
$this->Cell($w,$h,substr($s,$j,$i-$j).$cx,$b,2,$align,$fill);
}
else
{
if($align=='J')
{
$this->ws=($ns>1) ? ($wmax-$ls)/1000*$this->FontSize/($ns-1) : 0;
$this->_out(sprintf('%.3F Tw',$this->ws*$this->k));
}
$this->Cell($w,$h,substr($s,$j,$sep-$j).$cx,$b,2,$align,$fill);
$i=$sep+1;
}
$sep=-1;
$shy=-1;
$shy1=-1;
$cx = '';
$j=$i;
$l=0;
$ns=0;
$nl++;
if($border && $nl==2)
$b=$b2;
if($maxline && $nl>$maxline)
{
if($this->ws>0)
{
$this->ws=0;
$this->_out('0 Tw');
}
return substr($s,$i);
}
}
else
$i++;
}
//Last chunk
if($this->ws>0)
{
$this->ws=0;
$this->_out('0 Tw');
}
if($border && is_int(strpos($border,'B')))
$b.='B';
$this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill);
$this->x=$this->lMargin;
return '';
}
function OutputLines($w, $h, $text, $maxline = 0)
{
return $this->MultiCell($w, $h, $text, 0, 'L', false, $maxline);
}
}
제가 해결책이라고 생각하는 것을 게시했지만 이런 종류의 질문을 할 때 다음에 달성하고자하는 것을 설명해주십시오. 텍스트가 맞지 않으면 텍스트 줄이기, 여백 늘리기, 글꼴 크기 줄이기 또는 새 페이지 삽입과 같은 옵션을 선택할 수 있습니다. 나는 당신이 마지막 것을 의미한다고 생각했지만, 나는 당신의 질문에서 말할 수 없었습니다. – GolezTrol