Php tcpdf分页中断问题

Php tcpdf分页中断问题,php,tcpdf,Php,Tcpdf,我对分页符有点问题。多单元格显示在第一页的页脚上,然后它会断开:我如何设置页面的底部边距,以便在前面发生断开?以下是示例PDF:和源代码: <?php require_once('../tcpdf/config/lang/eng.php'); require_once('../tcpdf//tcpdf.php'); class MYPDF extends TCPDF { public function Header() { $auto_page_brea

我对分页符有点问题。多单元格显示在第一页的页脚上,然后它会断开:我如何设置页面的底部边距,以便在前面发生断开?以下是示例PDF:和源代码:

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

$pdf->SetFooterMargin(pdf\U MARGIN\U FOOTER);
$pdf->SetAutoPageBreak(True,pdf\u MARGIN\u BOTTOM)

您是否尝试过:

      $pdf->SetAutoPageBreak(True, PDF_MARGIN_FOOTER);


我通过使用checkPageBreak方法,使用while循环,解决了这个问题。不过,我使用的是PHP4。在PHP5中,checkPageBreak是一个私有方法。我认为我们要求将其公开是值得的,这样我们可以对页面进行更多的控制

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

我很快会在这里得到我的循环的副本。这是一个很棒的库,但是自动分页符对于多单元格功能来说是一个难题


-Jason也有同样的问题,但使用了一个tcpdf示例中的方法设置autopagebreak,写出单元格,然后重新打开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);
    }

请尝试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); 

或者您可以覆盖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);
像杰森一样

我还使用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和自定义宽度问题

机会

在本例中,数组中有10个学生,需要为每个学生创建简历。在考试中,一份简历有三页。所以输入输出你得到30页的pdf,有正确的文本

p、 这是我的英语问题。

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

对这些:

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

我用图书馆的6.2.0版在这里打开了一本关于它的书。

同样的一期(遗憾的是,关于这个问题已经解决的传言还为时过早)。我喜欢dwayne towell治疗Ln的方法,但我对这样一个系统性的改变感到紧张-可能会有一个微妙的多细胞行为被打破。。。我也喜欢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);
}
我已更新了打印代码,以便在“打印每个记录”循环上方包括:

// 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

空白页并不是真正的新页,因为添加页面时,您仍然处于空白页上。因此,以下内容解决了问题:

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

对于仍然有相同问题的人来说,分页符TCPDF库

  • 您可以使用

在HTML内容中手动断开页面。请记住,TCPDF只接受标记属性的双引号(
)。不要对标记使用单引号(

使用
$tcpdf->AddPage()
在代码中手动断开页面

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

是,但结果相同。多单元内容显示在页脚上:-(不幸的是,仅在页脚空白处设置自动分页符是不够的。我将尽快发布我的代码-可能是周一。您是否碰巧有此代码。我也在尝试这样做。我会将其组织并发布给您。您是否有可能发布此代码?我正在处理TCPDF,并且在使用HTM时遇到了完全相同的问题LMultiCell在接近页面底部时,自动分页符会出现混乱,你会在下一页看到一片混乱。我了解到,这在较新版本的TCPDF中是固定的,但我使用的是Joomla提供的库,因此我不能依赖更新的代码。Thanks@JasonMichael你还有checkPageBreak方法的代码吗?
checkPageBreak方法现在受到保护在6.2.0版中,采用了前两行,但不包括checkPageBreak。
/**
 * 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);
}
// 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);
$this->pdf->AddPage('P', 'A4');
$this->pdf->deletePage($this->pdf->getNumPages());