Intereting Posts
Как извлечь параметры запроса из строки URL в PHP? Как вставить данные в поле без обновления? Совместное использование переменных сеанса в PHP между субдоменами Не удается открыть удаленный файл XML с помощью функции fopen (). Какое все разрешение нужно установить на сервере или какие параметры мне нужно установить в функции fopen (). Показывать год только один раз в цикле архивов Перенаправление кого-то в браузерную поисковую систему Удаление содержимого каталога и содержимого подкаталога PHP подсчитывает все элементы в массиве Что делают эти две строки в Mod_Rewrite? Использование PHP & curl для публикации html-формы, содержащей файл PHP: вызов метода экземпляра через синтаксис ClassName :: method приводит к статическому вызову? Показать Скрыть div, если, если утверждение верно PHP strpos проверяет многие Простейшее двухстороннее шифрование с использованием PHP Удалить дубликаты из массива PHP

Невозможно избавиться от 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- 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; 

    Related of "Невозможно избавиться от PHP-уведомлений в mPDF"

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

     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() .