Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PDF Generation Results in ERR_INVALID_RESPONSE in Chrome

When generating a PDF in the browser programmatically (via PHP) the rendered PDF displays fine in both Firefox and Safari, but Chrome returns an ERR_INVALID_RESPONSE. It is a valid PDF - can be opened locally with Adobe Reader/Preview once saved from the working browsers, and will even open in Chrome once the PDF is saved from a different browser.

The PDF file is being read through file_get_contents(), is given a current timestamp and then passed to the browser. A workaround would involve saving the file to a temporary spot and redirecting the user (for Chrome, at least) but this is not ideal.

I've researched it and only been able to find bug reports dating from 2008.

I have an inkling it's a header error. After the PDF is generated, the following headers are sent to the browser (again working fine in FF, Safari and IE):

    header('Content-type:application/pdf');
    header("HTTP/1.1 200 OK");

I've also tried adding the following headers after searching on Stack Overflow, but to no avail:

    header("Content-Transfer-Encoding: binary");
    header('Accept-Ranges: bytes');

Are there missing headers that Chrome requires? Does anyone have experience with getting dynamically generated PDFs to display in Chrome?

EDIT: One of my more salient questions is what could be causing this to work fine locally in Chrome, but wouldn't work on a server environment.

like image 837
Andrew Klatzke Avatar asked Jan 04 '16 20:01

Andrew Klatzke


1 Answers

In my case I had to add these 2 parameters to headers because wordpress was sending 404 code as it didn't recognize the url of my php function:

header("Content-type: application/pdf",true,200);

as stated in this answer on wordpress.stackexchange.

This forces the headers to replace (2nd param true) the 404 status code generated by wordpress as it does not recognize the custom url, and sets 200 OK (3rd param 200).

So it ended being something like this:

$pdf_name = "test.pdf";
$pdf_file = "/absolute/path/to/my/pdfs/on/my/server/{$pdf_name}";
header('Content-type: application/pdf',true,200);
header("Content-Disposition: attachment; filename={$pdf_name}");
header('Cache-Control: public');
readfile($pdf_file);
exit();
like image 156
Cyberdelphos Avatar answered Oct 12 '22 12:10

Cyberdelphos