Skip to content

Bộ phân tích HTML

Module Html (8 class) cung cấp renderer HTML-to-PDF có sẵn. Nó phân tích một phần HTML/CSS và render trực tiếp vào PDF — không cần trình duyệt bên ngoài.

Class chính

ClassNhiệm vụ
HtmlParserĐiểm vào chính — tokenize và render HTML
CssRulePhân tích CSS selector và declaration với specificity
HtmlStyleStateTheo dõi ngữ cảnh style lồng nhau (font, màu, căn chỉnh)
TableParserXử lý layout <table> — chiều rộng cột, span, header
HtmlTagHandlerDispatch callback tag mở/đóng
HtmlTokenizerTách HTML thô thành token tag và text
HtmlEntityDecode entity HTML tên và số
InlineStylePhân tích chuỗi attribute 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 = ''): static

writeHtmlCell()

Render HTML trong cell hình chữ nhật có vị trí:

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

Tag HTML hỗ trợ

Block: <h1><h6>, <p>, <div>, <blockquote>, <pre>, <hr>Inline: <b>, <strong>, <i>, <em>, <u>, <s>, <del>, <sup>, <sub>, <span>, <code>, <a>, <br>List: <ul>, <ol>, <li> — lồng đến 4 cấp. Bảng: <table>, <tr>, <th>, <td> — xem Engine Bảng bên dưới. Media: <img src="..." width="..." height="...">

Hỗ trợ CSS

Style có thể áp dụng qua block <style>, attribute inline style, hoặc cả hai. Bộ phân tích tuân thủ specificity và thứ tự cascade.

Thuộc tínhGiá trị ví dụ
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

Phân tích CSS Rule (CssRule)

CssRule tính specificity cho phân giải cascade:

  • Element selector h1, td — specificity (0, 0, 1)
  • Class selector .highlight — specificity (0, 1, 0)
  • ID selector #header — specificity (1, 0, 0)
  • Compound selector table td.active — specificity được cộng

Specificity bằng nhau được phân giải theo thứ tự nguồn (declaration cuối thắng).

Trạng thái Style (HtmlStyleState)

HtmlStyleState duy trì stack ngữ cảnh style. Tag mở push state; tag đóng pop. Điều này đảm bảo style lồng nhau phân giải đúng mà không rò rỉ sang phần tử cùng cấp.

Engine Bảng (TableParser)

  • colspan / rowspan — gộp cell ngang và dọc
  • Chiều rộng cột tự động — phân phối tỷ lệ dựa trên nội dung
  • Chiều rộng cột cố định — qua CSS width trên <td> hoặc <th>
  • Style header<th> nhận văn bản bold mặc định
  • Ngắt trang — bảng vượt chiều cao trang tự động ngắt

Ví dụ đầy đủ

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>
    ');

Mẹo

  • Luôn gọi setFont() trước writeHtml() — bộ phân tích dùng font hiện tại làm mặc định cho văn bản không có style.
  • Để có hỗ trợ CSS3 đầy đủ (Flexbox, Grid, web font), dùng package Artisan thay thế.
  • Bảng HTML lớn tự động ngắt trang khi auto page break được bật.

Phân phối theo giấy phép LGPL-3.0-or-later.