2011-04-14 11 views
6

Tengo un problema al leer el archivo pdf en Chrome utilizando PHP.Chrome tiene el mensaje de error "No se pudo cargar el documento PDF" en archivos PDF en línea

El código siguiente es cómo lo hago en 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); 

En aquí, me puse el Content-Disposición de línea. Porque quiero mostrar el archivo pdf si el navegador del usuario tiene un plugin de visor de pdf incorporado. Como sabrá, Chrome tiene un visor de pdf incorporado.

El problema es que tengo un montón de archivos pdf en el servidor. Solo Chrome puede ver algunos de ellos. No puedo entender por qué otros no pueden trabajar de la misma manera. He verificado el permiso de cada archivo. Parece que no es el problema del permiso.

¿Alguien sabe cuál es el problema? Gracias.

+2

Cambiar para forzar una descarga (Content-disposition: attachment/Content-type: application/octet-stream), descargar/guardar la buena PDF y un mal pdf, y para comparar lo que se guardó en lo que hay en el servidor. –

+0

@Marc Intento eso. Ambos se pueden descargar y se ven iguales. También comparo eso con el archivo en el servidor. Ellos son lo mismo. Cuando vuelvo a la disposición de contenido: en línea. Simplemente no funciona. :(Incluso comparo el encabezado de respuesta. Son los mismos. – easycoder

+0

¿Qué sucede si intenta ver uno directamente en lugar de ir a través de su script? –

Respuesta

10

He estado luchando con este mismo problema. Esto es lo más cercano que tengo a los resultados consistentes en los navegadores. Creo que la razón por la que podría tener problemas es si algunos PDF son demasiado grandes para que readfile() los maneje correctamente. Prueba esto:

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

gracias mingala .. lo probaré. – easycoder

+1

parece que no funciona correctamente ... :( – easycoder

+1

¿Esto no funciona para ningún navegador o simplemente para Chrome? Podría intentar modificar el tamaño del búfer de 1024 a algo más pequeño. Si $ file está configurado como ruta completa para su documento, esta debería funcionar. Además, tenga en cuenta la variable $ myFileName en uno de los encabezados. Eso debe establecerse o eliminarse. – mingala

0

tuve problema similar, pero me di cuenta de los asuntos de orden. Parece que ; filename= debe tener comillas alrededor de él, Content-Disposition: attachment Prueba esto:

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

he fijado de esta manera

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

tenía el mismo problema, cromo no visualizar el PDF en línea, pegado a la carga . La solución fue agregar header('Accept-Ranges: bytes').

Mi código completo:

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