tcpdf Pagebreak的问题

时间:2010-01-19 08:27:50

标签: php tcpdf

我的网页破解有点问题。 Multicell显示在第一页的页脚上,然后它中断:如何设置页面的下边距,以便在上面发生中断?以下是PDF示例:Example以及源代码:

<?php require_once('../tcpdf/config/lang/eng.php'); 
  require_once('../tcpdf//tcpdf.php'); 

  class MYPDF extends TCPDF {
    public function Header() { 
      $auto_page_break = $this->AutoPageBreak;
      $this->SetAutoPageBreak(false,0); 
      $this->setJPEGQuality(100); $img_file = 'images/mandanten/ce_background.jpg';       
      $this->Image($img_file, $x=160, $y=72, $w=36, $h=200, $type='', $link='', $align='', $resize=true, $dpi=150, $palign='', $ismask=false, $imgmask=false, $border=0);        
      $this->SetAutoPageBreak($auto_page_break); } 
   }

 $pdf = new MYPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); 
 $pdf->SetCreator(PDF_CREATOR); $pdf->SetAuthor('tmpAutor');  
 $pdf->SetTitle('tmpTitle'); $pdf->SetSubject('tmpSubject'); 
 $pdf->SetKeywords('tmp');   $pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN)); 
 $pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));                
 $pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED); 
 $pdf->SetMargins(PDF_MARGIN_LEFT, 10, PDF_MARGIN_RIGHT);                                   
 $pdf->SetHeaderMargin(PDF_MARGIN_HEADER);  
 $pdf->SetFooterMargin(PDF_MARGIN_FOOTER);             
 $pdf->SetAutoPageBreak(True, PDF_MARGIN_BOTTOM); 
 //set image scale factor 
 $pdf->setImageScale(PDF_IMAGE_SCALE_RATIO); 
 //set some language-dependent strings 
 $pdf->setLanguageArray($l); $pdf->AddPage(); 
 $pdf->SetFont('freesans', '', 16); 
 $pdf->Cell(0, 10, 'Headline', 0, 1, 'L'); 
 $pdf->SetFont('freesans', '', 11); 
 // Some Dummy Unicode content 
 $tmp = 'Lorèm ìpsum dolor sìt åmèt, čonsètètur sådìpsčìng èlìtr, sèd dìåm nonumy èìrmod tèmpor ìnvìdunt ut låborè èt dolorè mågnå ålìquyåm èråt, sèd dìåm voluptuå. åt vèro èos èt åččusåm èt justo duo dolorès èt èå rèbum. Stèt člìtå kåsd gubèrgrèn, no sèå tåkìmåtå sånčtus èst Lorèm ìpsum dolor sìt åmèt. Lorèm ìpsum dolor sìt åmèt, čonsètètur sådìpsčìng èlìtr, sèd dìåm nonumy èìrmod tèmpor ìnvìdunt ut låborè èt dolorè mågnå ålìquyåm èråt, sèd dìåm voluptuå. åt vèro èos èt åččusåm èt justo duo dolorès èt èå rèbum. Stèt člìtå kåsd gubèrgrèn, no sèå tåkìmåtå sånčtus èst Lorèm ìpsum dolor sìt åmèt.wåèdr';

$pdf->MultiCell(140, 0, $tmp."<br><br>".$tmp."<br><br>".$tmp."<br><br>".$tmp."<br><br>".$tmp."<br><br>".$tmp."<br><br>".$tmp."<br><br>".$tmp."<br><br>".$tmp."<br><br>".$tmp."<br><br>".$tmp, 0, 'J', 0, 0, '', '', true, 0,true);    
$pdf->Output('example_051.pdf', 'I');

11 个答案:

答案 0 :(得分:6)

  

$ PDF-&GT; SetFooterMargin(PDF_MARGIN_FOOTER);   $ pdf-&gt; SetAutoPageBreak(True,PDF_MARGIN_BOTTOM);

你试过了吗?

      $pdf->SetAutoPageBreak(True, PDF_MARGIN_FOOTER);

      $pdf->SetAutoPageBreak(True, where_I_want_break);

答案 1 :(得分:3)

和杰森一样,

我也使用checkPageBreak()函数。 我使用的是tcpdf版本5.9.113。 我不得不将changePageBreak()函数从protected修改为public。 然后在一个循环中,使用带有自定义宽度单元格的MultiCell()从数据库表中输出每行数据,我检查新页面,相应地处理,它就像一个魅力。 我不必使用事务方法来处理新页面。

以下是处理所有内容的循环代码的摘录:

while($data = mysql_fetch_assoc($result))
{
    $pdf->MultiCell(20,6,$data['date'],0,'C',0,0);
    $pdf->MultiCell(40,6,$data['refnumber'],0,'C',0,0);
    $pdf->MultiCell(66,6,$data['memo'],0,'L',0,0);
    $pdf->MultiCell(20,6,$data['linetotal']),0,'R',0,0);
    $pdf->Ln();
    if($pdf->checkPageBreak()) $pdf->Ln();
    }

添加新页面时,checkPageBreak()函数返回true。在这种情况下,您可以像执行新行一样执行所需的任何其他任务。

希望这有助于其他人使用此MutliCell和自定义宽度问题。

可能有

答案 2 :(得分:2)

同样的问题在这里,使用库(如此伤心地报告,谣言,这已得到修复还为时过早)的6.2.0版本。我喜欢dwayne towell使用Ln的方法,但对这种系统性改变感到紧张 - 可能会有一个微妙的MultiCell行为被破坏......我也很喜欢Chance的想法,就是在循环中调用checkPageBreak。我在搜索TCPDF是否有“保持在一起”选项时发现了这个问题。

我有自己的类派生自TCPDF(对修改库有太多的偏见,我更喜欢覆盖),并添加了这个方法:

/**
 * Keep the next segment together on one page
 * @param $height (float) the height of the lines to print together
 */
public function keepTogether($height) {
    $this->checkPageBreak($height);
}

我已将我的打印代码更新为包含在print-each-record循环上方:

// getStringHeight ($w, $txt, $reseth=false, $autopadding=true, $cellpadding='', $border=0)
$lineHeight = $this->pdf_printer->getStringHeight(0, 'Test', false, true, '', 1);

然后在循环的顶部

$this->pdf_printer->keepTogether($lineHeight);

这对我有用。打印循环使用MultiCell,因为我需要调整不同列中的字​​体大小。因此,我不必为了获得更好的打印输出而切换到HTML。

答案 3 :(得分:1)

有同样的问题,但使用了一个设置autopagebreak的tcpdf示例中的方法,写出单元格,然后重新启用autopagebreak:

    public function WriteCellText( $CellValue, $x, $y,$w, $h){

            $bMargin = $this->getBreakMargin();
            $auto_page_break = $this->AutoPageBreak;
            $this->SetAutoPageBreak(false, 0);
            $this->SetXY($x, $y, true);
            $this->Cell($w,$h, $CellValue, 0, 0, 'L', 0, '', 0, true);
            $this->SetAutoPageBreak($auto_page_break, $bMargin);
    }

答案 4 :(得分:1)

问题出在Ln()。它不执行checkPageBreak()。更改Ln()末尾的以下行:

    if (is_string($h)) {
        $this->y += $this->lasth;
    } else {
        $this->y += $h;
    }

到这些:

    if (is_string($h))
        $h = $this->lasth;
    if (!$this->checkPageBreak($h))
       $this->y += $h;

我打开了patch ticket

答案 5 :(得分:0)

我通过使用checkPageBreak方法,使用while循环解决了这个问题。不过,我正在使用PHP 4。在PHP5中,checkPageBreak是一种私有方法。我认为值得我们要求将其公之于众,以便我们可以在页面上获得更多控制权。

我还使用了事务方法,以便在检查我是否到达接近最大页面高度的点后,我回滚了事务并执行了addPage()。

我很快就会得到我的循环副本。这是一个很棒的库,但自动分页功能很难实现多单元功能。

-Jason

答案 6 :(得分:0)

请尝试使用writeHTMLCell函数而不是MultiCell

更改

$pdf->MultiCell(140, 0, $tmp."<br><br>".$tmp."<br><br>".$tmp."<br><br>".$tmp."<br><br>".$tmp."<br><br>".$tmp."<br><br>".$tmp."<br><br>".$tmp."<br><br>".$tmp."<br><br>".$tmp."<br><br>".$tmp, 0, 'J', 0, 0, '', '', true, 0,true); 

$this->writeHTMLCell(0, 25, 25, 250,'Footer value', 0, 0, 0, true, 'C', true);

答案 7 :(得分:0)

否则你可以覆盖TCPDF页脚方法,如

// Position at 15 mm from bottom
    $this->SetY(-15);
    // Set font
    $this->SetFont('helvetica', 'B', 8);
//Userdefind Function -Testing

$pg_num = $this->getPage();
$page_height = $this->getPageHeight();
$ph = $page_height;
$this->writeHTMLCell(0, 25, 25, $ph-19.4,'footer data', 0, 0, 0, true, 'C', true);
$this->writeHTMLCell(0, 25, 25, $ph-9.4,'footer data', 0, 0, 0, true, 'L', true);

答案 8 :(得分:0)

    $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
    ...
    $pdf->SetMargins(10, 10, 10);
    $pdf->SetAutoPageBreak(true, 10);
    foreach($array as $item)
    {
        $pdf->AddPage(); //add new page for new item
        $txt = some_long_long_text;
        $pdf->Write(0, $txt, '', 0, 'C', true);
        $pdf->endPage(); //do end of page
        $pdf->lastPage(); //set cursor at last page, because autopagebreak not do it
    }

例如,阵列中有10个学生,您需要为每个学生创建简历。在考试中,一份简历有3页。所以在外面你得到30页的pdf,文本正确。

p.s我的英语。

答案 9 :(得分:0)

空白页面实际上并不是真正的新页面,因为当您添加页面时,您仍然在白页上。所以下面修复了这个问题:

$this->pdf->AddPage('P', 'A4');
$this->pdf->deletePage($this->pdf->getNumPages());

答案 10 :(得分:0)

对于仍然使用分页符TCPDF库存在相同问题的人

  • 您可以使用<div style="page-break-before:always"></div><br pagebreak="true"/>

以手动中断HTML内容中的页面。请记住,TCPDF仅接受标记属性的双引号(")。请勿在标签中使用单引号(')。

使用$tcpdf->AddPage()在代码中手动分页。

  • 设置SetAutoPageBreak(TRUE, 10);意味着:当文档的高度达到(底部-10)时,将光标移至新页面。因此,如果您想拥有更多空间,只需将数字减小为0。它将一直绘制到文档末尾,底部没有任何边距。