Chrome在内联PDF中“无法加载PDF文档”错误消息

时间:2011-04-14 23:16:05

标签: php pdf google-chrome

使用PHP在Chrome中阅读pdf文件时遇到问题。

以下代码是我在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);

在这里,我将Content-Disposition设置为inline。因为如果用户浏览器具有内置pdf查看器插件,我想显示pdf文件。您可能知道,Chrome内置了pdf查看器。

问题是我在服务器上有一堆pdf文件。 Chrome只能查看其中一些内容。我无法弄清楚为什么其他人不能以同样的方式工作。我检查了每个文件的权限。看起来不是许可问题。

有谁知道问题是什么?谢谢。

6 个答案:

答案 0 :(得分:10)

我一直在努力解决同样的问题。这与我在各种浏览器中获得一致结果非常接近。我认为你可能遇到问题的原因是,如果某些PDF文件太大而无法正确处理readfile()。试试这个:

$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;

答案 1 :(得分:1)

我已经修好了这个方式

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

答案 2 :(得分:1)

出现同样的问题,Chrome没有显示内联PDF,卡在加载时。解决方案是添加header('Accept-Ranges: bytes')

我的完整代码:

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

答案 3 :(得分:0)

我有类似的问题,但我注意到订单很重要。似乎; filename=必须有引号,Content-Disposition: attachment试试这个:

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

答案 4 :(得分:0)

对我来说,添加以下标头可解决此烦人的Chrome错误(?):

    header('HTTP/1.1 200 OK');

答案 5 :(得分:0)

在浪费了几个小时之后……我添加了评论以指出@Kal 拥有唯一有效的解决方案。但不知何故,这还不够......当 Chrome 这样做时,这是一个不可能且令人沮丧的问题:

<块引用>

错误 无法加载 PDF 文档。重新加载

enter image description here

这是结束折磨的差异。

-        // 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();

在大约三十分钟的时间里,我被它的各种变体愚弄了......但我可以不能将其归结为“添加 HTTP 200 ",不是“添加字节”,不是“引用您的文件名”,不是“分隔文件结尾”。这些都没有用。

(再次感谢@Kal)。