¿Cómo hacer que un archivo PDF se pueda descargar en un enlace HTML?

Estoy dando enlace de un archivo pdf en mi página web para descargar, como abajo

<a href="myfile.pdf">Download Brochure</a>

El problema es que cuando el usuario hace clic en este enlace entonces

  • Si el usuario tiene instalado Adobe Acrobat, entonces se abre el archivo en la misma ventana del navegador en Adobe Reader.
  • Si el Adobe Acrobat no está instalado, entonces aparece una ventana emergente para que el usuario descargue el archivo.

Pero quiero que siempre pop-up para el usuario para la descarga, independientemente de "Adobe Acrobat" está instalado o no.

Por favor, dígame cómo puedo hacer esto?

Solución

En lugar de enlazar con el archivo .PDF, haga algo como

<a href="pdf_server.php?file=pdffilename">Download my eBook</a>

que emite una cabecera personalizada, abre el PDF (binario seguro) e imprime los datos en el navegador del usuario, entonces ellos pueden elegir guardar el PDF a pesar de la configuración de su navegador. El pdf_server.php debe tener este aspecto:

header("Content-Type: application/octet-stream");

$file = $_GET["file"] .".pdf";
header("Content-Disposition: attachment; filename=" . urlencode($file));   
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");            
header("Content-Length: " . filesize($file));
flush(); // this doesn't really matter.
$fp = fopen($file, "r");
while (!feof($fp))
{
    echo fread($fp, 65536);
    flush(); // this is essential for large downloads
} 
fclose($fp); 

PS: y, obviamente, ejecutar algunas comprobaciones de cordura en el "archivo" variable para evitar que la gente de robar sus archivos, tales como don' aceptar las extensiones de archivo, negar las barras diagonales, añadir .pdf al valor

Comentarios (12)

Esta es la clave:

header("Content-Type: application/octet-stream");

El tipo de contenido application/x-pdf-document o application/pdf se envía al enviar un archivo PDF. Adobe Reader suele establecer el manejador para este tipo MIME para que el navegador pase el documento a Adobe Reader cuando se reciba cualquiera de los tipos MIME de PDF.

Comentarios (0)

En una aplicación Ruby on Rails (especialmente con algo como la gema Prawn y el plugin Prawnto Rails), se puede lograr esto de forma un poco más sencilla que con un script completo (como el ejemplo anterior de PHP).

En tu controlador:

def index

 respond_to do |format|
   format.html # Your HTML view
   format.pdf { render :layout => false }
 end
end

La parte de render :layout => false le dice al navegador que abra el prompt "¿Desea descargar este archivo?" en lugar de intentar renderizar el PDF. Entonces podrá enlazar con el archivo normalmente: http://mysite.com/myawesomepdf.pdf

Comentarios (3)