Я использую библиотеку 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- file_put_contents()
но все же заметки печатаются в браузере. Во всяком случае, мне нужен PDF-файл для загрузки, а не для сохранения в файловую систему.
ОК, я нашел одно решение, хотя это не лучшая практика (но он работает): я заключу код с ob_start();
и ob_end_clean();
в то время как вылавливать строку pdf 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 MYH: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;
в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 MYH: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;
Хотя ответа нет и потому, что я не нашел другого подходящего решения, вот резюме того, что у меня есть до сих пор (в основном, копия из моего вопроса выше):
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 MYH: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;
в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 MYH: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-кода), поэтому это ( пока) единственное решение, которое работает для меня.
Может быть, это поможет кому-то.
Кажется, что ошибка возникает, когда она пытается записать новые заголовки таблиц для каждой страницы. Я прокомментировал в V 5.4 строку 26210
#$this->TableHeaderFooter($tablefooter,$tablestartpage,$tablestartcolumn,'F',$level, $firstSpread, $finalSpread); // mPDF 5.3.36
Заголовок, в который не попадает, независимо от того, комментирует эту строку, не имеет никакого эффекта, кроме как убить уведомления.
Если вы используете $mpdf->Output()
после ob_end_clean()
, вы даже можете отображать PDF без уведомлений в браузере! Я использую это в OpenCart. Но вам нужно использовать ob_start()
и ob_end_clean()
.