web-dev-qa-db-fra.com

Saut de page manuel dans TCPDF

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?

35
swapnilsarwe

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);
    }
}
67
AmdY

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');
16
mermshaus

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.

10
jazkat

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>
7
igor.scabini

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.

7
user412934

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.

2
Salvador Orteu

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';
    }
}
0
cossacksman

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

0
Mohsin