DOMPDF: Unable to stream pdf: headers already sent

2019-01-25 18:52发布

问题:

This question has been raised hundred of times in various fora; some have been solved, some not. I checked plenty of resources, but my issue could not be resolved. I am generating php page using smarty template based on html form input and uploaded files. Using dompdf, I want to save the generated page as a pdf file. When the user submits the multipart/form-data, data is posted to itself. Then it undergoes validation process. When all is fine, a new page is generated using a template file. There is no output, instead, dompdf utilizes the template file to stream the pdf file. After solving several stages of problems such as "DOMPDF not found", insufficient memory etc, I am now stuck with "Unable to stream pdf: headers already sent" error. One of the most common problems is presence of line break, white space or any output being before stream() is called. I checked for white space before and after ?. There are nor print_f or echo statements either. How can I troubleshoot this problem? Where does the problem lie...in the smarty template file or the php file itself? Here is the code:

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");

回答1:

simple solution :

write below lines before stream, it will show where exactly new line or space is coming

$f;
$l;
if(headers_sent($f,$l))
{
    echo $f,'<br/>',$l,'<br/>';
    die('now detect line');
}


回答2:

Most probably there's a whitespace or new line somewhere in your code causing this. Here's a simple way to debug it:

  1. echo something at the very end of your script (above the stream() call), for example echo "end!";exit;
  2. Click to "view source" of your page, which makes spaces easier to see
  3. If your "end!" string does not appear at the very start of your script, then somewhere there's a character printed
  4. Move the "echo end!" line further up to your code, until you locate where the space was inserted

Another possibility is that you are using a language string somewhere that introduces an unprintable character. If your application is multilingual, make sure you're testing using english



回答3:

I tried to echo out, but no white spaces or line breaks were found. At the end, I redirected the php to another page instead of PHP_SELF and the problem vanished. I did not alter any code. Looks like presence of html tags after the php ended was the offending factor.



回答4:

Be sure your editor does not add a Unicode Bom description - save code to file by Notepad, or (if you work in Dreamweaver) remove check by Asign Unicode Signature (BOM) or something. ;)



回答5:

Replace line 3105 of this file: dompdf/lib/class.pdf.php

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

With

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

Then in the file that is generating the pdf output e.g if you were outputting from a Joomla Component components/com_joomlacomponent/views/yourpdfdir/tmpl/default.php Enter immediately after the opening php tag

<?php
ob_start();


回答6:

I came across this issue. You want to check all the variables you are using. One or even more than one variable you are passing comes empty and is messing the render.

Start gradually, by getting rid of all the php and try to generate the pdf, then if it works for you add code block by block.

This will help you identify where the problem is.



回答7:

In my case the problem was solved by setting $_dompdf_show_warnings to false in dompdf_config_inc.php



回答8:

I had this issue, with no apparent output when viewing the source. The problem for me was that I had flushed the output, even though there was none except the headers, and that blocked streaming the output giving the "headers already sent" message. Which was true. My fix was to remove the flush() and ob_flush() statements, and the streaming output then worked.



回答9:

for me - solution was to encode my file to UTF-8 instead of UTF-8 BOM