title

FPDF - PHP로 PDF 만들기 4

한글화&번역 | 2005.09.07 09:21

목차

이 예제는 이전 장에 대한 변형으로써, 텍스트를 여러 칼럼(다단)에 배치하는 방법을 보여줍니다.

  1  <?php
  2  require('fpdf.php');
  3    
  4  class PDF extends FPDF
  5  {
  6      //현재 칼럼
  7      var $col=0;
  8      //칼럼의 세로좌표 시작
  9      var $y0;
 10      function Header()
 11      {
 12          //페이지 헤더
 13          global $title;
 14          $this->SetFont('Arial','B',15);
 15          $w=$this->GetStringWidth($title)+6;
 16          $this->SetX((210-$w)/2);
 17          $this->SetDrawColor(0,80,180);
 18          $this->SetFillColor(230,230,0);
 19          $this->SetTextColor(220,50,50);
 20          $this->SetLineWidth(1);
 21          $this->Cell($w,9,$title,1,1,'C',1);
 22          $this->Ln(10);
 23          //세로좌표 저장
 24          $this->y0=$this->GetY();
 25      }
 26      function Footer()
 27      {
 28          //페이지 푸터
 29          $this->SetY(-15);
 30          $this->SetFont('Arial','I',8);
 31          $this->SetTextColor(128);
 32          $this->Cell(0,10,'Page '.$this->PageNo(),0,0,'C');
 33      }
 34      function SetCol($col)
 35      {
 36          //주어진 칼럼의 위치 설정
 37          $this->col=$col;
 38          $x=10+$col*65;
 39          $this->SetLeftMargin($x);
 40          $this->SetX($x);
 41      }
 42      function AcceptPageBreak()
 43      {
 44          //자동페이지 나눔을 할 것인지 안할 것인지 결정하는 메소드
 45          if($this->colSetCol($this->col+1);
 46              //Set ordinate to top
 47              $this->SetY($this->y0);
 48              //페이지 계속
 49              return false;
 50          }
 51          else
 52          {
 53              //첫번째 칼럼으로 되돌아감
 54              $this->SetCol(0);
 55              //페이지 나눔
 56              return true;
 57          }
 58      }
 59      function ChapterTitle($num,$label)
 60      {
 61          //제목
 62          $this->SetFont('Arial','',12);
 63          $this->SetFillColor(200,220,255);
 64          $this->Cell(0,6,"Chapter  $num : $label",0,1,'L',1);
 65          $this->Ln(4);
 66          //세로좌표 저장
 67          $this->y0=$this->GetY();
 68      }
 69      function ChapterBody($fichier)
 70      {
 71          //텍스트 파일을 읽는다.
 72          $f=fopen($fichier,'r');
 73          $txt=fread($f,filesize($fichier));
 74          fclose($f);
 75          //글꼴
 76          $this->SetFont('Times','',12);
 77          //6cm 길이의 칼럼에 텍스트 출력
 78          $this->MultiCell(60,5,$txt);
 79          $this->Ln();
 80          //내용
 81          $this->SetFont('','I');
 82          $this->Cell(0,5,'(end of excerpt)');
 83          //첫번째 칼럼으로 돌아간다
 84          $this->SetCol(0);
 85      }
 86      function PrintChapter($num,$title,$file)
 87      {
 88          //챕터 추가
 89          $this->AddPage();
 90          $this->ChapterTitle($num,$title);
 91          $this->ChapterBody($file);
 92      }
 93  }
 94  $pdf=new PDF();
 95  $title='20000 Leagues Under the Seas';
 96  $pdf->SetTitle($title);
 97  $pdf->SetAuthor('Jules Verne');
 98  $pdf->PrintChapter(1,'A RUNAWAY REEF','20k_c1.txt');
 99  $pdf->PrintChapter(2,'THE PROS AND CONS','20k_c2.txt');
100  $pdf->Output();
101  ?>

[데모보기]

여기서 사용된 중요한 메소드는 AcceptPageBreak() 입니다.
이 메소드는 자동 페이지 나눔을 허용할지 안할지를 결정합니다. 페이지나눔을 하지않고 여백과 현재위치를 조정함으로써 원하는 칼럼 레이아웃을 만드는 것입니다.나머지는 크게 바뀐게 없습니다. 현재 칼럼의 번호와 시작하는 위치를 저장하기 위한 프로퍼티 두개가 추가되었고, MultiCell()을 6cm의 너비로 호출했습니다.

FPDF - PHP로 PDF 만들기 3

한글화&번역 | 2005.04.19 19:38

목차

3. 줄바꿈과 색상

양쪽 정렬된 문단을 출력하는 다음 예제를 보자. 이 예제는 색상의 사용법도 같이 다루고 있다.

  1  <?php
  2  require('fpdf.php');
  3    
  4  class PDF extends FPDF
  5  {
  6      function Header()
  7      {
  8          global $title;
  9          //Arial bold 15
 10          $this->SetFont('Arial','B',15);
 11          //제목의 너비와 위치 계산
 12          $w=$this->GetStringWidth($title)+6;
 13          $this->SetX((210-$w)/2);
 14          //프레임과 배경색, 글꼴 색상 지정
 15          $this->SetDrawColor(0,80,180);
 16          $this->SetFillColor(230,230,0);
 17          $this->SetTextColor(220,50,50);
 18          //프레임의 두께 지정 (1 mm)
 19          $this->SetLineWidth(1);
 20          //제목
 21          $this->Cell($w,9,$title,1,1,'C',1);
 22          //줄바꿈
 23          $this->Ln(10);
 24      }
 25      function Footer()
 26      {
 27          //하단에서 1.5 cm 지점
 28          $this->SetY(-15);
 29          //Arial italic 8
 30          $this->SetFont('Arial','I',8);
 31          //회색으로 글꼴 색상 지정
 32          $this->SetTextColor(128);
 33          //페이지 번호
 34          $this->Cell(0,10,'Page '.$this->PageNo(),0,0,'C');
 35      }
 36      function ChapterTitle($num,$label)
 37      {
 38          //Arial 12
 39          $this->SetFont('Arial','',12);
 40          //배경색
 41          $this->SetFillColor(200,220,255);
 42          //제목
 43          $this->Cell(0,6,"Chapter $num : $label",0,1,'L',1);
 44          //줄바꿈
 45          $this->Ln(4);
 46      }
 47      function ChapterBody($file)
 48      {
 49          //텍스트를 읽어들임
 50          $f=fopen($file,'r');
 51          $txt=fread($f,filesize($file));
 52          fclose($f);
 53          //Times 12
 54          $this->SetFont('Times','',12);
 55          //양쪽정렬된 문단 출력
 56          $this->MultiCell(0,5,$txt);
 57          //줄바꿈
 58          $this->Ln();
 59          //이탤릭
 60          $this->SetFont('','I');
 61          $this->Cell(0,5,'(end of excerpt)');
 62      }
 63      function PrintChapter($num,$title,$file)
 64      {
 65          $this->AddPage();
 66          $this->ChapterTitle($num,$title);
 67          $this->ChapterBody($file);
 68      }
 69  }
 70  $pdf=new PDF();
 71  $title='20000 Leagues Under the Seas';
 72  $pdf->SetTitle($title);
 73  $pdf->SetAuthor('Jules Verne');
 74  $pdf->PrintChapter(1,'A RUNAWAY REEF','20k_c1.txt');
 75  $pdf->PrintChapter(2,'THE PROS AND CONS','20k_c2.txt');
 76  $pdf->Output();
 77  ?>

[데모보기]

GetStringWidth() 메소드를 이용하면 현재 폰트에서의 문자열의 길이를 얻을 수 있다. 이 길이는 제목 주변에 그릴 프레임의 너비와 위치 등을 구하는데 사용할 수 있다. SetDrawColor(), SetFillColor(), SetTextColor() 등을 이용해서 색상을 설정했으며, SetLineWidth() 메소드를 이용해서 선의 굵기를 1mm로 정해주었다(기본값은 2mm이다).마지막이 되어서야 cell을 출력해주었는데, 가장 마지막 파라미터가 1로 설정되면 색상이 채워진 cell을 그린다.각 문단을 출력하는데는 MultiCell() 메소드가 사용되었는데, 이 메소드를 사용하면 문자가 각 라인의 끝에 도달하면 자동으로 줄바꿈을 하고 현재의 cell아래에 새로운 cell을 생성한다. 글자는 기본적으로 양쪽 정렬(justified)된다.위를 보면 두 가지의 문서속성(혹은 문서정보) - 제목(SetTitle())과 작성자(SetAuthor()) - 이 정의되어있다.문서속성은 두가지 방법으로 볼 수 있는데, 하나는 Acrobat Reader에서 메인메뉴의 파일(File) -> 문서 속성(Document info) -> 설명(General)으로 가서 보는 것이고, 다른 하나는 플러그인 에서도 가능한 방법으로 세로 스크롤바 상단(화면상에선 우측 상단)의 화살표를 클릭해서 문서 속성(Document info)을 선택하는 것이다.

FPDF - PHP로 PDF 만들기 2

한글화&번역 | 2005.03.13 14:31

목차

2. 헤더, 푸터, 페이지 나눔 그리고 이미지
다음의 헤더와 푸터, 로고가 있는 두페이지를 출력하는 예제를 보자.

  1  <?php
  2  require('fpdf.php');
  3    
  4  class PDF extends FPDF
  5  {
  6      //페이지 헤더
  7      function Header()
  8      {
  9          //로고
 10          $this->Image('logo_pb.png',10,8,33);
 11          //Arial bold 15
 12          $this->SetFont('Arial','B',15);
 13          //오른쪽으로 이동
 14          $this->Cell(80);
 15          //제목
 16          $this->Cell(30,10,'Title',1,0,'C');
 17          //줄바꿈
 18          $this->Ln(20);
 19      }
 20      //페이지 푸터
 21      function Footer()
 22      {
 23          //아래쪽에서 1.5cm 만큼 떨어진 위치
 24          $this->SetY(-15);
 25          //Arial italic 8
 26          $this->SetFont('Arial','I',8);
 27          //페이지 번호
 28          $this->Cell(0,10,'Page '.$this->PageNo().'/{nb}',0,0,'C');
 29      }
 30  }
 31  //상속받은 클래스를 인스턴스로 생성
 32  $pdf=new PDF();
 33  $pdf->AliasNbPages();
 34  $pdf->AddPage();
 35  $pdf->SetFont('Times','',12);
 36  for($i=1;$i<=40;$i++)
 37  $pdf->Cell(0,10,'Printing line number '.$i,0,1);
 38  $pdf->Output();
 39  ?>

이 예제는 Header()Footer() 메소드를 이용하여 페이지의 헤더와 푸터를 처리하고 있다. Header() 와 Footer() 메소드는 자동으로 호출되며, 이미 FPDF 안에 구현이 되어있으나 그 안에 있는 것은 아무런 역할도 하지 않는다. 따라서, 클래스를 상속받아서 오버라이드 해야한다.

로고는 Image() 메소드에 왼쪽, 상단의 위치와 너비를 주어서 출력했다. 높이는 이미지의 비율에 맞게 알아서 계산된다.

페이지 번호를 출력하기 위해서 너비를 주고 빈 셀을 출력했다. 이것은 곧 셀의 오른쪽 여백이 그 너비만큼 늘어났다는 것을 의미하며, 텍스트를 중간에 위치시키기 위해서 사용되었다. 현재 페이지의 번호는 PageNo() 메소드의 리턴값을 통해 얻을 수 있고, 전체 페이지번호를 얻으려면, {nb}라는 값을 전체 페이지를 출력하고자 하는 위치에 출력한다음, AliasNbPages() 메소드를 실행한다.
SetY() 메소드를 이용하면, 페이지의 상단 혹은 하단을 기준으로 하는 절대좌표를 설정할 수 있다.

다른 흥미로운 기능은 자동 페이지 넘김이다. 셀이 페이지의 범위(하단으로부터 2cm이 기본값)를 넘어가면, 페이지가 자동으로 바뀌며, 글꼴 설정도 복원된다. 그래서 헤더와 푸터가 Arial 폰트로 출력되어도 본문은 계속 Times 로 출력되는 것이다. 이 자동 복원 기술은 색상과 선 굵기에도 적용된다.

자동으로 페이지가 바뀌는 영역은 SetAutoPageBreak()으로 설정할 수 있다.
________________________________________
이 글은 fpdf.org 의 tutorial 을 번역하고 일부 추가한 내용입니다.