본문 바로가기

IT/Web Programming

PDF 컨버터(출력물) DOMPDF 사용팁

# DOMPDF # 사용 팁

 

DOMPDF 는 HTML 을 PDF 로 변환해주는 컨버터입니다.

PHP 5.0 이상에서 지원합니다.

 

CSS 를 지원하며, @media, @page 작업도 지원합니다.

CSS 상에서 왠만한 미디어쿼리 및 문서의 paging 기능도 지원하므로

예전에 리포트툴에 의존하던 특정기능들을 어느정도(?)는 지원할 수 있게 되었습니다.

 

기존의 FastReport로 작업된 출력물들을 DOMPDF로 작업을 했습니다.

툴을 별도로 설치할 필요가 없고, 기존 웹작업 하던대로 작업을 했기 때문에

출력물 또한 기존의 품질을 유지할 수 있었습니다.

 

처음 사용하던거라 많은 시행착오가 있었지만,

모든 툴이 다 그렇듯이 익숙함이 찾아오면서 나름 유용하게 사용했습니다.

 

허나 그래도 몇몇가지 문제가 존재합니다. 그러므로

사용할때 피해야할 것들과 알아두면 좋은 tip으로 남겨드립니다

 

1. 기반은 table 기반으로 작업하시고 css는 inline-style로 작업하는것이 좋습니다.

  - 기본 div 로 작업하게 되면 경우에 따라 레이아웃이 깨지기도 합니다

  - css는 inline으로 작업하셔야 합니다. 그래야 바로바로 스타일이 적용됩니다.

    * 출력물이기 때문에 기본 웹 작업방식과는 조금 차이가 있습니다.

 

2. 이중 table (Nested Table)은 사용을 자제 하셔야 합니다.

  - 간혹 페이지가 넘어갈때 이중테이블이 pdf 로 변환하지 못하는 오류가 있습니다.

  - 이중 table로 작업을 하지마시고 table을 여러개 사용하는것이 좋습니다

  - 이중 테이블의 경우 페이징이 되는 중간부분에서 테이블이 잘리는 경우이므로 이를 아직 처리를 못해주는것 같습니다.

 

3. 변환작업때 서버의 메모리 설정을 조금은 넉넉히 잡아줘야 합니다.

  - html을 pdf 로 변환하는 과정에서 html량에 따라서 시간이 다소 걸릴수 있습니다.

  - memory limit 및 timeout 에 빠져나갈 위험이 있으므로 

    데이터를 최대한 최적화로 하셔서 사용하길 권장드립니다.

 

4. 페이지가 넘어가는 table의 경우 page-break 속성을 넣어주십시오

  - 페이징 처리 속성을 넣어야 한 페이지가 바로 다음 페이지로 넘어가게 됩니다

   .page-break { page-break-after:always; }

    div.page-break:last-child{ page-break-after:avoid; }

  - 페이징 메기기 소스 예제 (그냥 바로 갖다 쓰셔도 됨)

    <script type="text/php">

 

if ( isset($pdf) ) {

 

$size = 10;

$color = array(0,0,0);

if (class_exists('Font_Metrics')) {

$font = Font_Metrics::get_font("NanumGothic");

$text_height = Font_Metrics::get_font_height($font, $size);

$width = Font_Metrics::get_text_width("Page 1 of 2", $font, $size);

} elseif (class_exists('Dompdf\\FontMetrics')) {

$font = $fontMetrics->getFont("NanumGothic");

$text_height = $fontMetrics->getFontHeight($font, $size);

$width = $fontMetrics->getTextWidth("Page 1 of 2", $font, $size);

}

 

$foot = $pdf->open_object();

 

$w = $pdf->get_width();

$h = $pdf->get_height();

 

// Draw a line along the bottom

$y = $h - $text_height - 24;

$pdf->line(16, $y, $w - 16, $y, $color, 0.5);

 

$pdf->close_object();

$pdf->add_object($foot, "all");

 

$text = "{PAGE_COUNT} - {PAGE_NUM}";  

 

// Center the text

$pdf->page_text($w / 2 - $width / 2, $y, $text, $font, $size, $color);

 

}

</script>   

 

 

5. @page를 사용하여 문서의 폭을 결정합니다.

   - @page { margin-bottom:0px; }

   - 출력물은 출력 후 바인딩 처리가 많으므로 출력폭을 지정하셔야 합니다.

 

6. @font를 이용하여 한글지원을 잡아줍니다

   - 나눔고딕 폰트를 다운로드하여 폰트를 지정해야 한글이 지원됩니다.

   - @font-face{

font-family:NanumGothic;  

src: url("{{ public_path('font/NanumGothic.ttf') }}");

   }

 

이상 개인적으로 작업을 하면서

부딪혔던 문제에 대해서 나름 know-how를 정리했습니다.

리포트 툴을 설치 않아도 웹방식으로 그대로 실시간으로 출력물을 확인 할 수 있는 장점이 좋았습니다.

참고 바랍니다