TCPDF: HTML-таблица и разрывы страниц - PullRequest
25 голосов
/ 01 мая 2011

Я создаю большую таблицу HTML, и у меня проблема с разрывами страниц, как вы можете видеть на следующем рисунке:
enter image description here
Существует ли метод для автоматического решения проблемы?Или как это сделать?

Ответы [ 8 ]

67 голосов
/ 02 октября 2012

Попробуйте добавить это к своим <tr> тегам: nobr="true".

Итак, быстрый пример будет:

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

nobr="true" предотвращает разрыв строк в таблице. Вы также можете поставить это на теги <td> и <th>.

9 голосов
/ 10 октября 2014

Я знаю, что это довольно старый вопрос, но у меня была такая же проблема сегодня, моя таблица была разделена между страницами, и я немного подробнее изучил метод из ответа FastTrack, и оказалось, что вы также можете использовать nobr="true" приписать также тегу <table>. То есть для меня такой код решил эту проблему:

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

Предупреждение - этот код имеет смысл, только если ваши таблицы меньше одной страницы.

7 голосов
/ 13 марта 2013

У меня была такая же проблема с перекрывающимися заголовками. Я попробовал Евгений решение, но для этого потребовалось еще несколько редакций моего кода генератора 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());
    }
}
2 голосов
/ 05 июля 2011

Рони, большое спасибо, написание сгенерированного 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); 
1 голос
/ 12 августа 2011

Как ни странно, упомянутые здесь решения не сработали для меня. Что ж, это сделало sortof, но содержимое внутри тегов будет повторяться (по желанию), но затем будет вызывать проблемы с разметкой для ячейки выше или ниже, если она будет перекрыта строкой. Пока я экспериментировал, стало только хуже.

Мое решение, хотя и не элегантное, состояло в том, чтобы установить для AutoPageBreak значение false, увеличить счетчик инкремента строки, увеличивая значение для каждой строки, а затем проверяя, превысило ли оно определенное значение. Если это так, я закрыл таблицу, использовал writeHTML (), вызвал addPage (), а затем продолжил, перестроив его как новую таблицу, заголовки и все.

Как я уже сказал, не элегантно, но это сработало. Надеюсь, это кому-нибудь поможет ... это довольно очевидное решение, но исполнение не всегда так очевидно. Кроме того, может быть лучший способ, который подходит для вашей конкретной ситуации, но если это не так, попробуйте мой. :)

1 голос
/ 01 мая 2011

Для заинтересованных, просто сделайте следующее, и это будет работать как шарм:

$pdf->SetMargins(0, 0, 0);
$pdf->SetHeaderMargin(0);
$pdf->SetFooterMargin(0);
0 голосов
/ 13 ноября 2013

Некоторые 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
//============================================================+
0 голосов
/ 13 июля 2012

вы пробовали

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

Я использую smarty, с этим у вас больше возможностей вручную разбить таблицу (например, если вы используете границы).Если нужно, я тоже выложу ...

...