Skip to content

HTML 파서

Html 모듈(8개 클래스)은 내장 HTML-to-PDF 렌더러를 제공합니다. HTML/CSS의 하위 집합을 파싱하여 외부 브라우저 없이 PDF에 직접 렌더링합니다.

주요 클래스

클래스역할
HtmlParser주 진입점 — HTML을 토큰화하고 렌더링
CssRule명시도를 포함한 CSS 선택자 및 선언 파싱
HtmlStyleState중첩된 스타일 컨텍스트 추적 (폰트, 색상, 정렬)
TableParser<table> 레이아웃 처리 — 열 너비, 스팬, 헤더
HtmlTagHandler여는/닫는 태그 콜백 디스패치
HtmlTokenizer원시 HTML을 태그 및 텍스트 토큰으로 분할
HtmlEntity명명된 및 숫자 HTML 엔티티 디코딩
InlineStylestyle="..." 속성 문자열 파싱

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 = ''): static

writeHtmlCell()

위치가 지정된 사각 셀 안에 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-familyDejaVuSans, Helvetica, serif
font-size12pt, 16px, 1.2em
font-weight / font-stylebold, italic, normal
color / background-color#ff6600, rgb(255,102,0), red
text-alignleft, center, right, justify
text-decorationunderline, line-through, none
line-height1.5, 18pt
margin / padding5px, 10px 20px
border1px solid #ddd
width / height100%, 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>의 CSS width를 통해 설정
  • 헤더 스타일링<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 테이블은 자동 페이지 넘김이 활성화된 경우 자동으로 페이지에 걸쳐 분할됩니다.

LGPL-3.0-or-later 라이선스로 배포됩니다.