💻 쇼핑몰 자동화 & 웹 개발 가이드

[PHP 입문] PDF 생성 및 다운로드 완전 정리

rhandy 2025. 4. 22. 07:10
728x90

PDF 견적서, 계약서, 보고서 자동 생성이 필요하신가요? PHP에서도 충분히, 그리고 멋지게 할 수 있습니다.

안녕하세요! 실무에서 가장 많이 요청받는 기능 중 하나가 바로 ‘PDF 자동 생성’이에요. 예전엔 워드나 수동 출력이 많았지만, 요즘은 클릭 한 번으로 PDF 출력이 기본입니다. PHP에서도 충분히 강력하게 PDF를 다룰 수 있어요. 이 글에서는 가장 많이 사용되는 mpdfdompdf 두 가지 라이브러리를 중심으로 설치부터 PDF 생성, 한글 폰트 설정, HTML 스타일링까지 실전 예제로 정리해드릴게요. PDF가 필요한 모든 상황에 대비할 수 있도록, 쉽게 따라올 수 있게 구성했습니다.

1. PHP PDF 라이브러리 소개: mPDF vs dompdf

PHP에서 PDF 생성을 위한 대표 라이브러리는 mPDFdompdf입니다. 둘 다 HTML 기반으로 PDF를 만들어주지만, 약간의 차이가 있어요.

라이브러리 특징
mPDF 빠르고 강력하며, 한글 지원이 뛰어남
dompdf CSS 호환이 좋고 HTML 렌더링에 강점

간단하게 견적서, 레이아웃 기반 출력이라면 mPDF, 정교한 CSS가 필요하다면 dompdf를 추천드립니다.

2. 설치 및 기본 PDF 출력 예제

composer를 이용해 아래 명령어로 설치하세요.

// mPDF 설치
composer require mpdf/mpdf

// dompdf 설치
composer require dompdf/dompdf

아래는 mPDF를 이용해 PDF를 생성하는 기본 예제입니다.

require_once __DIR__ . '/vendor/autoload.php';

$mpdf = new \Mpdf\Mpdf();
$mpdf->WriteHTML('<h1>안녕하세요, PDF입니다!</h1>');
$mpdf->Output('example.pdf', 'I'); // 'I'는 브라우저 출력

Output() 함수의 두 번째 인자에 따라 브라우저 표시(I), 다운로드(D), 파일 저장(F)을 선택할 수 있습니다.

  • I: 브라우저 내 표시
  • D: 즉시 다운로드
  • F: 서버에 저장

이제 기본 PDF는 준비 끝! 다음 단계에서 HTML 스타일을 추가하고 실전 문서처럼 꾸며볼게요.

3. HTML과 CSS로 PDF 스타일링하기

mPDF나 dompdf 모두 HTML 기반이라서 웹 페이지를 꾸미듯 PDF도 스타일링할 수 있어요. 다만 모든 CSS 속성이 지원되는 건 아니니 기본적인 스타일 위주로 구성하는 것이 좋아요.

$html = '
  <style>
    body { font-family: sans-serif; font-size: 14px; }
    h1 { color: #4a148c; }
    table { width: 100%; border-collapse: collapse; }
    th, td { border: 1px solid #ccc; padding: 8px; }
    th { background: #f3e5f5; }
  </style>

  <h1>주문 내역서</h1>
  <table>
    <thead>
      <tr><th>상품명</th><th>수량</th><th>금액</th></tr>
    </thead>
    <tbody>
      <tr><td>책상</td><td>2</td><td>150,000원</td></tr>
      <tr><td>의자</td><td>4</td><td>240,000원</td></tr>
    </tbody>
  </table>
';

$mpdf = new \Mpdf\Mpdf();
$mpdf->WriteHTML($html);
$mpdf->Output();

폰트, 컬러, 표, 간격 등 대부분의 기본 CSS는 적용 가능하며, 인라인 스타일도 유용하게 활용할 수 있어요. 실제 견적서나 배송서 양식을 구현할 수 있을 만큼 충분히 강력합니다.

4. 한글 폰트 설정 및 인코딩 문제 해결

mPDF는 기본적으로 한글을 잘 지원하지만, 원하는 스타일의 폰트를 적용하려면 약간의 설정이 필요해요. 아래는 나눔고딕 폰트를 사용하는 방법입니다.

// config.php에서 한글 폰트 추가 설정
$defaultConfig = (new Mpdf\Config\ConfigVariables())->getDefaults();
$fontDirs = $defaultConfig['fontDir'];

$defaultFontConfig = (new Mpdf\Config\FontVariables())->getDefaults();
$fontData = $defaultFontConfig['fontdata'];

$mpdf = new \Mpdf\Mpdf([
  'fontDir' => array_merge($fontDirs, [__DIR__ . '/fonts']),
  'fontdata' => $fontData + [
    'nanumgothic' => [
      'R' => 'NanumGothic-Regular.ttf',
      'B' => 'NanumGothic-Bold.ttf',
    ]
  ],
  'default_font' => 'nanumgothic'
]);
  • 폰트 파일(.ttf)은 직접 프로젝트에 추가
  • fontDir에 경로 지정
  • default_font 설정으로 전역 적용

이렇게 하면 한글도 깨지지 않고, 전체 문서가 깔끔한 스타일로 출력돼요. 계약서나 증명서 같은 문서에 꼭 필요한 설정입니다.

 

Q mPDF와 dompdf 중 어떤 걸 선택해야 할까요?

정적인 문서(견적서, 계약서 등)에선 mPDF가 속도와 한글 지원에서 강점을 보입니다. CSS 디테일과 HTML 레이아웃에 더 신경 쓴다면 dompdf가 유리해요. 상황에 따라 적절히 선택하세요.

A 한글 + 속도 = mPDF / CSS 정교함 = dompdf 추천!
Q PDF를 저장하지 않고 바로 다운로드하게 하려면?

$mpdf->Output('filename.pdf', 'D');를 사용하면 저장 없이 브라우저에서 바로 다운로드 됩니다. 'I'는 브라우저에서 보기, 'F'는 서버 저장이에요.

A Output('파일명.pdf', 'D')로 바로 다운로드 처리!
Q HTML에서 쓰던 모든 CSS가 mPDF에도 적용되나요?

기본적인 스타일은 대부분 적용되지만, mPDF는 일부 최신 CSS 속성이나 JS는 지원하지 않아요. layout은 float, table, inline-block 정도로 구성하는 게 가장 안정적입니다.

A 최신 CSS 일부 제외, 기본적인 스타일 위주로 설계하세요!
Q 한글이 깨져서 출력돼요. 어떻게 해야 하나요?

폰트가 없거나 인코딩이 UTF-8이 아닐 가능성이 큽니다. default_fontnanumgothic 같은 한글 지원 폰트로 설정하고, HTML과 PHP 파일 모두 UTF-8로 저장하세요.

A 한글 폰트 설정 + UTF-8 저장이면 문제 없습니다!
Q dompdf로도 한글 폰트 적용이 가능한가요?

가능하지만 기본적으로는 지원하지 않아서 폰트를 직접 추가해야 합니다. font-family로 원하는 TTF 폰트를 등록하고 load_font.php 유틸을 활용하면 해결돼요.

A dompdf도 가능! 다만 mPDF보다 한글 설정은 조금 더 복잡해요.

 

처음 PDF 기능을 구현하려고 했을 때는 ‘이걸 PHP로 할 수 있을까?’ 하는 생각이 들었어요. 하지만 mPDF를 사용해 첫 견적서를 만들고, dompdf로 이력서를 출력해봤을 때, PDF는 그저 HTML의 또 다른 표현이라는 걸 느꼈습니다. 특히 한글 폰트 세팅이나 테이블 레이아웃을 한 줄 한 줄 완성해나갈 때마다 완성도가 높아지는 느낌이 정말 뿌듯하더라고요. 지금 이 글을 읽고 계신 여러분도 하나하나 실습해보신다면 곧 실무에서 견적서, 주문서, 계약서 자동화를 완벽히 구현하실 수 있을 거예요. 어렵게 느껴졌던 PDF, 이제 더 이상 두렵지 않으시죠? 😎

728x90