FPDF – PHP로 PDF 만들기 6

목차

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

< ?php
require('fpdf.php');

class PDF extends FPDF
{
	var $B;
	var $I;
	var $U;
	var $HREF;

	function PDF($orientation='P',$unit='mm',$format='A4')
	{
		//Call parent constructor
		$this->FPDF($orientation,$unit,$format);

		//Initialization
		$this->B=0;
		$this->I=0;
		$this->U=0;
		$this->HREF='';
	}

	function WriteHTML($html)
	{
		//HTML parser
		$html=str_replace("\n",' ',$html);
		$a=preg_split('/< (.*)>/U',$html,-1,PREG_SPLIT_DELIM_CAPTURE);
		foreach($a as $i=>$e)
		{
			if($i%2==0)
			{
				//Text
				if($this->HREF)
					$this->PutLink($this->HREF,$e);
				else
					$this->Write(5,$e);
			}
			else
			{
				//Tag
				if($e{0}=='/')
					$this->CloseTag(strtoupper(substr($e,1)));
				else
				{
					//Extract attributes
					$a2=explode(' ',$e);
					$tag=strtoupper(array_shift($a2));
					$attr=array();

					foreach($a2 as $v) {
						if(ereg('^([^=]*)=["\']?([^"\']*)["\']?$',$v,$a3))
							$attr[strtoupper($a3[1])]=$a3[2];
					}

					$this->OpenTag($tag,$attr);
				}
			}
		}
	}

	function OpenTag($tag,$attr)
	{
		//Opening tag
		if($tag=='B' or $tag=='I' or $tag=='U')
			$this->SetStyle($tag,true);
		if($tag=='A')
			$this->HREF=$attr['HREF'];
		if($tag=='BR')
			$this->Ln(5);
	}

	function CloseTag($tag)
	{
		//Closing tag
		if($tag=='B' or $tag=='I' or $tag=='U')
			$this->SetStyle($tag,false);
		if($tag=='A')
			$this->HREF='';
	}

	function SetStyle($tag,$enable)
	{
		//Modify style and select corresponding font
		$this->$tag+=($enable ? 1 : -1);
		$style='';

		foreach(array('B','I','U') as $s)
		{
			if($this->$s > 0)
				$style.=$s;
		}

		$this->SetFont('',$style);
	}

	function PutLink($URL,$txt)
	{
		//Put a hyperlink
		$this->SetTextColor(0,0,255);
		$this->SetStyle('U',true);
		$this->Write(5,$txt,$URL);
		$this->SetStyle('U',false);
		$this->SetTextColor(0);
	}
}
$html='You can now easily print text mixing different
styles : bold, italic, underline, or
all at once!
You can also insert links on text, such as www.fpdf.org, or on an image: click on the logo.'; $pdf=new PDF(); //First page $pdf->AddPage(); $pdf->SetFont('Arial','',20); $pdf->Write(5,"To find out what's new in this tutorial, click"); $pdf->SetFont('','U'); $link=$pdf->AddLink(); $pdf->Write(5,'here',$link); $pdf->SetFont(''); //Second page $pdf->AddPage(); $pdf->SetLink($link); $pdf->Image('logo.png',10,10,30,0,'','http://www.fpdf.org'); $pdf->SetLeftMargin(45); $pdf->SetFontSize(14); $pdf->WriteHTML($html); $pdf->Output(); ?>

텍스트를 출력하는 메소드는 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()도 링크를 삽입하는데 사용될 수 있음을 기억해주시기 바랍니다.

댓글을 남겨주세요