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:
Est-il une méthode pour régler le problème automatiquement? Ou ce qui est la façon de le faire?
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.
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.
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());
}
}
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);
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);
é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. :)
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
//============================================================+
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...