Не могу избавиться от уведомлений PHP в mPDF

Я использую библиотеку mPDF для генерации PDF документов прямо из HTML вывода. Проблема в том, что эта библиотека mPDF написана как есть и генерирует десятки уведомлений (неопределенный индекс, неопределенное смещение и т. Д.). Я пытался что-нибудь прекратить выводить их, но пока ничего не помогло.

Я пытался поставить error_reporting(E_ALL ^ E_NOTICE); так же как error_reporting(E_ALL & ~E_NOTICE); который я вставил в свой index.php, в класс и метод, который непосредственно включает mpdf.php, а также в начале mpdf.php. Я также пробовал комбинации с ini_set('display_errors', 0); - все эти директивы работают для всего веб-приложения, но для mpdf. Поэтому даже когда PDF может быть правильно сформирован и действителен, я не могу вывести его (пусть пользователь загрузит его).

Также проблема возникает с моим HTML (простая таблица, на самом деле ничего особенного), пока примеры работают нормально и без уведомлений.

Таким образом, помощь, в которой я нуждался бы: или избавился бы от уведомлений или лучше помог бы мне выяснить, почему mPDF не работает для меня.

Если я использую этот код:

include_once(DIR_MPDF.'mpdf.php');
$mpdf = new mPDF();
$mpdf->useOnlyCoreFonts = true;
$mpdf->SetDisplayMode('fullpage');
$mpdf->SetAutoFont(0);
$mpdf->WriteHTML('<table><tr><td>HELLO WORLD</td></tr></table>');
$mpdf->Output();
exit;

все работает хорошо, но если я попытаюсь вывести этот HTML:

$mpdf->WriteHTML('<table><tr><td>HELLO WORLD</td><td>HELLO WORLD</td></tr></table>');

Я получаю уведомления, и поэтому PDF не может быть выведен.

Если я сохраню вывод из mPDF в файл (используя, например, file_put_contents()), PDF является действительным и, следовательно, читаемым, даже если я использую сложный HTML - но все же Уведомления печатаются в браузере. В любом случае, мне нужно, чтобы PDF-файл предлагался для загрузки, а не сохранялся в файловой системе.

Хорошо, я нашел одно решение, хотя это не лучшая практика (но оно работает): я прилагаю код с ob_start(); а также ob_end_clean(); при обнаружении строки $pdf, которую я выводил вместо mPDF.

Финальный код:

ob_start();
include(DIR_MPDF.'mpdf.php');
$html = $this->render(TRUE);

$mpdf = new mPDF('utf-8','A4');

$mpdf->useOnlyCoreFonts = true;
$mpdf->SetDisplayMode('fullpage');
$mpdf->SetAutoFont(0);

$stylesheet = file_get_contents(DIR_APPLICATION.'view/stylesheet/declaration.css');
$mpdf->WriteHTML($stylesheet,1);

$mpdf->WriteHTML($html);

$pdf = $mpdf->Output('', 'S');
$ob = ob_get_contents();
ob_end_clean();

if (headers_sent())
    die('Some data has already been output to browser, can\'t send PDF file');
header('Content-Description: File Transfer');
header('Content-Transfer-Encoding: binary');
header('Cache-Control: public, must-revalidate, max-age=0');
header('Pragma: public');
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Content-Type: application/force-download');
header('Content-Type: application/octet-stream', false);
header('Content-Type: application/download', false);
header('Content-Type: application/pdf', false);
if (!isset($_SERVER['HTTP_ACCEPT_ENCODING']) OR empty($_SERVER['HTTP_ACCEPT_ENCODING'])) {
    header('Content-Length: '.strlen($pdf));
}
header('Content-disposition: attachment; filename="invoice.pdf"');
echo $pdf;
exit;

3 ответа

Решение

Пока ответа нет, и потому что я не нашел другого подходящего решения, вот краткое изложение того, что у меня есть (в основном, копия из моего вопроса выше):

ob_start(); // <--| This is very important to start output buffering and to catch out any possible notices
include(DIR_MPDF.'mpdf.php');
$html = $this->render(TRUE);

$mpdf = new mPDF('utf-8','A4');

$mpdf->useOnlyCoreFonts = true;
$mpdf->SetDisplayMode('fullpage');
$mpdf->SetAutoFont(0);

$stylesheet = file_get_contents(DIR_APPLICATION.'view/stylesheet/declaration.css');
$mpdf->WriteHTML($stylesheet,1); // <--| By the second param we are saying to MPDF that it is icnluding only stylesheet

$mpdf->WriteHTML($html);

$pdf = $mpdf->Output('', 'S'); // <--| With the binary PDF data in $pdf we can do whatever we want - attach it to email, save to filesystem, push to browser's PDF plugin or offer it to user for download
$ob = ob_get_contents(); // <--| Here we catch out previous output from buffer (and can log it, email it, or throw it away as I do :-) )
ob_end_clean(); // <--| Finaly we clean output buffering and turn it off

// The next headers() section is copied out form mPDF Output() method that offers a PDF file to download
if (headers_sent())
    die('Some data has already been output to browser, can\'t send PDF file');
header('Content-Description: File Transfer');
header('Content-Transfer-Encoding: binary');
header('Cache-Control: public, must-revalidate, max-age=0');
header('Pragma: public');
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Content-Type: application/force-download');
header('Content-Type: application/octet-stream', false);
header('Content-Type: application/download', false);
header('Content-Type: application/pdf', false);
if (!isset($_SERVER['HTTP_ACCEPT_ENCODING']) OR empty($_SERVER['HTTP_ACCEPT_ENCODING'])) {
    header('Content-Length: '.strlen($pdf));
}
header('Content-disposition: attachment; filename="invoice.pdf"');
echo $pdf; // <--| With the headers set PDF file is ready for download after we call echo
exit;

Как написано в комментарии выше, тогда именно мне (или клиенту:-)) будет сделано то, что будет сделано с данными PDF, возвращенными из mPDF. Я использую этот PDF-файл в других местах с помощью приложения и в основном предлагаю PDF-файл только для загрузки, но я также прикрепляю его к электронной почте (пользователь вносит оплату, я генерирую PDF-счет и отправляю его по электронной почте).

Я не нашел решения (и у меня больше нет времени на это), чтобы остановить генерацию уведомлений mPDF, и я еще не сошел с ума, чтобы "починить" mpdf.php (с 1,34 МБ PHP-кода), поэтому это так (на данный момент) единственное решение, которое работает для меня.

Может быть, это кому-нибудь поможет.

Если вы используете $mpdf->Output() после ob_end_clean(), вы даже можете отобразить PDF без уведомлений в браузере! Я использую это в OpenCart. Но вам нужно использовать ob_start() а также ob_end_clean(),

Кажется, ошибка возникает только тогда, когда она пытается записать новые заголовки таблицы для каждой страницы. Я закомментировал в V 5.4 строку 26210

#$this->TableHeaderFooter($tablefooter,$tablestartpage,$tablestartcolumn,'F',$level, $firstSpread, $finalSpread);   // mPDF 5.3.36

Заголовок, где не рисуется, несмотря на то, что комментирование этой строки не имеет никакого эффекта, кроме как убивает уведомления.

Другие вопросы по тегам