Подтвердить что ты не робот

TCPDF: разметка HTML и страницы

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Ответ 3

У меня была такая же проблема с перекрывающимися заголовками. Я попробовал решение 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());
    }
}

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

Некоторые 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
//============================================================+

Ответ 8

Вы пробовали

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

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