HTML 파서
Html 모듈(8개 클래스)은 내장 HTML-to-PDF 렌더러를 제공합니다. HTML/CSS의 하위 집합을 파싱하여 외부 브라우저 없이 PDF에 직접 렌더링합니다.
주요 클래스
| 클래스 | 역할 |
|---|---|
HtmlParser | 주 진입점 — HTML을 토큰화하고 렌더링 |
CssRule | 명시도를 포함한 CSS 선택자 및 선언 파싱 |
HtmlStyleState | 중첩된 스타일 컨텍스트 추적 (폰트, 색상, 정렬) |
TableParser | <table> 레이아웃 처리 — 열 너비, 스팬, 헤더 |
HtmlTagHandler | 여는/닫는 태그 콜백 디스패치 |
HtmlTokenizer | 원시 HTML을 태그 및 텍스트 토큰으로 분할 |
HtmlEntity | 명명된 및 숫자 HTML 엔티티 디코딩 |
InlineStyle | style="..." 속성 문자열 파싱 |
writeHtml()
php
use Yeeefang\TcpdfNext\Core\Document;
$pdf = Document::create()
->addPage()
->setFont('DejaVuSans', '', 10)
->writeHtml('<h1>Hello World</h1><p>This is a paragraph.</p>');php
writeHtml(string $html, bool $ln = true, bool $fill = false, bool $reseth = false, bool $cell = false, string $align = ''): staticwriteHtmlCell()
위치가 지정된 사각 셀 안에 HTML을 렌더링합니다:
php
writeHtmlCell(float $w, float $h, float $x, float $y, string $html, mixed $border = 0, int $ln = 0, bool $fill = false, bool $reseth = true, string $align = '', bool $autopadding = true): static지원되는 HTML 태그
블록: <h1>--<h6>, <p>, <div>, <blockquote>, <pre>, <hr>인라인: <b>, <strong>, <i>, <em>, <u>, <s>, <del>, <sup>, <sub>, <span>, <code>, <a>, <br>리스트: <ul>, <ol>, <li> — 최대 4단계 중첩. 테이블: <table>, <tr>, <th>, <td> — 아래 테이블 엔진을 참조하십시오. 미디어: <img src="..." width="..." height="...">
CSS 지원
스타일은 <style> 블록, 인라인 style 속성 또는 둘 다를 통해 적용할 수 있습니다. 파서는 명시도와 캐스케이드 순서를 준수합니다.
| 속성 | 예시 값 |
|---|---|
font-family | DejaVuSans, Helvetica, serif |
font-size | 12pt, 16px, 1.2em |
font-weight / font-style | bold, italic, normal |
color / background-color | #ff6600, rgb(255,102,0), red |
text-align | left, center, right, justify |
text-decoration | underline, line-through, none |
line-height | 1.5, 18pt |
margin / padding | 5px, 10px 20px |
border | 1px solid #ddd |
width / height | 100%, 200px |
CSS 규칙 파싱 (CssRule)
CssRule은 캐스케이드 해석을 위한 명시도를 계산합니다:
- 요소 선택자
h1,td— 명시도 (0, 0, 1) - 클래스 선택자
.highlight— 명시도 (0, 1, 0) - ID 선택자
#header— 명시도 (1, 0, 0) - 복합 선택자
table td.active— 명시도가 합산됨
동일한 명시도는 소스 순서로 해석됩니다(마지막 선언이 우선).
스타일 상태 (HtmlStyleState)
HtmlStyleState는 스타일 컨텍스트의 스택을 유지합니다. 여는 태그는 상태를 푸시하고, 닫는 태그는 팝합니다. 이를 통해 중첩된 스타일이 형제 요소로 누출되지 않고 올바르게 해석됩니다.
테이블 엔진 (TableParser)
colspan/rowspan— 수평 및 수직 셀 병합- 자동 열 너비 — 콘텐츠 기반 비례 분배
- 고정 열 너비 —
<td>또는<th>의 CSSwidth를 통해 설정 - 헤더 스타일링 —
<th>는 기본적으로 볼드 텍스트 적용 - 페이지 넘김 — 페이지 높이를 초과하는 테이블은 자동으로 페이지를 넘김
완전한 예제
php
use Yeeefang\TcpdfNext\Core\Document;
$pdf = Document::create()
->addPage()
->setFont('DejaVuSans', '', 10)
->writeHtml('
<style>
h1 { color: #ff6600; font-size: 18pt; }
.highlight { background-color: #ffffcc; padding: 5px; }
table { border-collapse: collapse; width: 100%; }
th { background-color: #333; color: #fff; padding: 8px; }
td { border: 1px solid #ddd; padding: 8px; }
</style>
<h1>Invoice #2026-001</h1>
<p class="highlight">Due: 2026-03-01</p>
<table>
<tr><th>Item</th><th>Qty</th><th>Price</th></tr>
<tr><td>Widget A</td><td>10</td><td>$50.00</td></tr>
<tr><td colspan="2">Total</td><td><b>$50.00</b></td></tr>
</table>
');팁
writeHtml()을 호출하기 전에 항상setFont()을 호출하십시오 — 파서는 스타일이 지정되지 않은 텍스트의 기본값으로 현재 폰트를 사용합니다.- 완전한 CSS3 지원(Flexbox, Grid, 웹 폰트)이 필요하면 대신 Artisan 패키지를 사용하십시오.
- 대형 HTML 테이블은 자동 페이지 넘김이 활성화된 경우 자동으로 페이지에 걸쳐 분할됩니다.