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; }