PDF 생성
dompdf/dompdf — HTML → PDF 변환, 인라인 보기 / 파일 다운로드
NotoSansKR 한글 폰트 내장 —
resources/fonts/NotoSansKR-Regular.ttf로 번들됨. 별도 설치 없이 한글이 출력됩니다.
인라인 미리보기 — 미리보기할 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은 서버 환경에 따라 느릴 수 있어 로컬 폰트를 권장합니다.