TCPDF с шаблонами FPDI и CSS

При использовании 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. Пограничные и фоновые слои (пути)

При отключении группы слоев, содержащей шаблон PDF, в Illustrator границы и фон становятся видимыми.

К сожалению, мы не нашли способа разместить группу слоев шаблона 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 в конец всего, что будет?

Заранее спасибо!


person Andreas de Pretis    schedule 11.07.2012    source источник


Ответы (2)


Пробовали ли вы использовать метод setPageMark()?

person Jan    schedule 12.07.2012

Решение состоит в том, чтобы действительно использовать 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-файле.

person jmper    schedule 27.10.2012