TCPDF 中的手动分页符
Posted
技术标签:
【中文标题】TCPDF 中的手动分页符【英文标题】:Manual Page Break in TCPDF 【发布时间】:2010-12-09 00:24:54 【问题描述】:我正在使用 TCPDF 在我的一个项目中生成 PDF。我只需创建一个 html 文件并将其交给 TCPDF 来处理 PDF 生成。但是现在我有一些 HTML,其中一个接一个地添加了多个证书,我想在其中添加一个分页符。分页符应该由 HTML 决定,即我想知道 HTML 中是否有任何标识符可以被 TCPDF 理解,然后相应地在生成的 PDF 中添加分页符。
我该怎么做?
【问题讨论】:
【参考方案1】:您可以将 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');
【讨论】:
【参考方案2】:你也可以按照这个方法来完成你的需求:
$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');
希望它可以帮助某人:)
谢谢
【讨论】:
【参考方案3】:我正在使用<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);
【讨论】:
这是一个救命稻草,它真的为我节省了很多时间 也为我工作!谢谢 我使用的是 TCPDF 6.2.11,并且在这里“开箱即用” - 无需修改代码。 救命稻草 :D 谢谢!【参考方案4】:
TCPD 支持 HTML 标记的 'pagebreak' 属性和 CSS 属性 'page-break-before' 和 'page-break-after'。
例如,您可以使用<br pagebreak="true" />
。
查看官方http://www.tcpdf.org 网站和论坛了解更多信息。
【讨论】:
【参考方案5】:对于 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 的版本。那么你有什么想法使用这个属性“page-break-inside:avoid;”在旧版“4.6.016”的 TCPDF 中?【参考方案6】:我尝试过使用
<br pagebreak="true" />
或
<tcpdf method="AddPage" />
它们中的每一个都不会导致在页面顶部开始新页面,而是在 HTML 文本之间添加完整的 A4 页面空白空间。因此,如果文本在页面中间结束,然后插入分页符,则新文本将从下一页的中间写入。这是我不想要的。
这是有效的(在这里找到TCPDF forcing a new page):
$pdf->writeHTML($content, true, 0, true, 0);
$pdf->AddPage();
$pdf->setPage($pdf->getPage());
现在从在页面顶部写文字开始。
【讨论】:
【参考方案7】:根据http://www.tcpdf.org/examples/example_049.phps,你可以使用这样的东西
$html .= '<tcpdf method="AddPage" /><h2>Graphic Functions</h2>';
您需要验证 TCPDF 配置文件中的参数 K_TCPDF_CALLS_IN_HTML 是否为真。
【讨论】:
【参考方案8】:通过 CSS 为您的元素提供 page-break-after
、page-break-before
或 page-break-inside
属性将在 TCPDF 运行时将属性 pagebreak
或 pagebreakafter
应用于 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';
【讨论】:
【参考方案9】:对于仍然对分页 TCPPDF 库有同样问题的人
您可以使用<div style="page-break-before:always"></div>
或<br pagebreak="true"/>
在您的 HTML 内容中手动分页。
使用$tcpdf->AddPage()
在您的代码中手动分页。
当您设置SetAutoPageBreak(TRUE, 10);
时,意味着:当文档高度达到(底部 - 10)时,将光标移动到新页面。所以如果你想有更多的空间,只需将数字减少到0。它会一直绘制到文档的末尾,从底部没有任何边距。
请记住,TCPDF 只接受标签属性的双引号 (")。请勿在标签中使用单引号 (')。
<div style='page-break-before:always'
=> 错误
<div style="page-break-before:always"
=> 正确
我需要 8 个小时,因为这个问题 :(
【讨论】:
以上是关于TCPDF 中的手动分页符的主要内容,如果未能解决你的问题,请参考以下文章