2

TCPDF のキープ トゥギャザー機能があるかどうか疑問に思っています。FPDF 用に 1 つ持っていますが、TCPDF では動作しません。

PDF生成コード内でどのように機能するかを次に示します。

// ... PDF code/stuff

// while not kept together
    // add PDF stuff that should be kept together

// .. more PDF code/stuff

新しいページが追加された場合、関数はfalseを返し、ロールバックしてからwhileループを再度実行すると考えています。

私は次の作業をしていますが、TCPDFの関数/メソッドにあった方がいいので、より再利用可能でした:

$pdf->startTransaction();
$block_page = $pdf->getPage();
$print_block = 2; // max 2 tries

while ($print_block > 0) {
    // do PDF stuff

    if ($pdf->getPage() == $block_page) {
        $print_block = 0;
    } else {
        // rollback
        $pdf = $pdf->rollbackTransaction();
        $pdf->AddPage();
        $block_page = $pdf->getPage();
        -- $print_block;
    }
}

writeHTML() のようなものはトランザクションを使用するため、組み込みのトランザクション機能に依存せずにループ内でトランザクションを使用できるようにすることもクールです。

4

1 に答える 1

5

私は同様の機能が欲しかったので、トランザクションを使用することに決めました。これはTCPDFバージョン5.9.125で。

TCPDFから独自のPDFクラスを継承し、独自のメソッドを追加しました。

public function writeHTMLTogether($html, $ln=true, $fill=false, $reseth=false, $cell=false, $align='') {
    $cp =  $this->getPage();
    $this->startTransaction();

    $this->writeHTML($html, $ln, $fill, $reseth, $cell, $align);

    if ($this->getPage() > $cp) {
         $this->rollbackTransaction(true);//true is very important
         $this->AddPage();
         $this->writeHTML($html, $ln, $fill, $reseth, $cell, $align);           
    } else {            
         $this->commitTransaction();            
    }
}

正常に動作しているようです。writeHTMLは多くのプロパティをどこかに格納しているように見えるため、ロールバックにtrueがないと、ひどく壊れます。

現在のページ($ cp)は保存されていると思うので、ローカル変数を作成する必要はないかもしれません。でもねえ。

とにかく独自のヘッダー関数とフッター関数を作成することを継承している場合は、それほど余分な作業は必要ありません。

于 2011-11-18T13:22:43.793 に答える