DOMPDF: невозможно передать pdf поток: заголовки уже отправлены

Я создаю php-страницу с использованием шаблона smarty на основе ввода html-формы и загруженных файлов. Используя dompdf, я хочу сохранить сгенерированную страницу как файл pdf.

Когда пользователь отправляет multipart / form-data, данные отправляются самому себе. Затем он проходит процесс проверки. Когда все в порядке, новая страница создается с использованием файла шаблона. Нет вывода, вместо этого dompdf использует файл шаблона для потоковой передачи файла pdf. После решения нескольких этапов проблем, таких как DOMPDF не найден, нехватка памяти и т. Д., Я застрял с невозможностью потоковой передачи pdf: заголовки уже отправили ошибку.

Одна из наиболее распространенных проблем - наличие разрыва строки, пробела или любого вывода, предшествующего вызову stream (). Я проверил наличие пробелов до и после ‹? Php и› ?.

Также нет операторов print_f или echo. Как я могу решить эту проблему? В чем проблема ... в файле шаблона smarty или в самом файле php? Вот код:

require_once("dompdf/dompdf_config.inc.php");
spl_autoload_register('DOMPDF_autoload');
$html = $smarty->fetch('index.tpl');
$dompdf = new DOMPDF();
$dompdf->load_html($html);
$dompdf->set_paper('a4', 'portrait');
$dompdf->render();
$dompdf->stream("newfile.pdf");

person sridhar    schedule 22.10.2013    source источник
comment
Убедитесь, что сам dompdf (или smarty) не выполняет скрытый вывод. например закомментируйте вызов $ dompdf-stream (), нажмите URL-адрес и сохраните содержимое ... посмотрите, что там.   -  person Marc B    schedule 22.10.2013
comment
какую версию smarty вы используете? В некоторых старых версиях была проблема умного добавления пробелов в начале скомпилированного файла   -  person Borgtex    schedule 23.10.2013


Ответы (10)


простое решение:

напишите строки ниже перед потоком, он покажет, где именно идет новая строка или пробел

$f;
$l;
if(headers_sent($f,$l))
{
    echo $f,'<br/>',$l,'<br/>';
    die('now detect line');
}
person Muhammad    schedule 06.07.2015
comment
Вау, это гениально! Помог мне узнать, что удаленный файл включен в UTF-8, но не без спецификации. - person rAthus; 22.08.2016
comment
Здорово!!! Замечательно, что помогло мне решить проблему с уже отправленным заголовком при использовании библиотеки dompdf в Codeingitor. Спасибо!!! - person khushi; 21.09.2016
comment
Я удаляю все пробелы, все еще получаю ту же ошибку. Сообщите мне, если у вас есть другое решение. - person Kshitij Soni; 06.03.2017
comment
Я заключил свою разметку PDF в скобки php, а затем проделал логику после них. <?php ob_start(); ?> /* pdf markup */ <?php $html = ob_get_clean(); ?> <?php // more logic. Удаление ?> после исправления ob_get_clean();. - person Dan; 12.06.2019
comment
Гениальное решение! - person Arnis Juraga; 19.04.2020

Скорее всего, где-то в вашем коде есть пробел или новая строка, вызывающая это. Вот простой способ отладки:

  1. эхо что-то в самом конце вашего скрипта (над вызовом stream ()), например echo "end!";exit;
  2. Нажмите, чтобы "просмотреть исходный код" своей страницы, чтобы было легче увидеть места.
  3. Если ваш "конец!" строка не появляется в самом начале вашего скрипта, то где-то напечатан символ
  4. Переместите "конец эха!" линия до вашего кода, пока вы не найдете, где было вставлено пространство

Другая возможность состоит в том, что вы где-то используете языковую строку, которая вводит непечатаемый символ. Если ваше приложение многоязычно, убедитесь, что вы тестируете его на английском.

person periklis    schedule 23.10.2013

У меня была такая же проблема, и я решил эту проблему, добавив этот код в верхний файл:

ob_start();
person Farhan Yudhi Fatah    schedule 18.10.2020

Замените строку 3105 этого файла: dompdf/lib/class.pdf.php

if ( headers_sent()) {
  die("Unable to stream pdf: headers already sent");
}

С участием

$output = ob_get_clean();
if ( headers_sent()) {
    echo $output; }

Затем в файле, который генерирует вывод pdf, например, если вы выполняли вывод из компонентов компонента Joomla / com_joomlacomponent / views / yourpdfdir / tmpl / default.php Введите сразу после открывающего тега php

<?php
ob_start();
person OnTarget    schedule 08.10.2014

Я попытался повторить эхо, но не нашел пробелов или разрывов строк. В конце я перенаправил php на другую страницу вместо PHP_SELF, и проблема исчезла. Я не менял никакого кода. Похоже, что наличие html-тегов после завершения php было оскорбительным фактором.

person sridhar    schedule 23.10.2013
comment
Вы должны вызывать exit; после функции stream() - person periklis; 25.10.2013
comment
@periklis Спасибо. Этот exit; решает проблему заголовков, предупреждающих, когда DOMPDF упаковывается в Opencart как метод $ this- ›document-› pdf (). Это следует отметить где-то в документации (возможно, я это пропустил). - person dhaupin; 21.01.2016

Убедитесь, что ваш редактор не добавляет описание Unicode Bom - сохраните код в файл с помощью Блокнота или (если вы работаете в Dreamweaver) удалите проверку с помощью Asign Unicode Signature (BOM) или что-то в этом роде. ;)

person Księciunio    schedule 16.07.2014

Я столкнулся с этой проблемой. Вы хотите проверить все используемые вами переменные. Одна или даже несколько переменных, которые вы передаете, становятся пустыми и портят рендеринг.

Начните постепенно, избавляясь от всего php и пытаясь создать PDF-файл, а затем, если это сработает, добавьте код блок за блоком.

Это поможет вам определить, в чем проблема.

person william.eyidi    schedule 03.02.2015

У меня была эта проблема, при просмотре источника не было видимых результатов. Проблема для меня заключалась в том, что я сбросил вывод, хотя там не было ничего, кроме заголовков, и это заблокировало потоковую передачу вывода, давая сообщение «заголовки уже отправлены». Что было правдой. Мое исправление состояло в том, чтобы удалить операторы flush () и ob_flush (), и тогда потоковый вывод работал.

person Bob Hockney    schedule 06.08.2016

для меня решением было закодировать мой файл в UTF-8 вместо спецификации UTF-8

person Unkas    schedule 10.09.2016

В моем случае проблема была решена установкой $ _dompdf_show_warnings на false в dompdf_config_inc.php

person David    schedule 20.03.2015
comment
Скрытие ошибок на самом деле не решает их, даже если они могут не быть критическими - person Uriahs Victor; 31.05.2020