Search code examples
htmlcssdompdf

Dompdf: Force table row to split across 2 pages


I am using "dompdf/dompdf": "^0.8.3" for PDF print.

I have a simple table with rows tds with big text content... For ex:

<!DOCTYPE html>
<html>

<head>
</head>

<body>
    <table>
        <thead>
            <tr>
                <th>PRODUCT</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>1-----
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                </td>
            </tr>
            <tr>
                <td>2-----
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                </td>
            </tr>
            <tr>
                <td>3-----
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                </td>
            </tr>
            <tr>
                <td>4-----
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                </td>
            </tr>
            <tr>
                <td>5-----
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                    MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
                </td>
            </tr>
        </tbody>
    </table>
</body>

</html>

enter image description here

When I print it using A4 size page, I would like to have a part of 4th row print in the first page in the available space and then continue to print the rest of the text in the next page. But it seems that all of the 4th row is moved to the second page. Is there any way to force this (using css or through a dompdf setting) as per my requirement?

I have tried the following css for the page breaks:

table {
    page-break-inside: auto;
}

table tr {
    page-break-inside: auto;
}

table tr td {
    page-break-inside: auto;
}

But they never have helped me to split a row between 2 pages.

Thanks for your quick feedback..

Cheers!!


Solution

  • Dompdf (currently at 0.8.3 as of this post) does not support splitting table rows across pages. This is a long-standing issue with Dompdf (ref https://github.com/dompdf/dompdf/issues/98).

    Your particular content, if it follows the sample you provided, does not really look to need a table structure since it only has one cell per row. You could fairly well replicate the structure using simple DIV elements.

    Only gotcha is that table header. If the sample truly reflects your output you could use a page header instead.

    Something along the lines of the following:

    <!DOCTYPE html>
    <html>
    
    <head>
      <style>
        @page { margin-top: 50px; }
        #header { position: fixed; top: -50px; left: 0px; right: 0px; padding: 10px; text-align: center; font-weight: bold; }
      </style>
    </head>
    
    <body>
    
      <div id="header">
        PRODCUT
      </div>
    
      <div>
      1-----
        MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
        MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
        MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
        MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
        MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
        MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
        MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
        MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
        MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
        MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
        MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
        MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
        MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
        MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
        MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
        MCHBMES1 -- MCHBMES1 -- MCHBMES1 -- MCHBMES1 --
      </div>
    
    </body>
    
    </html>