Ручная разметка страницы в TCPDF
Я использую TCPDF для создания PDF в одном из моих проектов. Я просто создаю HTML файл и передаю его TCPDF для обработки генерации PDF. Но теперь у меня есть HTML, где несколько сертификатов добавляются один за другим, и я хочу, чтобы в нем был разрыв страницы. Разрыв страницы должен решаться с помощью HTML, т.е. Я хочу знать, есть ли какой-либо идентификатор в HTML, который TCPDF понимает, а затем соответственно добавляет разрыв страницы в сгенерированный PDF.
Как я могу это сделать?
Ответы
Ответ 1
Я использую <br pagebreak="true"/>
.
Найти метод writeHTML и код
if ($dom[$key]['tag'] AND isset($dom[$key]['attribute']['pagebreak'])) {
// check for pagebreak
if (($dom[$key]['attribute']['pagebreak'] == 'true') OR ($dom[$key]['attribute']['pagebreak'] == 'left') OR ($dom[$key]['attribute']['pagebreak'] == 'right')) {
// add a page (or trig AcceptPageBreak() for multicolumn mode)
$this->checkPageBreak($this->PageBreakTrigger + 1);
}
if ((($dom[$key]['attribute']['pagebreak'] == 'left') AND (((!$this->rtl) AND (($this->page % 2) == 0)) OR (($this->rtl) AND (($this->page % 2) != 0))))
OR (($dom[$key]['attribute']['pagebreak'] == 'right') AND (((!$this->rtl) AND (($this->page % 2) != 0)) OR (($this->rtl) AND (($this->page % 2) == 0))))) {
// add a page (or trig AcceptPageBreak() for multicolumn mode)
$this->checkPageBreak($this->PageBreakTrigger + 1);
}
}
Ответ 2
Вы можете использовать метод TCPDF AddPage() в сочетании с explode() и подходящим разделителем:
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8',
false);
// TCPDF initialization code (...)
$delimiter = '<h1>';
$html = file_get_contents('./test.html');
$chunks = explode($delimiter, $html);
$cnt = count($chunks);
for ($i = 0; $i < $cnt; $i++) {
$pdf->writeHTML($delimiter . $chunks[$i], true, 0, true, 0);
if ($i < $cnt - 1) {
$pdf->AddPage();
}
}
// Reset pointer to the last page
$pdf->lastPage();
// Close and output PDF document
$pdf->Output('test.pdf', 'I');
Ответ 3
TCPDF поддерживает атрибут "pagebreak" для HTML-тегов и свойств CSS "перерыв страницы перед" и "перерыв страницы".
Например, вы можете использовать <br pagebreak="true" />
.
Для получения дополнительной информации посетите официальный веб-сайт http://www.tcpdf.org.
Ответ 4
Я попытался использовать
<br pagebreak="true" />
или
<tcpdf method="AddPage" />
каждый из них привел к тому, что не начиналась новая страница в верхней части страницы, а добавлялась полная пробел A4-страницы между текстом HTML. Поэтому, если текст закончился в середине страницы, а затем был взломан разрыв страницы, новый текст был написан с середины следующей страницы. Который я не хотел.
Что сработало, так это (нашел здесь TCPDF, заставляющий новую страницу):
$pdf->writeHTML($content, true, 0, true, 0);
$pdf->AddPage();
$pdf->setPage($pdf->getPage());
Теперь это начинается с написания текста в верхней части страницы.
Ответ 5
С версией 5.9.142 от 2011-12-23 мы могли бы использовать свойства page-break-before, page-break-inside
css, например:
<div style="page-break-inside:avoid;">
some non breakable text
</div>
Ответ 6
В соответствии с http://www.tcpdf.org/examples/example_049.phps вы можете использовать что-то вроде этого
$html .= '<tcpdf method="AddPage" /><h2>Graphic Functions</h2>';
Вам нужно проверить, что параметр K_TCPDF_CALLS_IN_HTML в файле конфигурации TCPDF является истинным.
Ответ 7
Вы также можете следовать этому методу, чтобы выполнить ваши потребности:
$htmlcontent1="CERTIFICATE NUMBER 1 IMAGE HERE";
// output the HTML content
$pdf->writeHTML($htmlcontent1, true, 0, true, 0);
// reset pointer to the last page
$pdf->lastPage();
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Print a table
// add a page
$pdf->AddPage();
$htmlcontent1="CERTIFICATE NUMBER 1 IMAGE HERE";
// output the HTML content
$pdf->writeHTML($htmlcontent1, true, 0, true, 0);
// reset pointer to the last page
$pdf->lastPage();
// ---------------------------------------------------------
//Close and output PDF document
$pdf->Output('textcertificate.pdf', 'D');
Надеюсь, это поможет кому-то:)
Спасибо
Ответ 8
Предоставление вашему элементу свойства page-break-after
, page-break-before
или page-break-inside
с помощью CSS будет применять атрибут pagebreak
или pagebreakafter
к тегу html во время выполнения TCPDF.
// page-break-inside
if (isset($dom[$key]['style']['page-break-inside']) AND ($dom[$key]['style']['page-break-inside'] == 'avoid')) {
$dom[$key]['attribute']['nobr'] = 'true';
}
// page-break-before
if (isset($dom[$key]['style']['page-break-before'])) {
if ($dom[$key]['style']['page-break-before'] == 'always') {
$dom[$key]['attribute']['pagebreak'] = 'true';
} elseif ($dom[$key]['style']['page-break-before'] == 'left') {
$dom[$key]['attribute']['pagebreak'] = 'left';
} elseif ($dom[$key]['style']['page-break-before'] == 'right') {
$dom[$key]['attribute']['pagebreak'] = 'right';
}
}
// page-break-after
if (isset($dom[$key]['style']['page-break-after'])) {
if ($dom[$key]['style']['page-break-after'] == 'always') {
$dom[$key]['attribute']['pagebreakafter'] = 'true';
} elseif ($dom[$key]['style']['page-break-after'] == 'left') {
$dom[$key]['attribute']['pagebreakafter'] = 'left';
} elseif ($dom[$key]['style']['page-break-after'] == 'right') {
$dom[$key]['attribute']['pagebreakafter'] = 'right';
}
}
Ответ 9
Используйте для разбиения на страницы в содержимом html.