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
| Class | Nhiệm vụ |
|---|---|
HtmlParser | Điểm vào chính — tokenize và render HTML |
CssRule | Phân tích CSS selector và declaration với specificity |
HtmlStyleState | Theo dõi ngữ cảnh style lồng nhau (font, màu, căn chỉnh) |
TableParser | Xử lý layout <table> — chiều rộng cột, span, header |
HtmlTagHandler | Dispatch callback tag mở/đóng |
HtmlTokenizer | Tách HTML thô thành token tag và text |
HtmlEntity | Decode entity HTML tên và số |
InlineStyle | Phân tích chuỗi attribute style="..." |
writeHtml()
use Yeeefang\TcpdfNext\Core\Document;
$pdf = Document::create()
->addPage()
->setFont('DejaVuSans', '', 10)
->writeHtml('<h1>Hello World</h1><p>This is a paragraph.</p>');writeHtml(string $html, bool $ln = true, bool $fill = false, bool $reseth = false, bool $cell = false, string $align = ''): staticwriteHtmlCell()
Render HTML trong cell hình chữ nhật có vị trí:
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): staticTag 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ính | Giá trị ví dụ |
|---|---|
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 |
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
widthtrê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 đủ
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ướcwriteHtml()— 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.