php 로 PDF 파일을 만드는 fpdf 라이브러리.
http://www.fpdf.org
특정 공간안에 텍스트를 삽입하길 원하면, 일반적으로 MultiCell 메소드를 사용한다.
$pdf->MultiCell( 100, 20, 'text' );
하지만 cell 안에 들어갈 text의 길이가 지정해 놓은 가로길이(100)나 세로길이(20) 보다 길어진다면...
cell의 가로 길이는 고정되며 text는 자동 개행이 이루어진다.
cell의 세로 길이는 늘어나며 모든 text를 보여주게 된다.
하지만 세로 길이가 늘어나며 레이아웃이 깨질 가능성이 있다면,
cell의 세로 길이도 가로 길이처럼 늘어나지 않도록 고정시켜야 한다. 텍스트가 짤리더라도.
하지만 fpdf의 기본 메소드로는 불가능하다 ㅜ
찾다 찾다 겨우 찾아낸 애드온.
http://fpdf.de/downloads/addons/52
대충 분석해 보면,
cell 세로 길이 안에 정해진 폰트 크기로 몇줄 들어가는지 파악하고,
cell 메소드를 사용하여 한문자별 한줄씩 삽입하여 cell 크기는 고정.
그러나 외국에서 만들어 놓은 만큼 한글 입력시 오류 발생.
오류를 수정하기 위해 중간중간 손을 좀 봤슴.
암튼 이거 못찾았으면 정말 망할뻔 했는데 정말 다행임ㅋㅋ
<?php require_once('fpdf.php'); class PDF_Korean extends FPDI { ... // MultiCell text fit function drawTextBox($strText, $w, $h, $align='L', $valign='T', $border=1) { $xi=$this->GetX(); $yi=$this->GetY(); $hrow=$this->FontSize; $textrows=$this->drawRows($w, $hrow, $strText, 0, $align, 0, 0, 0); $maxrows=floor($h/$this->FontSize); $rows=min($textrows, $maxrows); $dy=0; if (strtoupper($valign)=='M') $dy=($h-$rows*$this->FontSize)/2; if (strtoupper($valign)=='B') $dy=$h-$rows*$this->FontSize; $this->SetY($yi+$dy); $this->SetX($xi); $this->drawRows($w, $hrow, $strText, 0, $align, 0, $rows, 1); if ($border==1) $this->Rect($xi, $yi, $w, $h); } function drawRows($w, $h, $txt, $border=0, $align='J', $fill=0, $maxline=0, $prn=0) { $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 and $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; $i=0; $j=0; $l=0; $ns=0; $nl=1; while($i<$nb) { //Get next character $c=$s[$i]; $ascii=(ord($c)<128); if($c=="\n") { //Explicit line break if($this->ws>0) { $this->ws=0; if ($prn==1) $this->_out('0 Tw'); } if ($prn==1) { $this->Cell($w, $h, substr($s, $j, $i-$j), $b, 2, $align, $fill); } $i++; $sep=-1; $j=$i; $l=0; $ns=0; $nl++; if($border and $nl==2) $b=$b2; if ( $maxline && $nl > $maxline ) return substr($s, $i); continue; } if($c==' ') { $sep=$i; $ls=$l; $ns++; } //$l+=$cw[$c]; $l+=$ascii ? $cw[$c] : 1000; if($l>$wmax) { //Automatic line break if($sep==-1) { if($i==$j) { //$i++; $i+=$ascii ? 1 : 2; } if($this->ws>0) { $this->ws=0; if ($prn==1) $this->_out('0 Tw'); } if ($prn==1) { $this->Cell($w, $h, substr($s, $j, $i-$j), $b, 2, $align, $fill); } } else { if($align=='J') { $this->ws=($ns>1) ? ($wmax-$ls)/1000*$this->FontSize/($ns-1) : 0; if ($prn==1) $this->_out(sprintf('%.3f Tw', $this->ws*$this->k)); } if ($prn==1){ $this->Cell($w, $h, substr($s, $j, $sep-$j), $b, 2, $align, $fill); } $i=$sep+1; } $sep=-1; $j=$i; $l=0; $ns=0; $nl++; if($border and $nl==2) $b=$b2; if ( $maxline && $nl > $maxline ) return substr($s, $i); } else { //$i++; $i+=$ascii ? 1 : 2; } } //Last chunk if($this->ws>0) { $this->ws=0; if ($prn==1) $this->_out('0 Tw'); } if($border and is_int(strpos($border, 'B'))) $b.='B'; if ($prn==1) { $this->Cell($w, $h, substr($s, $j, $i-$j), $b, 2, $align, $fill); } $this->x=$this->lMargin; return $nl; } } ?>
아래와 같이 사용
$pdf->drawTextBox($text,50,50,'L','T',1);
WRITTEN BY
- 손가락귀신
정신 못차리면, 벌 받는다.