J'utilise TCPDF pour générer le PDF dans l'un de mes projets. Je crée simplement un fichier HTML et le donne à TCPDF pour gérer la génération PDF. Mais maintenant, j'ai un peu de HTML où plusieurs certificats sont ajoutés les uns après les autres et je veux avoir un saut de page dedans. Le saut de page doit être décidé par HTML, c’est-à-dire que je veux savoir s’il existe un identifiant en HTML que TCPDF comprend et ajoute en conséquence un saut de page au fichier PDF généré.
Comment pourrais-je faire ça?
J'utilise <br pagebreak="true"/>
.
Méthode Find writeHTML et code
if ($dom[$key]['tag'] AND isset($dom[$key]['attribute']['pagebreak'])) {
// check for pagebreak
if (($dom[$key]['attribute']['pagebreak'] == 'true') OR ($dom[$key]['attribute']['pagebreak'] == 'left') OR ($dom[$key]['attribute']['pagebreak'] == 'right')) {
// add a page (or trig AcceptPageBreak() for multicolumn mode)
$this->checkPageBreak($this->PageBreakTrigger + 1);
}
if ((($dom[$key]['attribute']['pagebreak'] == 'left') AND (((!$this->rtl) AND (($this->page % 2) == 0)) OR (($this->rtl) AND (($this->page % 2) != 0))))
OR (($dom[$key]['attribute']['pagebreak'] == 'right') AND (((!$this->rtl) AND (($this->page % 2) != 0)) OR (($this->rtl) AND (($this->page % 2) == 0))))) {
// add a page (or trig AcceptPageBreak() for multicolumn mode)
$this->checkPageBreak($this->PageBreakTrigger + 1);
}
}
Vous pouvez utiliser la méthode AddPage () de TCPDF en combinaison avec explode () et un délimiteur approprié:
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8',
false);
// TCPDF initialization code (...)
$delimiter = '<h1>';
$html = file_get_contents('./test.html');
$chunks = explode($delimiter, $html);
$cnt = count($chunks);
for ($i = 0; $i < $cnt; $i++) {
$pdf->writeHTML($delimiter . $chunks[$i], true, 0, true, 0);
if ($i < $cnt - 1) {
$pdf->AddPage();
}
}
// Reset pointer to the last page
$pdf->lastPage();
// Close and output PDF document
$pdf->Output('test.pdf', 'I');
J'ai essayé d'utiliser
<br pagebreak="true" />
ou
<tcpdf method="AddPage" />
chacune d’elles n’a pas pour effet de créer une nouvelle page en haut de la page, mais d’ajouter tout l’espace vide d’une page A4 entre le texte HTML. Donc, si le texte se termine au milieu de la page et qu'un saut de page est inséré, le nouveau texte est écrit au milieu de la page suivante. Ce que je ne voulais pas.
Ce qui a fonctionné était ceci (trouvé ici TCPDF forçant une nouvelle page ):
$pdf->writeHTML($content, true, 0, true, 0);
$pdf->AddPage();
$pdf->setPage($pdf->getPage());
Cela commence maintenant par la rédaction de texte en haut de la page.
Avec la version 5.9.142 du 2011-12-23, nous pourrions utiliser les propriétés page-break-before, page-break-inside
css, comme ceci:
<div style="page-break-inside:avoid;">
some non breakable text
</div>
TCPDF prend en charge l'attribut 'pagebreak' des balises HTML et des propriétés CSS 'page-break-before' et 'page-break-after' . Par exemple, vous pouvez utiliser <br pagebreak="true" />
.
Consultez le site officiel http://www.tcpdf.org et des forums pour plus d’informations.
Selon http://www.tcpdf.org/examples/example_049.phps vous pouvez utiliser quelque chose comme ceci
$html .= '<tcpdf method="AddPage" /><h2>Graphic Functions</h2>';
Vous devez vérifier que le paramètre K_TCPDF_CALLS_IN_HTML dans le fichier de configuration TCPDF est vrai.
Donner à votre élément la propriété page-break-after
, page-break-before
ou page-break-inside
via CSS appliquera l'attribut pagebreak
ou pagebreakafter
à la balise html pendant l'exécution de TCPDF.
// page-break-inside
if (isset($dom[$key]['style']['page-break-inside']) AND ($dom[$key]['style']['page-break-inside'] == 'avoid')) {
$dom[$key]['attribute']['nobr'] = 'true';
}
// page-break-before
if (isset($dom[$key]['style']['page-break-before'])) {
if ($dom[$key]['style']['page-break-before'] == 'always') {
$dom[$key]['attribute']['pagebreak'] = 'true';
} elseif ($dom[$key]['style']['page-break-before'] == 'left') {
$dom[$key]['attribute']['pagebreak'] = 'left';
} elseif ($dom[$key]['style']['page-break-before'] == 'right') {
$dom[$key]['attribute']['pagebreak'] = 'right';
}
}
// page-break-after
if (isset($dom[$key]['style']['page-break-after'])) {
if ($dom[$key]['style']['page-break-after'] == 'always') {
$dom[$key]['attribute']['pagebreakafter'] = 'true';
} elseif ($dom[$key]['style']['page-break-after'] == 'left') {
$dom[$key]['attribute']['pagebreakafter'] = 'left';
} elseif ($dom[$key]['style']['page-break-after'] == 'right') {
$dom[$key]['attribute']['pagebreakafter'] = 'right';
}
}
Vous pouvez également suivre cette méthode pour répondre à vos besoins:
$htmlcontent1="CERTIFICATE NUMBER 1 IMAGE HERE";
// output the HTML content
$pdf->writeHTML($htmlcontent1, true, 0, true, 0);
// reset pointer to the last page
$pdf->lastPage();
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Print a table
// add a page
$pdf->AddPage();
$htmlcontent1="CERTIFICATE NUMBER 1 IMAGE HERE";
// output the HTML content
$pdf->writeHTML($htmlcontent1, true, 0, true, 0);
// reset pointer to the last page
$pdf->lastPage();
// ---------------------------------------------------------
//Close and output PDF document
$pdf->Output('textcertificate.pdf', 'D');
J'espère que ça aide quelqu'un :)
Merci