PDF nicht im Browser öffnen (.htaccess)

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…

PDF nicht im Browser öffnen
Den PDF-Download kann man dem Browser beibringen.

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.

<?php
$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?

Weiterführende Links zur PDF Download-Problematik