Zeigen Sie eine PDF-Datei im Browser des Benutzers über PHP / Perl an

121

Ich möchte meinen Benutzern PDF-Dateien anzeigen. Der Grund, warum ich cgi verwende, um das PDF anzuzeigen, ist, dass ich die Klicks für das PDF verfolgen und den tatsächlichen Speicherort des gespeicherten PDFs verschleiern möchte.

Ich habe im Internet gesucht und nur herausgefunden, wie ich den Benutzern den Dialog zum Speichern und Erstellen eines PDFs zeigen kann, nicht die Dateien den Benutzern.

Was wollte ich ist zeigen die Benutzer meine PDF - Dateien, nicht die Erstellung oder laden Sie die pdf. Folgendes habe ich aus der offiziellen PHP-Dokumentation erhalten:

<?php
header('Content-type: application/pdf');
readfile('the.pdf');
?>

Auch mein Google-Suchergebnis-Perl-Code:

open(PDF, "the.pdf") or die "could not open PDF [$!]";
binmode PDF;
my $output = do { local $/; <PDF> };
close (PDF);

print "Content-Type: application/pdf\n";
print "Content-Length: " .length($output) . "\n\n";
print $output

Wenn du es auf Rubin machst, sag es mir bitte. Ich bin mir jedoch nicht sicher, ob mein Server Schienen unterstützt.

Es tut mir leid, wenn mein Code zu weit von der Methode entfernt ist, um das PDF anzuzeigen, da ich nichts über die PDF-Verarbeitung und die Implementierung dieses Problems weiß.

Nehmen wir an, die Benutzer haben das Adobe Reader-Plug-In. Wie kann ich mein Problem beheben?

Bearbeiten : Ich möchte eine einfache PDF-Datei anzeigen. Mein Hauptzweck: Verfolge meine PDF-Dateien und verwende einige ausgefallene URLs.

edit : Hier ist mein Haupt-PHP-Code:

<?php
$file='/files/the.pdf';
header('Content-type: application/pdf');
header('Content-Disposition: inline; filename="the.pdf"');
@readfile($file);
?>

Bearbeiten : Jetzt funktioniert der Code. Der Ladefortschrittsbalken (im Adobe Reader X-Plugin) wird jedoch nicht angezeigt. Warum? Kann mir jemand helfen? Hier ist mein Hauptcode:

<?php
$file='./files/the.pdf';
header('Content-type: application/pdf');
header('Content-Disposition: inline; filename="the.pdf"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($file));
@readfile($file);
?>

edit : Alle meine Probleme gelöst. Hier ist der endgültige Code:

<?php
$file = './path/to/the.pdf';
$filename = 'Custom file name for the.pdf'; /* Note: Always use .pdf at the end. */

header('Content-type: application/pdf');
header('Content-Disposition: inline; filename="' . $filename . '"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($file));
header('Accept-Ranges: bytes');

@readfile($file);
?>

Vielen Dank! :) :)

Dimassonie
quelle
4
"show" ist nur möglich, wenn auf dem Client das Acrobat Reader-Plug-In installiert ist. Andernfalls wird es immer als Download-Datei bereitgestellt. Daran können Sie nichts ändern. Es ist auch unmöglich, den Pfad der PDF zu verschleiern. Es ist trivial, dies herauszufinden. Was versuchen Sie zu tun? Vielleicht gibt es einige Alternativen, wenn wir mehr über Ihre Ziele wissen
Pekka
4
Das Adobe Reader-Plugin ist nur erforderlich, wenn Sie einen Browser verwenden, der PDFs nicht nativ verarbeitet. Wenn das PDF über PHP / Perl an den Browser gesendet wird, ist es sehr gut möglich, den tatsächlichen PDF-Pfad zu verdecken oder ihn sogar außerhalb der Docroot zu haben, sodass er nicht direkt zugänglich ist.
Stephen
1
Adobe Reader ist nur erforderlich, wenn der Benutzer einen Browser verwendet, der PDFs nicht nativ verarbeitet ...
GolezTrol
@Stephen ist es natürlich möglich, den realen Pfad zu verdecken, aber was das OP zu wollen scheint, ist, die URL zu verdecken, um Diebstahl zu verhindern.
Pekka
Nehmen wir an, die Benutzer haben das Adobe Reader-Plug-In. Wie kann ich mein Problem beheben?
Dimassony

Antworten:

49

Ich gehe davon aus, dass die PDF-Datei im Browser angezeigt werden soll, anstatt einen Download zu erzwingen. Wenn dies der Fall ist, setzen Sie den Content-DispositionHeader auf den Wert inline.

Denken Sie auch daran, dass dies auch von den Browsereinstellungen beeinflusst wird. Einige Browser sind möglicherweise so konfiguriert, dass PDF-Dateien immer heruntergeladen oder in einer anderen Anwendung (z. B. Adobe Reader) geöffnet werden.

Stephen
quelle
Ja. Aber wenn ich Ihren Vorschlag versuche, erhalte ich die Fehlermeldung "Datei beginnt nicht mit '% PDF-'". Ich benutze 'Content-Disposition: inline; Dateiname = "the.pdf" '. Habe ich einen fehler gemacht
Dimassony
4
<? php header ('Inhaltstyp: application / pdf'); Header ('Content-Disposition: Inline; Dateiname = "the.pdf"'); readfile ('/ dir / to / the.pdf'); ?>
Dimassony
klingt wie es keine gültige PDF-Datei ist?
Stephen
@ Stephen Wenn ich direkt auf die Datei öffne, funktioniert es. Aber wenn ich die Inline-Inhaltsdisposition verwende, funktioniert es nicht.
Dimassony
7
Gut zu hören und toll, die Lösung zu kennen! Es wäre gut, wenn Sie den endgültigen Code für alle anderen Personen, die auf diese Frage stoßen, veröffentlichen könnten, aus denen hervorgeht, welche Header Sie senden.
Stephen
18
    $url ="https://yourFile.pdf";
    $content = file_get_contents($url);

    header('Content-Type: application/pdf');
    header('Content-Length: ' . strlen($content));
    header('Content-Disposition: inline; filename="YourFileName.pdf"');
    header('Cache-Control: private, max-age=0, must-revalidate');
    header('Pragma: public');
    ini_set('zlib.output_compression','0');

    die($content);

Getestet und funktioniert gut. Wenn Sie möchten, dass die Datei stattdessen heruntergeladen wird, ersetzen Sie sie

    Content-Disposition: inline

mit

    Content-Disposition: attachment
Kareem
quelle
Warum schalten Sie die Komprimierung aus? ini_set ('zlib.output_compression', '0');
Enigma Plus
Weil die zlib-Komprimierung mit ob_gzhandler () nicht funktioniert und dies eher ein Codeausschnitt als ein vollständiges Skript ist. Ngnix handhabt die Komprimierung besser als PHP. Sie können zlib verwenden, wenn es zu Ihrer App und Ihrem Server-Setup passt.
Kareem
4

Sie können einen PDF-Renderer wie xpdf oder evince so ändern, dass er auf Ihrem Server in ein Grafikbild gerendert wird, und das Bild dann dem Benutzer bereitstellen. So funktioniert Googles Schnellansicht von PDF-Dateien. Sie rendern lokal und liefern dann Bilder an den Nutzer. Keine heruntergeladene PDF-Datei, und die Quelle ist ziemlich gut verdeckt. :) :)

Sarnold
quelle
Dies ist der einzig wirklich sichere Weg, um den Diebstahl des Originaldokuments zu verhindern.
Pekka
1
Der Diebstahl von Originaldokumenten macht mir nichts aus. Ansonsten wollte ich, dass Benutzer es speichern können. Außerdem wollte ich einige Client-Header blockieren. Und vielleicht werde ich Ihren Vorschlag umsetzen, wenn der Benutzer keinen Adobe Reader hat.
Dimassony
Außerdem wäre es kein Diebstahl, denn das Original ist noch da.
Svante
@Svante - Ich bezweifle, dass Inhaber von geistigem Eigentum Ihrer Logik zustimmen würden.
Ashleedawg
@ashleedawg: Ich bezweifle den Spitznamen "geistiges Eigentum". Dies ist nur ein Wort-Hacking, um das Horten von Informationen nicht nur als legitimes Geschäftsmodell erscheinen zu lassen, sondern auch als lohnenswert für die Öffentlichkeit, sich gegen Innovationen zu verteidigen.
Svante
1

Der sicherste Weg, eine PDF-Anzeige anstelle eines Downloads zu haben, scheint darin zu bestehen, sie mit einem objectoder iframe-Element einzubetten. Es gibt auch Lösungen von Drittanbietern wie den PDF-Viewer von Google.

Eine Übersicht finden Sie unter Beste Möglichkeit, PDF in HTML einzubetten .

Es gibt auch DoPDF , einen Java-basierten PDF-Viewer im Browser. Ich kann nicht mit seiner Qualität sprechen, aber es sieht interessant aus.

Pekka
quelle
0

Sie können auch die fpdf-Klasse verwenden, die unter folgender Adresse verfügbar ist: http://www.fpdf.org . Es bietet Optionen für die Ausgabe in eine Datei und die Anzeige im Browser.

Tapananand
quelle