TCPDF中如何进行手动分页?

43

我在一个项目中使用TCPDF来生成PDF。我只需创建一个HTML文件并将其交给TCPDF处理PDF生成。但现在我有一些包含多个证书的HTML,这些证书一个接一个地添加,我想在其中加入分页。分页应该由HTML决定,即我想知道HTML中是否有TCPDF可以理解的标识符,然后相应地将分页添加到生成的PDF中。

我该如何实现这一点?

9个回答

92

我正在使用<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);
    }
}

19

您可以使用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');

16

我尝试使用

<br pagebreak="true" />
或者
<tcpdf method="AddPage" />
每个页面之间应该是空的A4纸张。如果文本在页面中间结束并插入页面分隔符,则新文本将从下一页的中间开始书写。这不是我想要的。
以下方法有效(在此处找到:TCPDF forcing a new page):
$pdf->writeHTML($content, true, 0, true, 0);

$pdf->AddPage();
$pdf->setPage($pdf->getPage());  

现在开始在页面顶部编写文本。


为了使tcpdf标签起作用,您必须设置定义define('K_TCPDF_CALLS_IN_HTML', true); - Guilherme Sampaio

10
对于仍然遇到page-break TCPDF库问题的人,你可以在HTML内容中使用以下方式手动分页:<div style="page-break-before:always"></div> 或者 <br pagebreak="true"/>。同时,你也可以在代码中使用 $tcpdf->AddPage() 来手动分页。当你设置 SetAutoPageBreak(TRUE, 10); 时,这意味着:当文档高度达到(底部-10)时,将把光标移动到新页面。因此,如果你想要更多空间,只需将数字减少到0。它将绘制整个文档,没有任何来自底部的边距。请记住,TCPDF仅接受双引号(")作为标签属性。不要在标签中使用单引号(')。

10

TCPDF支持HTML标签的“pagebreak”属性及CSS属性“page-break-before”和“page-break-after”。 例如,您可以使用<br pagebreak="true" />

请参阅官方http://www.tcpdf.org网站和论坛获取更多信息。


8

从2011-12-23版本的5.9.142开始,我们可以使用page-break-before, page-break-inside这两个CSS属性,用法如下:

<div style="page-break-inside:avoid;">
some non breakable text
</div>

我该如何在TCPDF版本4.6.016中使用这个东西?因为我的项目太旧了,无法更改TCPDF的版本。所以你有没有任何想法,在TCPDF旧版本"4.6.016"中使用这个属性"page-break-inside:avoid;"? - Bhavin Thummar

4
根据http://www.tcpdf.org/examples/example_049.phps,你可以使用类似以下的内容。
$html .= '<tcpdf method="AddPage" /><h2>Graphic Functions</h2>';

您需要验证TCPDF配置文件中的参数K_TCPDF_CALLS_IN_HTML是否为true。


这对我来说是最简单的。只需添加define('K_TCPDF_CALLS_IN_HTML', true);就可以了。 - Guilherme Sampaio

0

您也可以按照这种方法来满足您的需求:

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

希望能对某些人有所帮助:)
谢谢。

0
通过CSS为您的元素设置page-break-afterpage-break-beforepage-break-inside属性,将在TCPDF运行时将属性pagebreakpagebreakafter应用于HTML标记。
// 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';
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接