Chrome has "Failed to load PDF document" error message on inline PDFs

I have a problem with reading pdf file in Chrome by using PHP.

The following code is how I do in PHP

$path = "actually file path";
header("Pragma: public");
header("Expires: 0");
header("Content-type: $content_type");
header('Cache-Control: private', FALSE);
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header("Content-Disposition: inline; filename=\"$filename\"");
header('Content-Transfer-Encoding: binary');
header('Content-Length' . filesize($path));
ob_clean();
flush();
readfile($path);

In here, I set the Content-Disposition to inline. Because I want to display the pdf file if user browser have build-in pdf viewer plugin. As you may know, Chrome has build-in pdf viewer.

The problem is I have bunch of pdf files on the server. Only some of them can be viewed by Chrome. I can’t figure out why others can not work the same way. I have checked the permission of each files. It looks like not the permission problem.

Is there anyone know what the problem is? Thank you.

Here is Solutions:

We have many solutions to this problem, But we recommend you to use the first solution because it is tested & true solution that will 100% work for you.

Solution 1

I’ve been wrestling with this same issue. This is as close as I got to consistent results across browsers. I think that the reason you could be having problems is if some PDF’s are too large for readfile() to handle correctly. Try this:

$file = "path_to_file";
$fp = fopen($file, "r") ;

header("Cache-Control: maxage=1");
header("Pragma: public");
header("Content-type: application/pdf");
header("Content-Disposition: inline; filename=".$myFileName."");
header("Content-Description: PHP Generated Data");
header("Content-Transfer-Encoding: binary");
header('Content-Length:' . filesize($file));
ob_clean();
flush();
while (!feof($fp)) {
   $buff = fread($fp, 1024);
   print $buff;
}
exit;

Solution 2

I had similar issue but I noticed the order matters. Seems that ; filename= must have quotes around it, Content-Disposition: attachment Try this:

    $file = "/files/test.pdf";
    $finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension
    $mime = finfo_file($finfo, $file);

    header('Pragma: public');
    header('Expires: 0');
    header('Content-Type: $mime');
    header('Content-Description: File Transfer');
    header('Content-Disposition: attachment; filename="'.basename($file).'"'));
    header('Content-Transfer-Encoding: binary');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Content-Length' . filesize($file));
    ob_clean();
    flush();
    readfile($file);

Solution 3

i’ve fixed this way

$path = 'path to PDF file';
header("Content-Length: " . filesize ( $path ) ); 
header("Content-type: application/pdf"); 
header("Content-disposition: inline; filename=".basename($path));
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
ob_clean();
flush();
readfile($path);

Solution 4

Had the same problem, chrome didn’t display the inline PDF, stuck at loading. The solution was to add header('Accept-Ranges: bytes').

My complete code:

header('Content-Type: application/pdf');
header('Content-Disposition: inline; filename="'.$title.'"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: '.filesize($file));
header('Accept-Ranges: bytes');
header('Expires: 0');
header('Cache-Control: public, must-revalidate, max-age=0');

Solution 5

For me adding the following header fixed this annoying Chrome bug (?):

    header('HTTP/1.1 200 OK');

Solution 6

After hours wasted this…i added comments to point out that @Kal has the only solution that worked. But somehow that’s not enough…this is such an impossible and frustrating problem when Chrome does this:

Error Failed to load PDF document. Reload

Chrome has "Failed to load PDF document" error message on inline PDFs

Here is the diff that ended the torture.

-        // Waste time with chrome:
-        header("Content-type:application/pdf");
-        header("Content-Disposition:attachment;filename=$file_basename");
-        readfile($file);
         exit();
---------------------------

+        // Deliver the file:
+        header('Pragma: public');
+        header('Expires: 0');
+        header('Content-Type: $mime');
+        header('Content-Description: File Transfer');
+        header('Content-Disposition: attachment; filename="'.basename($file).'"');
+        header('Content-Transfer-Encoding: binary');
+        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
+        header('Content-Length'.filesize($file));
+        ob_clean();
+        flush();
+        readfile($file);
         exit();

For about thirty minutes i fooled with various variations of this…but i could not pin it down to "Add HTTP 200", not to "add bytes", not to "quote your filename", not to "separate the file ending". None of those worked.

(Thank you again @Kal).

Solution 7

I was having this issue, struggled for almost 6 hours and finally got it working. My solution is similar to the above answers but the above answers are not completed. There are three steps to solve this issue.

Step 1.
Go to php.ini file and add this line.

output_buffering = False

Step 2.
This error comes if you are opening a large PDF file. So, to solve this, just before adding headers, make sure you put these two lines.

set_time_limit(0); 
ini_set('memory_limit', '100M'); //the memory limit can be more or less depending on your file

Step 3.
Add below headers and the code to read the file, so the final code would like this.

set_time_limit(0); 
ini_set('memory_limit', '100M');

$file = "path/to/file.pdf";
header('Content-Type: application/pdf');
header('Content-Disposition: inline; 
filename="yourfilename.pdf"'); //not the path but just the name
header('Content-Transfer-Encoding: binary');
header('Content-Length: '.filesize($file));
header('Accept-Ranges: bytes');
header('Expires: 0');
header('Cache-Control: public, must-revalidate, max-age=0');
ob_clean();
flush();
readfile($file);
exit();

100% working solution. If you have any issues, let me know 🙂

Note: Use and implement solution 1 because this method fully tested our system.
Thank you 🙂

All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply