TCPDF与FPDI模板和CSS

时间:2012-07-11 21:29:49

标签: php pdf tcpdf fpdi

将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()后,边框就会出现。使用Illustrator分析生成的PDF显示了一些有趣的事情:

useTemplate()的PDF图层 - 从上到下:

  1. 表/内容层
  2. PDF模板图层(组)
  3. 边框和背景图层(路径)
  4. 没有useTemplate()的PDF图层 - 从上到下:

    1. 表/内容层
    2. 边框和背景图层(路径)
    3. 在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模板放在所有事情的最底层?

      提前致谢!

2 个答案:

答案 0 :(得分:4)

解决方案是使用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中。

答案 1 :(得分:1)

您是否尝试使用setPageMark() - 方法?