title

FPDF에서 한글 사용하기

, Tip&Tech, 한글화&번역 | 2006.06.15 02:18

fpdf에서는 한글 확장팩을 지원하고 있습니다.
fpdf가 설치된 디렉토리에 아래 파일을 다운받으신후 압축을 풀면 됩니다.

확장팩에는 포함되어있지 않지만 다양한 글꼴을 사용할 수 있도록 ex.php 파일을 다음과 같이 수정했습니다.
명조, 고딕은 기본으로 사용가능 한 것이고, Windows에 설치된 글꼴이라면 다 사용가능합니다. 혹시 없는 글꼴이라해도 기본글꼴로 표현되니까 크게 걱정할 필요는 없을 것 같습니다.

아… “Windows에 설치된 글꼴” 이라는 건 당연히 문서를 보는 클라이언트 PC에 해당하는 사항입니다.

  1  <?php
  2  require('korean.php');
  3    
  4  $pdf=new PDF_Korean();
  5  $pdf->AddUHCFont('명조');
  6  $pdf->AddUHCFont('고딕''HYGoThic-Medium-Acro');
  7  $pdf->AddUHCFont('돋움''Dotum');
  8  $pdf->AddUHCFont('바탕''Batang');
  9  $pdf->AddUHCFont('궁서''Gungsuh');
 10  $pdf->AddUHCFont('굴림''Gulim');
 11  $pdf->AddUHCFont('한겨레결체''한겨레결체');
 12  $pdf->AddUHCFont('없는글꼴''없는글꼴');
 13  $pdf->Open();
 14  $pdf->AddPage();
 15  $pdf->SetFont('명조','',16);
 16  $pdf->Write(8,'PHP 3.0은 1998년 6월에 공식적으로 릴리즈되었다. 공개적인 테스트 이후약 9개월만이었다.');
 17  $pdf->Ln();
 18  $pdf->SetFont('고딕','',16);
 19  $pdf->Write(8,"(고딕)고딕글꼴도 나타날 수 있었다.");
 20  $pdf->Ln();
 21  $pdf->SetFont('바탕','',16);
 22  $pdf->Write(8,"(바탕)일단 완전히 새로운 폰트가 추가되지는 않아도...");
 23  $pdf->Ln();
 24  $pdf->SetFont('궁서','',16);
 25  $pdf->Write(8,'(궁서)윈도우즈에 있는 기본적인 글꼴은 가능하다.');
 26  $pdf->Ln();
 27  $pdf->SetFont('굴림','',16);
 28  $pdf->Write(8,'(굴림)글꼴들이 조금 달라보이시나요?');
 29  $pdf->Ln();
 30  $pdf->SetFont('돋움','',16);
 31  $pdf->Write(8,'(돋움)이건 돋움체랍니다.');
 32  $pdf->Ln();
 33  $pdf->SetFont('한겨레결체','',16);
 34  $pdf->Write(8,'(한겨레결체)이건 한겨레결체랍니다.');
 35  $pdf->Ln();
 36  $pdf->SetFont('없는글꼴','',16);
 37  $pdf->Write(8,'(없는글꼴)글꼴이 없으면 기본값인 명조체로 나타납니다.');
 38  $pdf->Output();
 39  $pdf->Ln(); $pdf->Ln();
 40  ?>

FPDF - PHP로 PDF 만들기 6

한글화&번역 | 2005.09.07 10:15

목차

이 절에서는 내/외부 링크를 삽입하는 방법과 간단한 HTML Parser를 포함한 새로운 텍스트 출력모드를 설명합니다.

  1  <?php
  2  require('fpdf.php');
  3    
  4  class PDF extends FPDF
  5  {
  6      var $B;
  7      var $I;
  8      var $U;
  9      var $HREF;
 10      function PDF($orientation='P',$unit='mm',$format='A4')
 11      {
 12          //Call parent constructor
 13          $this->FPDF($orientation,$unit,$format);
 14          //Initialization
 15          $this->B=0;
 16          $this->I=0;
 17          $this->U=0;
 18          $this->HREF='';
 19      }
 20      function WriteHTML($html)
 21      {
 22          //HTML parser
 23          $html=str_replace("\n",' ',$html);
 24          $a=preg_split('/<(.*)>/U',$html,-1,PREG_SPLIT_DELIM_CAPTURE);
 25          foreach($a as $i=>$e)
 26          {
 27              if($i%2==0)
 28              {
 29                  //Text
 30                  if($this->HREF)
 31                      $this->PutLink($this->HREF,$e);
 32                  else
 33                      $this->Write(5,$e);
 34              }
 35              else
 36              {
 37                  //Tag
 38                  if($e{0}=='/')
 39                      $this->CloseTag(strtoupper(substr($e,1)));
 40                  else
 41                  {
 42                      //Extract attributes
 43                      $a2=explode(' ',$e);
 44                      $tag=strtoupper(array_shift($a2));
 45                      $attr=array();
 46                      foreach($a2 as $v)
 47                          if(ereg('^([^=]*)=["\']?([^"\']*)["\']?$',$v,$a3))
 48                              $attr[strtoupper($a3[1])]=$a3[2];
 49                          $this->OpenTag($tag,$attr);
 50                  }
 51              }
 52          }
 53      }
 54      function OpenTag($tag,$attr)
 55      {
 56          //Opening tag
 57          if($tag=='B' or $tag=='I' or $tag=='U')
 58              $this->SetStyle($tag,true);
 59          if($tag=='A')
 60              $this->HREF=$attr['HREF'];
 61          if($tag=='BR')
 62              $this->Ln(5);
 63      }
 64      function CloseTag($tag)
 65      {
 66          //Closing tag
 67          if($tag=='B' or $tag=='I' or $tag=='U')
 68              $this->SetStyle($tag,false);
 69          if($tag=='A')
 70              $this->HREF='';
 71      }
 72      function SetStyle($tag,$enable)
 73      {
 74          //Modify style and select corresponding font
 75          $this->$tag+=($enable : -1);
 76          $style='';
 77          foreach(array('B','I','U') as $s)
 78              if($this->$s>0)
 79                  $style.=$s;
 80          $this->SetFont('',$style);
 81      }
 82      function PutLink($URL,$txt)
 83      {
 84          //Put a hyperlink
 85          $this->SetTextColor(0,0,255);
 86          $this->SetStyle('U',true);
 87          $this->Write(5,$txt,$URL);
 88          $this->SetStyle('U',false);
 89          $this->SetTextColor(0);
 90      }
 91  }
 92  $html='You can now easily print text mixing different
 93  styles : <B>bold</B>, <I>italic</I>, <U>underlined</U>, or
 94  <I><U>all at once</U></I>!<BR> You can also insert links
 95  on text, such as <A href="http://www.fpdf.org"   >www.fpdf.org</A>,
 96  or on an image: click on the logo.';
 97  $pdf=new PDF();
 98  //First page
 99  $pdf->AddPage();
100  $pdf->SetFont('Arial','',20);
101  $pdf->Write(5,'To find out what\'s new in this tutorial, click ');
102  $pdf->SetFont('','U');
103  $link=$pdf->AddLink();
104  $pdf->Write(5,'here',$link);
105  $pdf->SetFont('');
106  //Second page
107  $pdf->AddPage();
108  $pdf->SetLink($link);
109  $pdf->Image('logo.png',10,10,30,0,'','http://www.fpdf.org');
110  $pdf->SetLeftMargin(45);
111  $pdf->SetFontSize(14);
112  $pdf->WriteHTML($html);
113  $pdf->Output();
114  ?>

텍스트를 출력하는 메소드는 Write() 입니다. 이 메소드는 MultiCell()과 매우 밀접합니다. 다른점은 다음과 같습니다:

  • 오른쪽 여백부분에 줄 끝이 있고, 왼쪽여백에서 다음 줄이 시작한다.
  • 현재 커서위치가 텍스트의 끝으로 옮겨진다.

이러한 특성덕택에 텍스트를 출력하고, 글꼴 스타일을 변경한 후에도 정확히 그 지점부터 다시 시작할 수 있습니다. 반면에, 양쪽 정렬은 할 수 없습니다.
링크를 입력하기 위해 첫번째 페이지에서 AddLink()라는 메소드를 사용했는데, 이 링크는 두번째 페이지를 가리키고 있습니다. 문장의 시작부분에는 일반적인 스타일로 글을 출력하고 그 이후에 밑줄 속성을 준 후에 문장을 종료했습니다. 링크는 AddLink() 로 만들며, 이 메소드는 링크 식별자를 반환합니다. 식별자는 Write() 메소드의 세번째 파라미터로 사용됩니다. 두번째 페이지가 생성된 후에 SetLink()를 이용해서 페이지 상단에 링크 포인트를 만들 수 있습니다.

그 다음에는 이미지에 링크를 입력했습니다. 외부 링크는 URL(HTTP, mailto…)을 가리킵니다. URL은 간단하게 Image() 함수에 마지막 파라미터로 링크를 넘겨주기만 하면 됩니다. 단, PDF가 넷스케이프의 플러그인으로 실행될 때에는 외부링크가 작동하지 않습니다.

마지막으로, 왼쪽 여백은 SetLeftMargin()을 통해 이미지 다음으로 옮겨졌고, 일부 HTML형식의 텍스트가 출력되었습니다. 사용되는 HTML 출력에 HTML 파서는, preg_split() 함수를 이용해서 정규표현식을 기준으로 나누어지며, 구분자도 반환받는 PREG_SPLIT_DELIM_CAPTURE 옵션(PHP 4.0.5 이상)을 함께 사용하고 있습니다. 만약 이전버전의 PHP 를 사용하고 계신다면 해당 라인을 다음과 같이 바꾸시기 바랍니다:

$a=preg_split('/[<>]/',$html);

조금 덜 엄격하긴 하지만 유효한 HTML이라면 같은 결과를 얻을 수 있습니다.
명심해야 할 것은 허용되는 태그가 <B>, <I>, <U>, <A> <BR> 뿐이라는 것입니다. 다른 태그들은 무시됩니다. 또한 파서는 Write() 메소드를 이용합니다. 따라서 같은 방식으로 외부링크를 삽입할 수 있습니다(Write()의 세번째 파라미터).
아울러, Cell()도 링크를 삽입하는데 사용될 수 있음을 기억해주시기 바랍니다.

FPDF - PHP로 PDF 만들기 5

한글화&번역 | 2005.09.07 10:15

목차

이 장에서는 테이블 만드는 방법에 대해서 쉽게 알려줍니다.

  1  require('fpdf.php');
  2  class PDF extends FPDF
  3  {
  4      //데이타를 읽는다
  5      function LoadData($file)
  6      {
  7          //파일을 줄단위로 읽어온다
  8          $lines=file($file);
  9          $data=array();
 10          foreach($lines as $line)
 11              $data[]=explode(';',chop($line));
 12          return $data;
 13      }
 14      //간단한 테이블
 15      function BasicTable($header,$data)
 16      {
 17          //헤더
 18          foreach($header as $col)
 19              $this->Cell(40,7,$col,1);
 20          $this->Ln();
 21          //데이터
 22          foreach($data as $row)
 23          {
 24              foreach($row as $col)
 25                  $this->Cell(40,6,$col,1);
 26              $this->Ln();
 27          }
 28      }
 29      //더 나은 모양
 30      function ImprovedTable($header,$data)
 31      {
 32          //칼럼 너비
 33          $w=array(40,35,40,45);
 34          //헤더
 35          for($i=0;$i<count($header); $i++)
 36              $this->Cell($w[$i],7,$header[$i],1,0,'C');
 37          $this->Ln();
 38          //데이터
 39          foreach($data as $row)
 40          {
 41              $this->Cell($w[0],6,$row[0],'LR');
 42              $this->Cell($w[1],6,$row[1],'LR');
 43              $this->Cell($w[2],6,number_format($row[2]),'LR',0,'R');
 44              $this->Cell($w[3],6,number_format($row[3]),'LR',0,'R');
 45              $this->Ln();
 46          }
 47          //Closure line
 48          $this->Cell(array_sum($w),0,'','T');
 49      }
 50      //색상이 들어간 테이블
 51      function FancyTable($header,$data)
 52      {
 53          //색상, 라인너비, 굵은 글씨 설정
 54          $this->SetFillColor(255,0,0);
 55          $this->SetTextColor(255);
 56          $this->SetDrawColor(128,0,0);
 57          $this->SetLineWidth(.3);
 58          $this->SetFont('','B');
 59          //헤더
 60          $w=array(40,35,40,45);
 61          for($i=0;$i<count($header); $i++)
 62              $this->Cell($w[$i],7,$header[$i],1,0,'C',1);
 63          $this->Ln();
 64          //색상과 글꼴 설정을 원래대로
 65          $this->SetFillColor(224,235,255);
 66          $this->SetTextColor(0);
 67          $this->SetFont('');
 68          //데이터
 69          $fill=0;
 70          foreach($data as $row)
 71          {
 72              $this->Cell($w[0],6,$row[0],'LR',0,'L',$fill);
 73              $this->Cell($w[1],6,$row[1],'LR',0,'L',$fill);
 74              $this->Cell($w[2],6,number_format($row[2]),'LR',0,'R',$fill);
 75              $this->Cell($w[3],6,number_format($row[3]),'LR',0,'R',$fill);
 76              $this->Ln();
 77              $fill=!$fill;
 78          }
 79          $this->Cell(array_sum($w),0,'','T');
 80      }
 81  }
 82  $pdf=new PDF();
 83  //칼럼 제목
 84  $header=array('Country','Capital','Area (sq km)','Pop. (thousands)');
 85  //데이터 읽기
 86  $data=$pdf->LoadData('countries.txt');
 87  $pdf->SetFont('Arial','',14);
 88  $pdf->AddPage();
 89  $pdf->BasicTable($header,$data);
 90  $pdf->AddPage();
 91  $pdf->ImprovedTable($header,$data);
 92  $pdf->AddPage();
 93  $pdf->FancyTable($header,$data);
 94  $pdf->Output();
 95  ?>

[데모보기]

테이블은 셀의 집합일 뿐이므로, 당연히 셀을 다루는 것으로 테이블을 만듭니다. 첫번째 예제는 가장 간단한 방법으로 만들어졌습니다: 모든 프레임은 단순한 형태의 외곽선, 동일한 크기, 왼쪽 정렬이 되어있습니다. 간단하지만 매우 빠른 결과를 얻을 수 있습니다.두번째 예제는 몇가지를 개선했습니다: 각 칼럼은 서로 다른 너비를 가지며, 제목줄은 중간정렬, 수치는 오른쪽 정렬이 되도록 했습니다. 또한, 가로줄을 제거했습니다. 가로줄을 제거하는 것은 Cell() 메소드에 셀의 가장자리 그리는 법을 지정하는 외곽선 파라미터를 부여하면 됩니다. 파라미터로는 왼쪽(L)과 오른쪽(R)이 있습니다. 하지만 여전히, 테이블을 마무리 하는 가로선이 문제로 남아있습니다. 두가지 방법이 있습니다: 경계선 파라미터에 LRB를 이용할 때 루프에서 마지막 줄을 체크하거나, 혹은 여기서 했던 것처럼 루프가 종료된 후에 줄을 하나 더 추가하는 것입니다.
세번째 테이블은 색상을 사용한다는 점만 제외하면 두번째와 비슷합니다. 셀배경(Fill), 글꼴, 라인 등의 색상은 쉽게 지정할 수 있습니다. 줄의 색상은 투명/불투명을 변경하고 셀에 색상을 채움으로써 변경할 수 있습니다.