Skip to content

Tables

Create professional tables using TCPDF-Next's writeHtml() method. It supports <thead>, <tbody>, <tfoot>, colspan, rowspan, and inline CSS.

Full Example

php
<?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:

php
$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():

PropertyExample
background-color#1a2634, rgb(26,38,52)
color#ffffff
font-weightbold
text-alignleft, center, right
padding6px 8px
border-bottom1px solid #dee2e6
width100%, 60mm
vertical-alignmiddle, 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.

Released under the LGPL-3.0-or-later License.