I'm generating a PDF from HTML using mPDF, and when the document contains a large amount of content, an almost blank first page is added unexpectedly. This only happens with longer documents — shorter ones work fine.
That is function generating PDF:
private function getMPDF($filename = null) { $mpdf = $this->mpdfInit(); $mpdf->charset_in = 'utf-8'; $mpdf->SetTopMargin(33); $mpdf->WriteHTML($this->html); if ($filename === null) { return $mpdf->Output('', "S"); } else { $mpdf->Output($filename, "F"); } } The $this->html contains HTML with multiple nested tags and paragraphs, such as this:
<table style="width: 700px;" border="0"> <tbody> <tr> <td style="width: 432px;"> </td> <td style="width: 225px; padding-top: 8px;"> <p style="font-size: 13px; font-family: Arial;">Pani<br />[IMIĘ I NAZWISKO]<br />[ADRES]<br />[KOD POCZTOWY] [MIASTO]</p> </td> <td style="width: 43px;"> </td> </tr> </tbody> </table> <p> </p> <table style="text-align: justify; width: 700px;" border="0"> <tbody> <tr> <td style="width: 50px;"> </td> <td style="width: 600px;"> <p style="font-size: 13px; font-family: Arial;">[DATA]</p> <p> </p> <p style="font-size: 15px; font-family: Georgia;">Dotyczy zgłoszenia o numerze [NUMER_ZGŁOSZENIA] z dnia [DATA]; przedmiot: [NAZWA_SPRZĘTU]; numer dokumentu: [NUMER_DOKUMENTU].</p> <p> </p> <p> </p> <p style="font-size: 13px; font-family: Arial;">Szanowna Pani,</p> <p> </p> <p style="font-size: 13px; font-family: Arial;">Informujemy, że po analizie dostępnych informacji nie stwierdzono przesłanek do pozytywnego rozpatrzenia zgłoszenia.<br /><br />Na podstawie przeprowadzonych czynności ustalono, że nie wystąpiły okoliczności, które uzasadniałyby dalsze działanie.</p> <br /> <p style="font-size: 13px; font-family: Arial;">Podjęta decyzja wynika z:</p> <p style="font-size: 13px; font-family: Arial;">- informacji zebranych podczas zgłoszenia<br />- analizy technicznej<br /><br />Zgłoszony opis: brak ładowania, pęknięcie plastiku, brak aktywacji systemu. Wskazana data: [DATA].<br /><br />W wyniku analizy technicznej stwierdzono mechaniczne uszkodzenie elementów: <br />- bateria cmos<br />- osłona zawiasów<br /><br /><br />Stwierdzono również, że niektóre elementy uległy naturalnemu zużyciu, co nie stanowi podstawy do dalszego działania w tym zakresie.</p> <p> </p> <p style="font-size: 13px; font-family: Arial;">W związku z powyższym brak jest podstaw do zmiany stanowiska. </p> </td> <td> </td> </tr> <tr> <td style="width: 50px;"> </td> <td style="width: 600px;"> <p style="font-size: 13px; font-family: Arial;"><br />Informujemy o możliwości przekazania sprawy do niezależnych instytucji oraz skorzystania z dostępnych środków odwoławczych. Sprawa może być również rozpatrzona przez sąd właściwy miejscowo zgodnie z obowiązującymi przepisami.</p> </td> <td style="width: 50px;"> </td> </tr> <tr> <td style="width: 50px;"> </td> <td style="vertical-align: top; text-align: justify; width: 600px;"> <p style="font-size: 13px; font-family: Arial;"><br />Sprawy sporne mogą być również rozpatrywane w drodze pozasądowego postępowania przed wyznaczonymi instytucjami, zgodnie z obowiązującymi przepisami prawa.</p> </td> <td style="width: 50px;"> </td> </tr> <tr> <td style="width: 50px;"> </td> <td style="text-align: justify;"> <p style="font-size: 13px; font-family: Arial;">[NAZWA INSTYTUCJI] jest administratorem danych, które są przetwarzane zgodnie z obowiązującymi przepisami. Kontakt z Inspektorem Ochrony Danych możliwy jest za pośrednictwem formularza na stronie [STRONA], pisemnie lub mailowo: iod@[DOMENA].pl. Szczegóły dostępne są również pod numerem telefonu [NUMER].</p> <p style="font-size: 13px; font-family: Arial;"><br /><br />Z wyrazami szacunku</p> <br /> <p style="font-size: 13px; font-family: Arial;">[IMIĘ I NAZWISKO]<br /> <img src="[ZDJĘCIE]" alt="" width="190" /> <br />Główny Specjalista<br />[DZIAŁ]</p> </td> <td style="width: 50px;"> </td> </tr> </tbody> </table> After debugging, I noticed the issue seems to be related to the table element. When I remove the table (or extract all its content before rendering), the blank page disappears — but this breaks other documents, so it's not a viable solution.
I also tried modifying margins and adding CSS to control page breaks:
table { page-break-inside: auto; } tr { page-break-inside: avoid; } thead { display: table-header-group; } tbody { display: table-row-group; }