如何用TCPDF写每两页

How to write every two pages with TCPDF

我需要生成双面打印的 pdf。有两种不同的背景图像,具体取决于页面是正面还是背面。文本必须只写在奇数页(正面)上。 在偶数页(背面)上,必须只有图像。然后,如果第 1 页的文本溢出,则必须在第 3 页继续。我如何使用 TCPDF 做到这一点?

到目前为止我的代码(正面是正面,反面是背面):

$pdf->startPage();
$pdf->Image($img_file_recto, 0, 0, 210, 297, '', '', '', false, 300, '', false, false, 0);
$pdf->SetAutoPageBreak(true, 106); // (boolean) Boolean indicating if mode should be on or off , (float) Distance from the bottom of the page.
$pdf->writeHeaderRecto();
$pdf->writeHTMLCell(0, 130, 8, 74, $bloc_body, 0, 0, false, true, '', true); // bloc body de la page
$pdf->writeFooterRecto();
$pdf->addPage();
$pdf->setPage(2);
$pdf->Image($img_file_verso, 0, 0, 210, 297, '', '', '', false, 300, '', false, false, 0);
$pdf->endPage();
$pdf->startPage();
$pdf->Image($img_file_recto, 0, 0, 210, 297, '', '', '', false, 300, '', false, false, 0);
$pdf->addPage();
$pdf->Image($img_file_verso, 0, 0, 210, 297, '', '', '', false, 300, '', false, false, 0);
$pdf->endPage();
$pdf->output($fileName, 'I');

这段代码生成了一个干净的首页(背景图片+页眉+文本的第一部分+页脚),这正是我想要的。 但是,第二页在左上角显示了缩小尺寸的图像,紧接着是其余文本。 然后第三页在左上角和页眉显示缩小尺寸的图像,但不在页脚显示。最后,第四页在左上角和页脚显示缩小尺寸的图像。

谁能解释一下这种奇怪的行为?注意:当 setAutoPageBreak() 设置为 false 时,图像可以正常显示,但文本会溢出到页脚(距页面底部 106)。

感谢您提供任何帮助或重定向到正确的解决方案。

在文档的 example 51 中直接在每个页面上绘制背景图像。我们可以添加类似于 $img_file = $this->page % 2 ? 'recto.jpg' : 'verso.jpg'; 的内容,以在奇数页和偶数页上放置不同的背景。

那么就是每创建一个偶数页就增加一个新页的情况。我通过扩展 endPage() 来完成此操作,这比扩展 startPage().

对于最后一页效果更好

您需要设置一些边距,以便文本在超出初始页面时从正确的位置开始。

class MyPDF extends TCPDF
{

    public function Header()
    {
        // get the current page break margin
        $bMargin = $this->getBreakMargin();
        // get current auto-page-break mode
        $auto_page_break = $this->AutoPageBreak;
        // disable auto-page-break
        $this->SetAutoPageBreak(false, 0);
        // set background image
        $img_file = $this->page % 2 ? 'recto.jpg' : 'verso.jpg';
        $this->Image($img_file, 0, 0, 210, 297, '', '', '', false, 300, '', false, false, 0);
        // restore auto-page-break status
        $this->SetAutoPageBreak($auto_page_break, $bMargin);
        // set the starting point for the page content
        $this->setPageMark();
    }

    public function endPage($tocpage = false)
    {
        parent::endPage($tocpage);
        if ($this->page % 2) {
            $this->startPage();
            $this->endPage();
        }
    }

}

$bloc_body = '<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<p>Curabitur pretium tincidunt lacus. Nulla gravida orci a odio. Nullam varius, turpis et commodo pharetra, est eros bibendum elit, nec luctus magna felis sollicitudin mauris. Integer in mauris eu nibh euismod gravida. Duis ac tellus et risus vulputate vehicula. Donec lobortis risus a elit. Etiam tempor. Ut ullamcorper, ligula eu tempor congue, eros est euismod turpis, id tincidunt sapien risus a quam. Maecenas fermentum consequat mi. Donec fermentum. Pellentesque malesuada nulla a mi. Duis sapien sem, aliquet nec, commodo eget, consequat quis, neque. Aliquam faucibus, elit ut dictum aliquet, felis nisl adipiscing sapien, sed malesuada diam lacus eget erat. Cras mollis scelerisque nunc. Nullam arcu. Aliquam consequat. Curabitur augue lorem, dapibus quis, laoreet et, pretium ac, nisi. Aenean magna nisl, mollis quis, molestie eu, feugiat in, orci. In hac habitasse platea dictumst.</p>';
$bloc_body .= $bloc_body;

$pdf = new MyPDF();
$pdf->SetAutoPageBreak(true, 106); // (boolean) Boolean indicating if mode should be on or off , (float) Distance from the bottom of the page.
$pdf->addPage();
$pdf->writeHTMLCell(0, 130, 8, 74, $bloc_body, 0, 0, false, true, '', true); // bloc body de la page
$pdf->output($fileName, 'I');