'php'에 해당하는 글 2건

FPDF

Daily/Prog 2014. 2. 5. 14:43

 

 

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
손가락귀신
정신 못차리면, 벌 받는다.

,

vimrc filetype

Tip/Linux 2013. 6. 21. 00:20

vim 편집기를 사용할 때,
html 파일안에 php 코드를 넣는 경우,
php 에 대한 하이라이팅이 정상적으로 나오지 않는 경우가 발생합니다.
php 스크립트릿 <? ?> 과 태그 < > 주석 /* */ 등이 겹치면서 엉망이 되지요.

 

php 파일안에 html 태그의 하이라이팅 -> 정상
html 파일안에 php 코드의 하이라이팅 -> 비정상

 

그러므로 html 파일의 확장자를 php 로 바꿔도 되지만 이 방법은 ㅎㄷㄷ;
vim 편집기로 html 파일을 열 경우 하이라이팅 형식을 php 로 지정하는 것이 가능합니다.

 

$ vi ~/.vimrc
augroup filetype
    autocmd BufNewFile,BufRead /*.html set syntax=php
augroup END

 

syntax 를 filetype 으로 바꿔도 가능합니다.


WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,