Проблема с tcpdf Pagebreak - PullRequest
       16

Проблема с tcpdf Pagebreak

3 голосов
/ 19 января 2010

У меня небольшая проблема с разрывом страницы. Multicell отображается над нижним колонтитулом первой страницы, а затем разрывается: как установить нижнее поле страницы, чтобы разрыв произошел ранее выше? Вот пример 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');

Ответы [ 10 ]

6 голосов
/ 08 февраля 2010

$ pdf-> SetFooterMargin (PDF_MARGIN_FOOTER);$ pdf-> SetAutoPageBreak (True, PDF_MARGIN_BOTTOM);

Вы пробовали:

      $pdf->SetAutoPageBreak(True, PDF_MARGIN_FOOTER);

или

      $pdf->SetAutoPageBreak(True, where_I_want_break);
3 голосов
/ 08 сентября 2013

Как и Джейсон,

Я также использую функцию checkPageBreak ().Я использую версию 5.9.113 tcpdf.Мне пришлось изменить функцию changePageBreak () от защищенной к публичной.Затем в цикле, который выводит каждую строку данных из таблицы базы данных с помощью 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 голосов
/ 03 июля 2015

Та же проблема здесь, с использованием версии 6.2.0 библиотеки (так грустно сообщать, что слухи о том, что это было исправлено, преждевременны).Мне понравился подход dwayne towell к Ln, но я нервничаю из-за такого системного изменения - может быть тонкое поведение MultiCell, которое нарушается ... Мне также понравилась идея Шанса просто вызвать 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);
}

IМы обновили мой код печати, добавив его над циклом печати каждой записи:

// 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, чтобы получить более качественную распечатку.

1 голос
/ 17 октября 2014

Проблема в 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;

Я открыл билет патча .

1 голос
/ 11 октября 2011

Возникла та же проблема, но использовался метод из одного из примеров tcpdf, который отключает авторазрыв страницы, записывает ячейку, а затем снова включает авторазрыв страницы:

    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);
    }
0 голосов
/ 06 апреля 2017

Пустая страница на самом деле не является новой страницей, потому что когда вы добавляете страницу, вы все еще на белой странице. Таким образом, следующее устраняет проблему:

$this->pdf->AddPage('P', 'A4');
$this->pdf->deletePage($this->pdf->getNumPages());
0 голосов
/ 10 июня 2014
    $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 страницы.Итак, вы получите pdf с 30 страницами, с правильным текстом.

ps извините за мой английский.

0 голосов
/ 22 мая 2013

Или же вы можете переопределить метод нижнего колонтитула 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);
0 голосов
/ 22 мая 2013

Пожалуйста, попробуйте функцию 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);
0 голосов
/ 19 февраля 2010

Я справился с этой проблемой, используя метод checkPageBreak, используя цикл while. Я использую PHP 4, хотя. В PHP5 checkPageBreak является закрытым методом. Я считаю целесообразным, чтобы мы попросили обнародовать его, чтобы мы могли больше контролировать страницы.

Я также использовал методы транзакции, чтобы после проверки достижения точки, близкой к максимальной высоте страницы, я откатил транзакцию и выполнил addPage ().

Я получу копию моего цикла здесь в ближайшее время. Это отличная библиотека, но автоматическое разбиение страницы является проблемой с многоячеистыми функциями.

1007 * Джейсон *

...