Tables
Create professional tables using TCPDF-Next's writeHtml() method. It supports <thead>, <tbody>, <tfoot>, colspan, rowspan, and inline CSS.
Full Example
<?php
declare(strict_types=1);
require __DIR__ . '/vendor/autoload.php';
use TcpdfNext\Document;
$html = <<<'HTML'
<style>
table { width: 100%; border-collapse: collapse; }
th {
background-color: #1a2634;
color: #ffffff;
padding: 8px;
font-size: 10pt;
}
td {
padding: 6px 8px;
border-bottom: 1px solid #dee2e6;
font-size: 10pt;
}
tr:nth-child(even) { background-color: #f8f9fa; }
.right { text-align: right; }
.center { text-align: center; }
.total {
background-color: #1a2634;
color: #ffffff;
font-weight: bold;
}
</style>
<table border="1" cellpadding="5">
<thead>
<tr>
<th>SKU</th>
<th>Product</th>
<th class="center">Qty</th>
<th class="right">Unit Price</th>
<th class="right">Subtotal</th>
</tr>
</thead>
<tbody>
<tr>
<td>WDG-001</td>
<td>Precision Widget</td>
<td class="center">120</td>
<td class="right">$24.99</td>
<td class="right">$2,998.80</td>
</tr>
<tr>
<td>GDG-042</td>
<td>Gadget Pro</td>
<td class="center">85</td>
<td class="right">$49.95</td>
<td class="right">$4,245.75</td>
</tr>
<tr>
<td>SPR-007</td>
<td>Spring Assembly Kit</td>
<td class="center">340</td>
<td class="right">$12.50</td>
<td class="right">$4,250.00</td>
</tr>
</tbody>
<tfoot>
<tr class="total">
<td colspan="4" class="right">Grand Total</td>
<td class="right">$11,494.55</td>
</tr>
</tfoot>
</table>
HTML;
Document::create()
->setTitle('Product Inventory')
->addPage()
->setFont('helvetica', size: 10)
->writeHtml($html)
->save(__DIR__ . '/tables.pdf');
echo 'PDF created.' . PHP_EOL;colspan and rowspan
Merge cells horizontally with colspan and vertically with rowspan, exactly like standard HTML:
$html = <<<'HTML'
<table border="1" cellpadding="6" style="width:100%;">
<tr style="background:#1a2634; color:#fff; font-weight:bold;">
<th colspan="4" style="text-align:center;">Quarterly Sales Report</th>
</tr>
<tr style="background:#2c3e50; color:#fff;">
<th>Quarter</th>
<th>Product A</th>
<th>Product B</th>
<th>Total</th>
</tr>
<tr>
<td>Q1</td>
<td class="right">$120,000</td>
<td class="right">$85,000</td>
<td class="right" style="font-weight:bold;">$205,000</td>
</tr>
<tr style="background:#f5f7fa;">
<td>Q2</td>
<td class="right">$135,000</td>
<td class="right">$92,000</td>
<td class="right" style="font-weight:bold;">$227,000</td>
</tr>
<tr>
<td rowspan="2" style="vertical-align:middle;">H2</td>
<td class="right">$148,000</td>
<td class="right">$103,000</td>
<td class="right" style="font-weight:bold;">$251,000</td>
</tr>
<tr>
<td class="right">$162,000</td>
<td class="right">$118,000</td>
<td class="right" style="font-weight:bold;">$280,000</td>
</tr>
<tr style="background:#1a2634; color:#fff; font-weight:bold;">
<td>Annual</td>
<td colspan="2" style="text-align:center;">--</td>
<td class="right">$963,000</td>
</tr>
</table>
HTML;
Document::create()
->setTitle('Quarterly Sales')
->addPage()
->setFont('helvetica', size: 10)
->writeHtml($html)
->save(__DIR__ . '/sales-report.pdf');Key Concepts
writeHtml()
writeHtml(string $html): static renders HTML directly into the PDF. Supported table elements: <table>, <thead>, <tbody>, <tfoot>, <tr>, <th>, <td>.
Inline CSS Support
The following CSS properties work inside writeHtml():
| Property | Example |
|---|---|
background-color | #1a2634, rgb(26,38,52) |
color | #ffffff |
font-weight | bold |
text-align | left, center, right |
padding | 6px 8px |
border-bottom | 1px solid #dee2e6 |
width | 100%, 60mm |
vertical-align | middle, top, bottom |
Page Layout
On an A4 page with default 10 mm margins, the printable width is approximately 190 mm. Setting width: 100% on the table fills this entire area.
Output
The first example produces a single-page PDF with a dark-header inventory table, alternating row colors, right-aligned currency columns, and a colspan-based grand total footer.