web-dev-qa-db-fra.com

TCPDF: table HTML et sauts de page

Je crée un grand tableau HTML et j'ai un problème de sauts de page, comme vous pouvez le voir dans l'image suivante:
 enter image description here
Existe-t-il une méthode qui règle automatiquement le problème? Ou quel est le moyen de le faire?

24
Koney

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

Donc, un exemple rapide serait:

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

Le nobr="true" empêche les lignes de la table de se séparer. Vous pouvez également le mettre sur les balises <td> et <th>.

64
FastTrack

Je sais que c'est une question plutôt ancienne, mais j'avais le même problème aujourd'hui, mon tableau était divisé en pages et j'ai étudié un peu plus en détail la méthode de la réponse de FastTrack et il s'est avéré que vous pouvez également utiliser l'attribut nobr="true" également pour le <table> étiquette. C'est-à-dire qu'un tel code a résolu ce problème pour moi:

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

Attention, ce code n’a de sens que si vos tableaux ont moins d’une page.

8
Artur Karczmarczyk

J'ai eu le même problème avec les en-têtes qui se chevauchent .. J'ai essayé la solution yevgeny, mais cela nécessitait quelques éditions supplémentaires de mon code générateur PDF les miogrer vers TCPDF), j’ai donc 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());
    }
}
7
Federico Giraldi

roney, merci beaucoup, l’écriture HTML générée chevauche l’en-tête des pages 2, 3, 3

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); 
2
yevgeny

Pour les intéressés, procédez comme suit et cela fonctionnera à merveille:

$pdf->SetMargins(0, 0, 0);
$pdf->SetHeaderMargin(0);
$pdf->SetFooterMargin(0);
1
roney

Curieusement, les solutions mentionnées ici ne m'ont pas fonctionné. En fait, cela s’est fait en quelque sorte, mais le contenu à l’intérieur des balises serait répété (à volonté), mais entraînerait alors des problèmes de mise en page pour la cellule située au-dessus ou au-dessous si elle était dotée de lignes. Comme j'ai expérimenté, ça a juste empiré.

Ma solution, bien qu'inélégante, a été de définir AutoPageBreak sur false, de mettre un compteur d'incrémenteur de ligne vers le haut, une incrémentation pour chaque ligne, puis de vérifier si elle avait dépassé une certaine valeur. Si c'est le cas, j'ai fermé la table, utilisé writeHTML (), appelé addPage (), puis poursuivi, après l'avoir reconstruite sous la forme d'une nouvelle table, d'en-têtes et de tous les autres éléments.

Comme je l'ai dit, inélégant, mais cela a fonctionné. 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 existe peut-être un meilleur moyen qui convient à votre situation particulière, mais dans le cas contraire, essayez-le. :)

1
David

Quelques CSS résolus 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
msmafra