Für ein Kundenprojekt (zufälligerweise das gleiche wie beim Artikel zum Thema WordPress-Seiten von der internen Suche auszuschliessen) ging es aktuell darum, ein PDF, das zum Download angeboten wird, nicht automatisch von Browsern wie Safari oder Chrome öffnen zu lassen.
Nachteile des automatischen Öffnens einer PDF
Augenscheinlich besitzt das Procedere der unmittelbaren PDF-Anzeige im Browser gewisse Vorzüge, ansonsten hätten die Entwickler von Safari (Preview) und Chrome (Chrome PDF Viewer) diese Funktionalität nicht installiert. Darüber hinaus gibt es auch (externe) Plugins für FireFox wie beispielsweise das PDF Browser Plugin oder die Option, den Adobe Acrobat Reader / Professional (AdobePDFViewer.plugin) dafür zu verwenden.
Dennoch ist das (aus Usability-Sicht) nicht immer das beste Vorgehen. Im vorliegenden Fall geht es um ein kostenpflichtiges PDF, das zum Kauf angeboten wird. Der User landet auf einer bestimmten Seite und bekommt das Ebook dort zum Download angeboten. Und wie immer geht auch dabei die Angst vor dem DAU um…
Wenn man nämlich die PDF von Safari automatisch geöffnet bekommt und z.B. direkt das erste Kapitel liest und den Browser danach schließt, dann ist die Datei erst einmal „verloren“. Natürlich hätte man das Dokument ganz einfach sichern können („Speichern Unter“), als es offen war (mobile bzw. iOS-Endgeräte: GoodReader App), aber daran denkt man halt nicht intuitiv – und warum sollte man auch?
Das ist schließlich Aufgabe des Betreibers / Webdesigners.
PDF Download erzwingen
Es gibt verschiedene Möglichkeiten, das automatische Öffnen im Browser zu unterbinden und den Download zu erzwingen. Schauen wir uns die Varianten an:
1. application/octet-stream
In der .htaccess kann man über die Angabe AddType application/octet-stream .xyz festlegen, dass der Dateityp mit der Endung .xyz als ausführbare Datei interprestiert werden soll. Als solche muss diese in einem (anderen) Programm geöffnet werden – deshalb umgeht das die eingebauten Öffnungs-Mechanismen von Browser oder Plugin.
Dabei kann man beliebig viele Dateiendungen / -varianten registrieren – einfach pro Zeile eine Endung festlegen.
AddType application/octet-stream .pdf
AddType application/octet-stream .csv
AddType application/octet-stream .xls
AddType application/octet-stream .doc
AddType application/octet-stream .avi
AddType application/octet-stream .mpg
AddType application/octet-stream .mov
Alternativ dazu nutzt man die Lösung von Thingy Ma Jig die eigentlich für die httpd.conf gedacht ist – das funktioniert aber (logischerweise) auch in der .htaccess. Ich habe keine wirklichen Unterschiede feststellen können, einzig die Auflistung mehrerer Dateiendungen dürfte bei dieser Variante einfacher sein.
<FilesMatch '.(?i:pdf)$'>
ForceType application/octet-stream
Header set Content-Disposition attachment
</FilesMatch>
2. PHP-Wrapper
Wenn man eine Lösung sucht, die nicht global fungiert und damit aussteuerbar ist, dann kann man zwar auch nur in den entsprechenden Ordnern die .htaccess-Direktive unterbringen. Eine andere Möglichkeit besteht aber auch darin, einen PHP-Wrapper zu verwenden. Das Prinzip funktioniert wie folgt:
A) PHP-Wrapper vorbereiten
Die PHP-Datei folgt der Logik der Content-Header bzw. der Content-Disposition. Dadurch, dass die PHP-Datei separat verlinkt/aufgerufen wird, muss der Browser auch nur für diesen Vorgang die Content-Rules beachten – andere PDFs sind dann nicht davon betroffen.
$file='meine-pdf-datei.pdf';
header('Content-Type: application/pdf');
header('Content-Length: '.filesize($file));
header('Content-Transfer-Encoding: binary');
header('Accept-Ranges: bytes');
header('Pragma: no-cache');
header('Expires: 0');
header('Content-Disposition: attachment; filename='.$file);
readfile('meine-pdf-datei.pdf');
Diese Datei abspeichern (meinedatei.php) und wie gewünscht auf dem Server ablegen (evtl. sinnvoll im Download-Ordner).
ACHTUNG: Chrome scheint bei einem Dateinamen mit Kommasetzung (Meine Datei, PDF.pdf) Probleme zu haben – zur Sicherheit zusammenhängend, lowercased und frei von Satzzeichen agieren…
B) HTML-Link zur PHP-Datei setzen
Jetzt wird statt der PDF die PHP-Datei verlinkt, ergo
<a href="/pfad-zu-meiner-datei/meinedatei.php">Some Text</a>
Für welche Variante haben Sie sich entschieden?
Hallo Henning,
vielen Dank für diese Info, hat mir sehr weiter geholfen. Allerdings funktioniert dieser Code leider nicht im aktuellen Firefox. Hast du eine Idee woran das liegen könnte?
Gruß aus Lennestadt
Daniel
Hey Daniel! Ich habe es tatsächlich noch nicht mit dem neuen Built-in PDF viewer von Firefox 19 ausprobiert – funktioniert aber anscheinend…
Hat sich erledigt! 🙂
Es geht auch noch eleganter mit HTML5 und dem „download“-Attribut: http://svarden.se/blog/2013-04-22-right-click-and-save-as — leider erst ab FF 20+ & Chrome 14+ verfügbar…
Super, vielen Dank,
das mit dem PHP-Wrapper kannte ich noch nicht …
Super wenn man ein Programmierer ist und kein Leie
Wenn das Ganze auch mit dem Chrome-Browser funktionieren würde, wäre das göttlich.
Kennt da jemand eine Lösung für?
Hallo Eduard,
die vorgestellte server-seitige Lösung sollte problemlos auch für Chrome funktionieren – oder hast du andere Erfahrungen gemacht? Falls es um die client- bzw. user-seitige Einstellung geht dann findest du hier mehr Infos: http://www.tipps-tricks-kniffe.de/google-chrome-den-internen-pdf-reader-deaktivieren-und-stattdessen-adobe-reader-oder-foxit-verwenden
Gruß!
Vielen Dank für die Anleitung. Die PHP Wrapper Variante war genau das, was ich gebraucht habe!
Hallo Henning Orth, vielen Dank für diesen sehr nützlichen Beitrag!
Da Möglichkeit 1 global wirkt, wollte ich gerne Möglichkeit 2 nutzen, da die Webbrowser PDF-Dateien mit 3D Objekten nicht korrekt anzeigen können.
Die Lösung funktioniert wunderbar. Nur leider zwischenzeitlich nicht mehr in Chrome.
Vermutlich scheint Chrome zwischenzeitlich Downloads anders zu handhaben.
Version Version 68.0.3440.106 (Offizieller Build) (32-Bit)
Die Datei wird automatisch heruntergeladen (ohne die Nachfrage ob sie in einem Programm geöffnet werden soll.)
Der Download wird in der Leiste unterm Fenster angezeigt. Klickt man dort auf die Datei, wird Sie wiederrum im Browser geöffnet. Nur mit Rechtsklick kann man erreichen, dass sie in einem geeigneten Programm (Acrobat Reader) angezeigt wird.
Die umständliche Erklärung, was zu tun ist, kann ich den Besuchern der Website nicht zumuten.
Vielleicht gibt es schon neue Lösungswege? 😉
Hallo Julia,
das ist eine User-seitige bzw. Chrome-spezifische Einstellung, darauf hat man als Betreiber m.W. keinen Einfluss. In den Download-Settings von Chrome lässt sich das anpassen, aber das ist ja für den User wenig hilfreich.
Da fällt mir aktuell auch kein vernünftiger Workaround ein, sorry…