3

改ページに少し問題があります。マルチセルが最初のページのフッターの上に表示され、それが壊れます: ページの下の余白を設定して、上のページで壊れるようにするにはどうすればよいですか? 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');
4

11 に答える 11

8

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

やってみました:

      $pdf->SetAutoPageBreak(True, PDF_MARGIN_FOOTER);

また

      $pdf->SetAutoPageBreak(True, where_I_want_break);
于 2010-02-08T14:11:43.680 に答える
2

ライブラリのバージョン 6.2.0 を使用した場合も同じ問題が発生します (これが修正されたという噂は時期尚早であると報告するのは非常に残念です)。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);
}

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 に切り替える必要はありません。

于 2015-07-03T15:57:06.347 に答える
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;

その上でパッチチケットを開きました。

于 2014-10-17T18:30:44.247 に答える
1

同じ問題がありましたが、autopagebreak をオフに設定し、セルを書き出してから、autopagebreak をオンに戻す tcpdf の例の 1 つからのメソッドを使用しました。

    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);
    }
于 2011-10-11T16:25:02.483 に答える
0

この問題は、whileループを使用してcheckPageBreakメソッドを使用することで回避しました。ただし、PHP4を使用しています。PHP5では、checkPageBreakはプライベートメソッドです。ページをもっと管理できるように、公開をお願いするのは価値があると思います。

また、トランザクションメソッドを使用して、最大ページ高に近いポイントに到達したかどうかを確認した後、トランザクションをロールバックしてaddPage()を実行しました。

近いうちに、ここでループのコピーを取得します。これは素晴らしいライブラリですが、自動ページ分割はマルチセル機能の問題です。

-ジェイソン

于 2010-02-19T17:04:43.523 に答える
0

MultiCell の代わりに writeHTMLCell 関数を試してください

変化する

$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);
于 2013-05-22T06:38:59.373 に答える
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);
于 2013-05-22T06:42:28.190 に答える