Я создаю большую таблицу HTML, и у меня проблема с разрывами страниц, как вы можете видеть на следующем изображении:
Есть ли способ решить проблему автоматически? Или как это сделать?
Попробуйте добавить это к тэгам <tr>
: nobr="true"
.
Поэтому быстрый пример:
<table> <tr nobr="true"> <td>Test</td> <td>Test 2</td> </tr> </table>
nobr="true"
предотвращает разрыв строк таблицы. Вы также можете поместить это в теги <td>
и <th>
.
Я знаю, что это довольно старый вопрос, но сегодня у меня была такая же проблема, моя таблица была разделена между страницами, и я немного изучил метод из ответа FastTrack, и оказалось, что вы также можете использовать атрибут nobr="true"
также к тегу <table>
. То есть для меня такой код решил эту проблему:
<table nobr="true"> <tr> <td>Test</td> <td>Test 2</td> </tr> </table>
Предупреждение. Этот код имеет смысл только тогда, когда ваши таблицы меньше одной страницы.
У меня была та же проблема с перекрывающимися заголовками. Я попробовал решение yevgeny, но для этого потребовалось еще несколько выпусков для моего кода генератора PDF (у меня есть много выходных файлов PDF, написанных в FPDF, и я хотел свести к минимуму процесс их изменения в TCPDF), поэтому я использовал это более простое решение
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()); } }
Для заинтересованного, просто сделайте следующее и это будет работать как шарм:
$pdf->SetMargins(0, 0, 0); $pdf->SetHeaderMargin(0); $pdf->SetFooterMargin(0);
roney, большое вам спасибо, написав HTML сгенерированные перекрытия с заголовком для страниц 2,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 } }
в вашем коде
// set top margin to style pages 2, 3.. $pdf->SetMargins(15, $pdf->top_margin, 15);
Как ни странно, упомянутые здесь решения не сработали для меня. Ну, он сделал sortof, но содержимое внутри тегов будет повторяться (по желанию), но затем вызовет проблемы макета для ячейки выше или ниже, если она была запланирована для строк. Как я экспериментировал, это только ухудшилось.
Мое решение, в то время как неэлегантное, заключалось в том, чтобы установить AutoPageBreak в значение false, поместите счетчик строк в счетчик вверх, увеличивая для каждой строки, затем проверив, превысило ли оно определенное значение. Если это так, я закрыл таблицу, использовал writeHTML (), вызвал addPage (), а затем продолжил, перестроив ее как новую таблицу, заголовки и все.
Как я сказал, неэлегантно, но это сработало. Надеюсь, это поможет кому-то … это довольно очевидное решение, но исполнение не всегда так очевидно. Кроме того, может быть лучший способ, который работает для вашей конкретной ситуации, но если это не так, попробуйте. 🙂
Некоторые CSS решили для меня:
// 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 //============================================================+
ты пробовал
<table> <thead> <tr> <td> This is my header which appears on every page </td> </tr> </thead> <tr> <td> My Content </td> </tr> </table>
Я использую smarty, у вас есть больше возможностей вручную разбить таблицу (например, если вы используете границы). Если нужно, я тоже опубликую это …