Ошибка TCPDF и mPDF: некоторые данные уже были выведены в браузер, не удается отправить файл PDF

Проблема:

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

Кроме того, эта ошибка появилась только после переключения с моего сервера разработки на мой хост-сервер. Отлично работает на сервере DEV (сервер DEV = WAMPSERVER, сервер PROD = Hostgator Linux).

Устранение неполадок:

Я прочитал много томов других дискуссий в Интернете по этой проблеме, и я не могу найти проблему, связанную с пробелами. Я сократил запрос до следующего:

<?php
ob_start(); 
$html = "Hello World";
include("../mpdf.php");
$mpdf=new mPDF(); 
$mpdf->WriteHTML($html);
$mpdf->Output();
ob_end_clean();
?>

Пробовал ту же концепцию с TCPDF, используя метод ob_clean() перед writeHtml. Одна и та же ошибка во всех случаях (я могу заверить всех, что это не проблема, связанная с пробелами - я даже просмотрел файл в шестнадцатеричном формате, чтобы убедиться, что редактор не вставляет нечетные символы).

Возможная подсказка:

Наконец-то я смог получить представление о том, что происходит, когда переместил всю библиотеку mPDF, классы и папки в папку public_html, а не из папки моего приложения (проект Symfony). В этом сценарии, когда я указал своему браузеру на примеры страниц, он отобразился просто отлично, без каких-либо ошибок (и, кстати, это было очень быстро). Итак, я знаю, что это работает, и я знаю, что нет проблем, связанных с пробелами, или любых других проблем, связанных с кодом или установкой (со стороны mPDF/TCPDF). Это наводит меня на мысль, что либо symfony вставляет какие-то заголовки (которые я пытался удалить с помощью: clearHttpHeaders() ), либо есть параметр PHP INI или CONFIG, который мне не хватает где-то на сервере PROD.

Кто-нибудь имеет ЛЮБОЕ представление о том, что здесь происходит??

Обновление: дамп потока:

Request URL:http://www.example.com/mpdf
Request Method:GET
Status Code:200 OK

Request Headers
GET /mpdf HTTP/1.1
Host: www.example.com
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Cookie: __utma=44708724.1463191694.1383759419.1383759419.1383765151.2; __utmz=44708724.1383759419.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); PHPSESSID=9c7c802200b9d8eefe718447755add5f; __utma=1.813547483.1383767260.1385127878.1385130071.38; __utmb=1.7.10.1385130071; __utmc=1; __utmz=1.1383767260.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)

Response Headers
Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection:Keep-Alive
Content-Type:text/html
Date:Fri, 22 Nov 2013 14:59:52 GMT
Expires:Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive:timeout=5, max=75
Pragma:no-cache
Server:Apache
Transfer-Encoding:chunked

У меня ничего не выпрыгивает... есть другие мысли?


person Patrick    schedule 22.11.2013    source источник
comment
Вы сбросили поток (как его видит клиент) и посмотрели на него?   -  person Eugen Rieck    schedule 22.11.2013
comment
Нет. Я ссылаюсь на невежество. Я не знаю, как сбросить поток. Я был бы рад, если бы меня указали в правильном направлении.   -  person Patrick    schedule 22.11.2013
comment
Лучше всего использовать Firefox, установить расширение Firebug, включить сетевой модуль для этого сайта в Firebug — это покажет вам побайтно, что получает ваш клиент... включая пробелы, новые строки и т. д. Мой совет: виновник будет \r - игнорируется Windows, но не Linux   -  person Eugen Rieck    schedule 22.11.2013
comment
Я попробую.   -  person Patrick    schedule 22.11.2013
comment
Хм ... то же самое с моей проблемой. Я пытаюсь удалить свой стиль css, и он работает. Любое предложение?   -  person Hendry Tanaka    schedule 22.12.2014
comment
Любое решение для этого?   -  person Nikz    schedule 10.03.2015
comment
Какое-нибудь решение найдено...?   -  person Stefan    schedule 10.06.2019


Ответы (8)


Скорее всего, это маркер BOM, используйте IDE, чтобы удалить его, другое исправление может быть:

<?php

$html = "Hello World";
include("../mpdf.php");

ob_clean(); // cleaning the buffer before Output()

$mpdf=new mPDF(); 
$mpdf->WriteHTML($html);
$mpdf->Output();

?>
person biesior    schedule 23.11.2013
comment
Спасибо, но мне показалось, что я упомянул, что пробовал оба этих исправления (просмотрел код в шестнадцатеричном формате, чтобы попытаться найти маркер спецификации, и что я пробовал все итерации ob_clean()). Любые другие идеи? - person Patrick; 23.11.2013

Это может быть какое-то предупреждение от PHP перед выводом pdf->. Текст предупреждения отправляется в браузер клиента, поэтому файл не может быть отправлен.
Если ваш уровень предупреждения не одинаков для DEV и PROD, это может объяснить разницу в поведении.

В моем случае с TCPDF у меня было много предупреждений, таких как "date() небезопасно полагаться на системные настройки часового пояса...", затем ошибка "Некоторые данные уже были выведены в браузер, не могу отправить PDF".
Добавление функции date_default_timezone_set() в мой исходный код php решило предупреждения и ошибку.

person tetorea    schedule 10.04.2014
comment
Это было полезно. Была та же проблема, оказалось, что это было потому, что я оставил отчет об ошибках включенным (пока я не закончу настройку нового сервера). Спасибо - person Avi Kehat; 02.07.2017

У меня такая же проблема, и я добавляю эту строку перед $pdf->output():

error_reporting(E_ALL);

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

Удачи !!

С Уважением

person Nicolas400    schedule 02.09.2014

Возможно, это происходит из-за того, что в вашем результате HTML-кода есть ошибка для вывода для создания TCPDF...

OR

Если вышеуказанное не работает, попробуйте установить кодировку как UTF-8 в файле класса TCPDF, возможно, это решит вашу проблему...

Поскольку такая ошибка происходила в моем проекте неделю назад...

person Jignesh Vagh    schedule 10.09.2014

Удалите все файлы, которые вы бы включили в начале страницы. В моем случае это был файл, который подключался к базе данных. Это сработало для меня. (Совет от @Nicolas400)

person Zigsaw Consultancy    schedule 17.10.2016

Попробуйте использовать ob_clean(); перед include("../mpdf.php");.

person Sawan    schedule 23.01.2018

У меня такая же ошибка.

Data has already been sent to output, unable to output PDF file

Это означает, что перед созданием pdf с помощью mPDF некоторые данные сохраняются в буфере, который отправляется в браузер. Поэтому он не может создать PDF.

Просто сделайте это.. Добавьте эту встроенную функцию php ниже в первую строку вашей страницы, где вы готовите данные для pdf.

op_start();

И добавьте эту встроенную функцию php ниже перед кодом mPDF (перед тем, где вы вызываете mpdf)

ob_end_flush();

require_once __DIR__ . '/vendor/autoload.php';

$mpdf = new \Mpdf\Mpdf();
$mpdf->WriteHTML($html);
$mpdf->Output();

Так что он очистит весь вывод буфера перед обработкой mPDF.

person Khushal Nayani    schedule 10.09.2020

У меня такая же ошибка.

Решите это, используя op_start(); и ob_end_clean();

PHP является интерпретируемым языком, поэтому каждый оператор выполняется один за другим, поэтому PHP имеет тенденцию отправлять HTML в браузеры фрагментами, что снижает производительность. Используя буферизацию вывода, сгенерированный HTML сохраняется в буфере или строковой переменной и отправляется в буфер для рендеринга после выполнения последнего оператора в скрипте PHP.

Но буферизация вывода не включена по умолчанию. Чтобы включить буферизацию вывода, необходимо использовать функцию ob_start() перед любым отображением любого HTML-контента в скрипте.

[ссылочный кредит][1]

[PHP | Функция ob_start()][2]

public function gen_pdf($html, $user_id, $paper = 'A4') {
        ob_start();//Enables Output Buffering
        $mpdf = new mPDF('UTF-8', $paper, '', '', 15, 15, 30, 20, 15, 5);
        $mpdf->mirrorMargins = 1; // Use different Odd/Even headers and footers and mirror margins

        $header = '';
        $footer = '';
        
        $mpdf->SetHTMLHeader($header);
        $mpdf->SetHTMLFooter($footer);

        $mpdf->SetWatermarkText('Watermark', 0.1);
        $mpdf->showWatermarkText = true;
        $mpdf->WriteHTML($html);
        $fileName = date('Y_m_d_H_i_s');
        ob_end_clean();//End Output Buffering
        $mpdf->Output('Example_' . $fileName . '.pdf', 'I');
    }

Так что он очистит весь буферизованный вывод перед обработкой mPDF.

Удачи... [1]: https://www.geeksforgeeks.org/php-ob_start-function/ [2]: https://www.php.net/manual/en/function.ob-start.php

person Nurullah    schedule 20.10.2020