mPDF: использовать фоновое изображение для полной страницы - PullRequest
0 голосов
/ 10 мая 2018

Мне нужно сгенерировать счета с помощью mPDF, и у всех них будет заголовок, нижний колонтитул и одно и то же фоновое изображение, которое должно охватывать всю страницу.

Я видел другие решения в сетино ни одна из них не сработала для меня.

Это несколько попыток, все они приводят к сбою (изображение не отображается, ошибка 50 * или изображение, покрывающее часть содержимого при использовании изображений):

1- Использование внешнего файла CSS и внедрение его в качестве содержимого CSS

$pdf = new mPDF('es', 'A4', 0, '', 5, 5, 0, 0, 0, 0, 'P');

$pdf->useSubstitutions=false;
$pdf->setAutoTopMargin = 'stretch';
$pdf->SetDisplayMode('fullpage');


$css = file_get_contents('./styles.css');
$cabecera = file_get_contents('./header.html');
$cuerpo = file_get_contents('./body.html');
$pie = file_get_contents('./footer.html');

$pdf->SetHTMLHeader($cabecera);
$pdf->SetHTMLFooter($pie);
$pdf->WriteHTML($css, 1);

$pdf->WriteHTML($cuerpo, 2);

$pdf->Output();

И файла styles.css:

body {
    background-image: url('background_300dpi.png') ;
}

Это приводит к ошибке времени ожидания.Если я использую фоновое изображение с низким разрешением, это работает, но это нарушает мой макет.

2 - Попытка установить фоновое изображение с помощью SetDefaultBodyCSS

$pdf = new mPDF('es', 'A4', 0, '', 5, 5, 0, 0, 0, 0, 'P');

$pdf->useSubstitutions=false;
$pdf->setAutoTopMargin = 'stretch';
$pdf->SetDisplayMode('fullpage');


$cabecera = file_get_contents('./cabecera.html');
$cuerpo = file_get_contents('./cuerpo.html');
$pie = file_get_contents('./pie.html');

$pdf->SetHTMLHeader($cabecera);
$pdf->SetHTMLFooter($pie);

$pdf->SetDefaultBodyCSS('background', "url('background_300dpi.png')");
$pdf->SetDefaultBodyCSS('background-image-resize', 6);

$pdf->WriteHTML($cuerpo, 2);

$pdf->Output();

Timeoutошибка тоже.Это работает, если я использую изображение с низким разрешением.Но это не очень хорошее решение для печати, потому что на бланке есть маленькие буквы, которые включены в фоновое изображение.

3 - Попытка использовать изображения (фоновое изображение разбивается на верхнюю частьфирменный бланк и нижнее изображение) вместо единственного фонового изображения и установки для полей ограничения значения false

$pdf = new mPDF('es', 'A4', 0, '', 5, 5, 0, 0, 0, 0, 'P');

$pdf->useSubstitutions=false;
$pdf->setAutoTopMargin = 'stretch';
$pdf->SetDisplayMode('fullpage');


$cabecera = file_get_contents('./cabecera.html');
$cuerpo = file_get_contents('./cuerpo.html');
$pie = file_get_contents('./pie.html');

$pdf->SetHTMLHeader($cabecera);
$pdf->SetHTMLFooter($pie);

$pdf->WriteHTML($cuerpo, 2);

$pdf->Image('miramar/background_top.png', 0, 0, 210, 28.5, 'png', '', true, false);
$pdf->Image('miramar/background_bottom.png', 0, 259, 210, 38, 'png', '', true, false, false, false);

$pdf->Output();

В этом случае тайм-аут не установлен, но изображение нижнего колонтитула делает некоторый контент включенным в нижний колонтитулушел.

У кого-нибудь есть идеи, как этого добиться?

Другой вопрос: поддерживает ли mPDF векторных изображений для фона?Я мог бы использовать фоновое изображение в качестве файла SVG.

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Я понял!Как я догадался позже, имея это, я мог бы использовать фоновое изображение как векторное изображение (SVG), я мог бы сделать это следующим образом.

Это код:

$pdf = new mPDF('es', 'A4', 0, '', 5, 5, 0, 0, 0, 0, 'P');

$pdf->useSubstitutions=false;
$pdf->setAutoTopMargin = 'stretch';
$pdf->SetDisplayMode('fullpage');

$cabecera = file_get_contents('./cabecera.html');
$cuerpo = file_get_contents('./cuerpo.html');
$pie = file_get_contents('./pie.html');

$pdf->SetHTMLHeader($cabecera);
$pdf->SetHTMLFooter($pie);

$pdf->SetDefaultBodyCSS('background', "url('./background_image.svg')");
$pdf->SetDefaultBodyCSS('background-image-resize', 6);

$pdf->WriteHTML($cuerpo, 2);

$pdf->Output();

С SVG работает как шарм и быстро!

0 голосов
/ 08 августа 2018

Вы смотрите в файле примера: example54_new_mPDF_v5-1_features_gradients_and_images.php

<?php


$path = (getenv('MPDF_ROOT')) ? getenv('MPDF_ROOT') : __DIR__;
require_once $path . '/vendor/autoload.php';

$mpdf = new \Mpdf\Mpdf();

//==============================================================
$html = '
<style>
table {
    background: url(\'assets/bayeux1.jpg\') repeat scroll left top;
}
.table1 tr.thisrow1 {
    background-image-resolution: 300dpi;

}
.table1 tr.thisrow1 td {
    height: 28mm;
}
.table1 tr.thisrow2 {
    background-image: none;
    background: -moz-linear-gradient(left, #c7Fdde 20%, #FF0000 );
    background: -webkit-gradient(linear, left bottom, left top, color-stop(0.29, rgb(90,83,12)), color-stop(0.65, rgb(117,117,39)), color-stop(0.83, rgb(153,153,67)));
}
</style>

<table class="table1">
<tbody>
    <tr><td>Row 1</td><td>This is data</td><td>This is data</td></tr>
    <tr class="thisrow1">
        <td>This row has</td>
        <td>a background-image</td>
        <td>of the bayeux tapestry</td>
    </tr>
    <tr><td><p>Row 3</p></td><td><p>This is long data</p></td><td>This is data</td></tr>
    <tr class="thisrow2"><td>This row has</td><td>a gradient set</td><td>which spans all 3 cells</td></tr>
    <tr><td>Row 5</td><td>Also data</td><td>Also data</td></tr>
</tbody>
</table>


';

$mpdf->WriteHTML($html);

$mpdf->Output(); exit;
0 голосов
/ 11 мая 2018

Используйте @page CSS-селектор вместо body, чтобы установить фон. Затем добавьте свойство background-image-resize: 6;, чтобы изображение покрывало всю ширину и высоту каждой страницы.

В styles.css:

@page {
    background: url('/full/path/to/image/background_300dpi.png') no-repeat 0 0;
    background-image-resize: 6;
}
...