PDF 생성

dompdf/dompdf — HTML → PDF 변환, 인라인 보기 / 파일 다운로드

NotoSansKR 한글 폰트 내장resources/fonts/NotoSansKR-Regular.ttf로 번들됨. 별도 설치 없이 한글이 출력됩니다.
상품 목록 보고서

playground_products 데이터를
스타일된 표 형식 PDF로 출력

PDF 다운로드
인보이스 샘플

로고·항목·합계·부가세가 포함된
전문적인 인보이스 PDF

PDF 다운로드
게시글 목록

posts 테이블 최근 20개를
목록 형식 PDF로 출력

PDF 다운로드
인라인 미리보기 — 미리보기할 PDF를 선택하세요

미리보기 버튼을 클릭하면 여기에 PDF가 표시됩니다

1. 설치 (Installation)
# DOMPDF 패키지 설치
composer require dompdf/dompdf

# composer.json 에 추가됨
# "dompdf/dompdf": "^2.0"
2. 기본 사용법
<?php

namespace App\Controllers\Examples;

use App\Controllers\BaseController;
use Dompdf\Dompdf;
use Dompdf\Options;

class PdfGeneration extends BaseController
{
    public function products(): void
    {
        // ① 데이터 조회
        $products = db_connect()->table('playground_products')->get()->getResultArray();

        // ② HTML 생성 (CI4 뷰 활용)
        $html = view('examples/pdf_generation/tpl_products', [
            'products'  => $products,
            'generated' => date('Y-m-d H:i:s'),
        ], ['saveData' => false]);

        // ③ DOMPDF 옵션 설정
        $options = new Options();
        $options->set('defaultFont', 'DejaVu Sans');    // 기본 폰트
        $options->set('isHtml5ParserEnabled', true);    // HTML5 파서 활성화
        $options->set('isRemoteEnabled', false);        // 외부 리소스 비활성화 (보안)
        $options->setChroot([FCPATH]);                  // 접근 허용 경로

        // ④ PDF 생성
        $dompdf = new Dompdf($options);
        $dompdf->loadHtml($html, 'UTF-8');  // HTML 로드
        $dompdf->setPaper('A4', 'portrait'); // 용지 크기 및 방향
        $dompdf->render();                   // PDF 렌더링

        // ⑤ 출력 방식 선택
        $download = $this->request->getGet('download') === '1';
        $dompdf->stream('products.pdf', [
            'Attachment' => (int) $download, // 0: 인라인 보기, 1: 다운로드
        ]);
    }
}
3. PDF 템플릿 뷰 (app/Views/examples/pdf_generation/tpl_products.php)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
/* DOMPDF은 인라인 CSS만 지원 — 외부 CSS 파일 사용 불가 */
body { font-family: "DejaVu Sans", sans-serif; font-size: 11px; }
table { width: 100%; border-collapse: collapse; }
thead th { background: #1a1a2e; color: #fff; padding: 8px; }
tbody td { padding: 7px; border-bottom: 1px solid #eee; }
tbody tr:nth-child(even) { background: #f9fafb; }
</style>
</head>
<body>
<h1>Product Report — <?= esc($generated) ?></h1>
<table>
    <thead>
        <tr><th>#</th><th>Name</th><th>Price</th></tr>
    </thead>
    <tbody>
    <?php foreach ($products as $i => $p): ?>
    <tr>
        <td><?= $i+1 ?></td>
        <td><?= esc($p['name']) ?></td>
        <td>₩ <?= number_format($p['price']) ?></td>
    </tr>
    <?php endforeach ?>
    </tbody>
</table>
</body>
</html>
Options 주요 설정
옵션기본값설명
defaultFont serif 기본 폰트
isHtml5ParserEnabled false HTML5 파서 사용 여부
isRemoteEnabled false 외부 URL 이미지·CSS 허용
defaultPaperSize letter 용지 크기 (A4, letter 등)
isPhpEnabled false PHP 실행 허용 (보안상 비권장)
tempDir /tmp 임시 파일 저장 경로
출력 방식
// 브라우저 인라인 보기
$dompdf->stream('file.pdf', ['Attachment' => 0]);

// 파일 다운로드
$dompdf->stream('file.pdf', ['Attachment' => 1]);

// 문자열로 반환 (저장·이메일 첨부 등)
$pdfString = $dompdf->output();
file_put_contents('/path/to/output.pdf', $pdfString);

// 용지 방향
$dompdf->setPaper('A4', 'portrait');   // 세로
$dompdf->setPaper('A4', 'landscape'); // 가로
DOMPDF 기본 폰트(DejaVu, Helvetica 등)는 한글을 지원하지 않습니다. 한글 PDF를 생성하려면 한글 TTF/OTF 폰트를 로드해야 합니다.
1. 한글 폰트 파일 준비
# Noto Sans KR 다운로드 (Google Fonts)
# https://fonts.google.com/noto/specimen/Noto+Sans+KR

# 프로젝트 폰트 디렉터리에 복사
mkdir -p public/fonts
cp NotoSansKR-Regular.ttf public/fonts/
cp NotoSansKR-Bold.ttf    public/fonts/
2. DOMPDF에 폰트 등록
// 최초 1회만 실행 (CLI 또는 별도 스크립트)
use Dompdf\Dompdf;
use Dompdf\Options;

$options = new Options();
$options->setChroot([FCPATH]);

$dompdf = new Dompdf($options);

// 폰트 메트릭스 로드 후 TTF 설치
$fontMetrics = $dompdf->getFontMetrics();
$fontMetrics->registerFont(
    ['family' => 'NotoSansKR', 'style' => 'normal', 'weight' => 'normal'],
    FCPATH . 'fonts/NotoSansKR-Regular.ttf'
);
$fontMetrics->registerFont(
    ['family' => 'NotoSansKR', 'style' => 'normal', 'weight' => 'bold'],
    FCPATH . 'fonts/NotoSansKR-Bold.ttf'
);
3. PDF 템플릿에서 폰트 사용
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
/* 등록된 NotoSansKR 폰트 지정 */
body {
    font-family: 'NotoSansKR', 'DejaVu Sans', sans-serif;
}
</style>
</head>
<body>
<h1>한글이 정상 출력됩니다</h1>
<p>상품명: 갤럭시 스마트폰, 가격: ₩1,200,000</p>
</body>
</html>
실무 팁
  • 폰트 등록은 최초 1회 실행 후 캐시 파일(*.ufm)이 생성됩니다. 이후 재등록 불필요.
  • Options::setFontCache()로 캐시 경로를 writable/cache/dompdf/로 지정하면 관리가 편합니다.
  • NotoSansKR 파일 크기는 약 4MB — PDF 생성 시간에 영향을 줄 수 있습니다.
  • isRemoteEnabled = true + Google Fonts CDN URL은 서버 환경에 따라 느릴 수 있어 로컬 폰트를 권장합니다.