В Chrome появилось сообщение об ошибке «Не удалось загрузить документ PDF» во встроенных файлах PDF. - PullRequest
6 голосов
/ 15 апреля 2011

У меня проблема с чтением PDF-файла в Chrome с использованием PHP.

Следующий код, как я делаю в 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 как встроенный. Потому что я хочу отобразить файл PDF, если в браузере пользователя есть встроенный плагин для просмотра PDF. Как вы, возможно, знаете, в Chrome есть встроенная программа просмотра PDF.

Проблема в том, что у меня есть куча PDF-файлов на сервере. Только некоторые из них могут быть просмотрены Chrome. Я не могу понять, почему другие не могут работать так же. Я проверил разрешение каждого файла. Похоже, не проблема разрешения.

Кто-нибудь знает, в чем проблема? Спасибо.

Ответы [ 5 ]

11 голосов
/ 15 апреля 2011

Я боролся с этой же проблемой. Это настолько близко, насколько я получил к согласованным результатам во всех браузерах. Я думаю, что причина, по которой у вас могут возникнуть проблемы, заключается в том, что некоторые 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 голос
/ 10 декабря 2015

Была такая же проблема, 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');
1 голос
/ 17 июня 2015

я исправил таким образом

$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);
0 голосов
/ 17 июля 2019

Для меня добавление следующего заголовка исправило эту досадную ошибку Chrome (?):

    header('HTTP/1.1 200 OK');
0 голосов
/ 12 ноября 2014

У меня была похожая проблема, но я заметил, что порядок имеет значение.Кажется, что ; 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...