1

TCPDFをFPDIテンプレートと一緒に使用すると、その過程で一部のCSSサポートが失われます。問題は、境界線や背景色など、PDFテンプレートの下のレイヤーになってしまうことです。TCPDFはSetLineStyle()CSSの境界線/背景をPDFに変換するために使用しますが、これが問題のようです。

例えば:

$this->setSourceFile($filename); // /path/to/my/background.pdf
$imported_page = $this->ImportPage(1);
$this->useTemplate($imported_page);

...

$html = '<table style="border: 1px solid #000;"><tr><td style="background-color: #ff0000;">...</td></tr></table>';

$this->writeHTMLCell(45, 25, 160, 29, $html); 

CSSの境界線はレンダリングされません。削除されるとすぐuseTemplate()に境界線があります。結果のPDFをIllustratorで分析すると、いくつかの興味深いことがわかります。

上から下へのPDFレイヤーuseTemplate()

  1. テーブル/コンテンツレイヤー
  2. PDFテンプレートレイヤー(グループ)
  3. 境界線と背景のレイヤー(パス)

なしのPDFレイヤーuseTemplate()-上から下へ:

  1. テーブル/コンテンツレイヤー
  2. 境界線と背景のレイヤー(パス)

IllustratorでPDFテンプレートを含むレイヤーグループを無効にすると、境界線と背景が表示されます。

残念ながら、PDFテンプレートレイヤーグループをスタックの一番下に配置して、他のすべてがその上にレンダリングされるようにする方法が見つかりませんでした。私たちが思いつくことができた唯一の回避策は、writeHTMLCell()呼び出しをstartTemplate()/でラップし、最後に:endTemplate()で終了することでした。printTemplate()

$this->setSourceFile($filename); // /path/to/my/background.pdf
$imported_page = $this->ImportPage(1);
$this->useTemplate($imported_page);

...

$html = '<table style="border: 1px solid #000;"><tr><td style="background-color: #ff0000;">...</td></tr></table>';

$workaround_template = $this->startTemplate($w, $h);
$this->writeHTMLCell(45, 25, 160, 29, $html); 
$this->endTemplate();
$this->printTemplate($workaround_template, $x, $y, $w, $h, 'T', 'L');

好奇心から:これがそれを行う唯一の方法ですか、それとも今後のすべてのものの一番下にPDFテンプレートを配置する方法がありますか?

前もって感謝します!

4

2 に答える 2

5

解決策は、実際にsetPageMark()を使用することです。これが私にとって非常にうまくいったことです:

public function AddPage($orientation = '', $format = '') {
    global $pdf_data_path;
    parent::AddPage($orientation, $format);
    if ($this->use_headed) {
        $this->setSourceFile($pdf_data_path."/headed.pdf");
        $tplidx = $this->importPage(1, '/MediaBox');
        $this->useTemplate($tplidx, 0, 0, 0, 0, true);
        $this->setPageMark();
    }       
}

重要なのは、テンプレートを使用した後にsetPageMark()を配置することです。境界線は、結果のPDFでテンプレートの上に積み重ねられます。

于 2012-10-27T09:03:02.433 に答える
1

setPageMark()メソッドを使用してみましたか?

于 2012-07-12T18:55:35.703 に答える