TCPDF: tableau HTML et sauts de page

je crée une grande table HTML et j'ai des problèmes avec les sauts de page comme vous pouvez le voir dans l'image suivante:

enter image description here

Est-il une méthode pour régler le problème automatiquement? Ou ce qui est la façon de le faire?

23
demandé sur user3335966 2011-05-01 07:08:56

8 réponses

Essayez d'ajouter ceci à votre <tr> tags:nobr="true".

donc un exemple rapide serait:

<table>
    <tr nobr="true">
        <td>Test</td>
        <td>Test 2</td>
    </tr>
</table>

nobr="true" empêche les rangées de tableaux de se désagréger. Vous pouvez aussi le mettre sur les <td> et <th> balises.

61
répondu FastTrack 2012-10-02 14:46:33

je sais que c'est une question assez ancienne, mais j'ai eu ce même problème aujourd'hui, ma table a été divisée entre les pages et j'ai enquêté un peu plus loin sur la méthode de la réponse de FastTrack et il s'est avéré que vous pouvez également utiliser le nobr="true" attribut <table> balise. C'est, pour moi, ce code a résolu ce problème:

<table nobr="true">
    <tr>
        <td>Test</td>
        <td>Test 2</td>
    </tr>
</table>

avertissement-ce code n'a de sens que lorsque vos tables sont plus petites qu'une page.

8
répondu Artur Karczmarczyk 2014-10-10 14:20:06

j'ai eu le même problème avec les en-têtes se chevauchant. J'ai essayé la solution de yevgeny, mais cela a demandé quelques éditions supplémentaires à mon code de générateur PDF (j'ai beaucoup de sorties PDFs écrites en FPDF et je voulais minimiser le processus de miograting eux à TCPDF), donc j'ai utilisé cette solution plus simple

class MYPDF extenfs TCPDF {
    //your initialization code
    function header(){
        //your code here

        //we change only the top margin and this executes for every header in every page, even the frst one
        $this->SetTopMargin($this->GetY());
    }
}
6
répondu Federico Giraldi 2013-03-13 14:13:11

pour les intéressés, il suffit de faire comme suit et cela fonctionnera comme un charme:

$pdf->SetMargins(0, 0, 0);
$pdf->SetHeaderMargin(0);
$pdf->SetFooterMargin(0);
1
répondu roney 2011-05-01 04:03:51

roney, je vous remercie beaucoup, l'écriture de code HTML généré des chevauchements avec l'en-tête pour les pages 2 et 3 .. cela a fonctionné pour moi:

class your_PDF extends TCPDF
{
   var $top_margin = 20;

   function Header() {
       // set top margin to style pages 2, 3..
       //title goes here
       $this->top_margin = $this->GetY() + 5; // padding for second page
    }
}

dans votre code

// set top margin to style pages 2, 3..
$pdf->SetMargins(15, $pdf->top_margin, 15); 
1
répondu yevgeny 2011-07-05 20:22:45

étrangement, les solutions mentionnées ici n'ont pas fonctionné pour moi. Eh bien, il a fait sortof, mais le contenu à l'intérieur des étiquettes serait répété (comme désiré) mais causerait alors des problèmes de mise en page pour la cellule ci-dessus ou ci-dessous si elle a été rowspanned. Comme je l'ai expérimenté, il a juste obtenu de pire en pire.

ma solution, bien qu'inélégante, était de mettre AutoPageBreak à false, mettre un compteur incrementer ligne, incrementing pour chaque ligne, puis vérifié si elle avait dépassé une certaine valeur. Si oui, j'ai fermé la table, utilisé writeHTML (), appelé addPage () et puis continué, après l'avoir reconstruit comme une nouvelle table, headers et tout.

comme je l'ai dit, inélégant, mais ça a marché. J'espère que cela aide quelqu'un ... c'est une solution assez évidente, mais l'exécution n'est pas toujours aussi évidente. En outre, il peut y avoir une meilleure façon qui fonctionne pour votre situation particulière, mais si elle ne fonctionne pas, donner le mien un essai. :)

1
répondu David 2011-08-12 09:28:37

un peu de CSS résolu pour moi:

// Include the main TCPDF library (search for installation path).
require_once('tcpdf/tcpdf.php');

// create new PDF document
$pdf = new TCPDF('R', PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);

// set document information
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetAuthor('Author');
$pdf->SetTitle('TCPDF HTML Table');
$pdf->SetSubject('TCPDF Tutorial');
$pdf->SetKeywords('TCPDF, PDF, html,table, example, test, guide');

// set default header data
$pdf->SetHeaderData('', '', ' HTML table', '');

// set header and footer fonts
$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));

// set default monospaced font
//$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
// set margins
$pdf->SetMargins(15, 15, 15);
$pdf->SetHeaderMargin(15);
$pdf->SetFooterMargin(15);

// set auto page breaks
$pdf->SetAutoPageBreak(TRUE, 15);

// set image scale factor
//$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
// ---------------------------------------------------------
// set font
$pdf->SetFont('times', '', 10);

// add a page
$pdf->AddPage();

$start = 1;
$end = 254;
$step = 1;

$arr = range($start, $end, $step);


$table_header .= sprintf("<tr><th>%s</th><th>%s</th><th>%s</th><th>%s</th></tr>", 'IP', 'Computer', 'User', 'Fone');

foreach ($arr as $ar) {
    $row[] = $ar;
}
foreach ($row as $r):
    if (($r % 40) === 0):
        $table_header;
    endif;
    $table .= sprintf("<tr>\n<td>%s</td>\n<td>%s</td>\n<td>%s</td>\n<td>%s</td>\n</tr>\n", $r, $r, $r, $r);
endforeach;

$now = date("d/m/Y");
$caption = "<caption>IP addresses <em>$now</em></caption>\n";
$n = "\n";

$tbl = <<<EOD
<style>
table{
    font-family: serif;
    font-size: 11pt;
}
table tr {

}
table tr td {
    padding:3px;
    border:#000000 solid 1px;
}
em {
    font-size: 4pt;
}
tr { white-space:nowrap; }
</style>

        <h1>{$caption}</h1>
        {$table_begin}
        {$table_header}
        {$table}
</table>
EOD;

$pdf->writeHTML($tbl, true, false, false, false, '');


// reset pointer to the last page
//$pdf->lastPage();
// ---------------------------------------------------------
//Close and output PDF document
$pdf->Output('html_table.pdf', 'I');

//============================================================+
// END OF FILE
//============================================================+
0
répondu tenshimsm 2013-11-12 22:30:21

avez-vous essayé

<table>
<thead>
    <tr>
        <td>
            This is my header which appears on every page
        </td>
    </tr>
</thead>
<tr>
    <td>
        My Content
    </td>
</tr>
</table>

j'utilise smarty, avec cela vous avez plus de possibilités de casser manuellement la table (par exemple si vous utilisez des bordures). Si nécessaire, je vais le poster aussi...

-1
répondu manuxi 2012-07-13 09:29:31