Πώς να κάνετε το αρχείο PDF downloadable σε σύνδεσμο HTML;

Δίνω σύνδεσμο ενός αρχείου pdf στην ιστοσελίδα μου για λήψη, όπως παρακάτω

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

Το πρόβλημα είναι ότι όταν ο χρήστης κάνει κλικ σε αυτόν τον σύνδεσμο τότε

  • Εάν ο χρήστης έχει εγκαταστήσει το Adobe Acrobat, τότε ανοίγει το αρχείο στο ίδιο παράθυρο του προγράμματος περιήγησης στο Adobe Reader.
  • Εάν το Adobe Acrobat δεν είναι εγκατεστημένο, τότε εμφανίζεται αναδυόμενο παράθυρο στο χρήστη για τη λήψη του αρχείου.

Θέλω όμως να εμφανίζεται πάντα αναδυόμενο παράθυρο στο χρήστη για λήψη, ανεξάρτητα από το αν το "Adobe Acrobat" είναι εγκατεστημένο ή όχι.

Παρακαλώ πείτε μου πώς μπορώ να το κάνω αυτό;

Λύση

Αντί να παραπέμψετε στο αρχείο .PDF, κάντε κάτι σαν

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

το οποίο εξάγει μια προσαρμοσμένη επικεφαλίδα, ανοίγει το PDF (ασφαλές δυαδικό αρχείο) και εκτυπώνει τα δεδομένα στο πρόγραμμα περιήγησης του χρήστη, ο οποίος μπορεί να επιλέξει να αποθηκεύσει το PDF παρά τις ρυθμίσεις του προγράμματος περιήγησης. Το αρχείο pdf_server.php θα πρέπει να μοιάζει με αυτό:

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

ΥΓ: και προφανώς εκτελέστε κάποιους ελέγχους λογικής στη μεταβλητή "file" για να αποτρέψετε τους ανθρώπους από το να κλέψουν τα αρχεία σας, όπως don't accept file extensions, deny slashes, add .pdf to the value

Σχόλια (12)

Αυτό είναι το κλειδί:

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

Ο τύπος περιεχομένου application/x-pdf-document ή application/pdf αποστέλλεται κατά την αποστολή αρχείου PDF. Το Adobe Reader συνήθως ορίζει τον χειριστή για αυτόν τον τύπο MIME, ώστε το πρόγραμμα περιήγησης να μεταβιβάζει το έγγραφο στο Adobe Reader όταν λαμβάνεται οποιοσδήποτε από τους τύπους MIME PDF.

Σχόλια (0)

Σε μια εφαρμογή Ruby on Rails (ειδικά με κάτι σαν το Prawn gem και το πρόσθετο Prawnto Rails), μπορείτε να το πετύχετε αυτό λίγο πιο απλά από ένα πλήρες σενάριο (όπως το προηγούμενο παράδειγμα PHP).

Στον ελεγκτή σας:

def index

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

Το τμήμα render :layout => false λέει στο πρόγραμμα περιήγησης να ανοίξει την ερώτηση "Θέλετε να κατεβάσετε αυτό το αρχείο; " αντί να προσπαθήσει να κάνει render το PDF. Τότε θα μπορείτε να συνδέσετε το αρχείο κανονικά: http://mysite.com/myawesomepdf.pdf

Σχόλια (3)