Afficher un fichier PDF dans le navigateur des utilisateurs via PHP / Perl

121

Je souhaite afficher les fichiers PDF de mes utilisateurs. La raison pour laquelle j'utilise cgi pour afficher le pdf est que je veux suivre les clics pour le pdf et masquer l'emplacement réel du pdf enregistré.

J'ai fait des recherches sur Internet et je n'ai trouvé que comment afficher la boîte de dialogue d'enregistrement aux utilisateurs et créer un pdf, sans montrer les fichiers aux utilisateurs.

Ce que je voulais, c'est montrer aux utilisateurs mes fichiers pdf, pas créer ou télécharger le pdf. Voici ce que j'ai obtenu de la documentation officielle de php:

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

Aussi mon code perl de résultat de recherche Google:

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

si vous le faites sur rubis, dites-le moi s'il vous plaît. Mais je ne sais pas si mon serveur prend en charge les rails.

Désolé si mon code est trop éloigné de la méthode pour afficher le pdf, car je ne sais rien sur le traitement des pdf et comment implémenter ce problème.

Supposons que les utilisateurs disposent du plug-in Adobe Reader. Alors, comment résoudre mon problème?

edit : Je veux afficher le fichier pdf brut. Mon objectif principal: suivre mes fichiers pdf et utiliser des URL sophistiquées.

edit : Voici mon code php principal:

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

edit : Maintenant, le code fonctionne. Mais la barre de progression du chargement (sur le plugin Adobe Reader X) ne s'affiche pas. Pourquoi? Est-ce que quelqu'un peut m'aider? Voici mon code principal:

<?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 : Tous mes problèmes sont résolus. Voici le code final:

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

Merci! :)

dimassonie
la source
4
"show" n'est possible que si le client a installé le plug-in Acrobat Reader. Sinon, il sera toujours servi comme fichier de téléchargement, vous ne pouvez rien y faire. Obscurcir le chemin du PDF est également impossible, il est trivial de le découvrir. Qu'essayez-vous de faire? Peut-être qu'il existe des alternatives si nous en savons plus sur vos objectifs
Pekka
4
le plugin Adobe Reader n'est requis que si vous utilisez un navigateur qui ne gère pas les PDF de manière native. aussi, si le PDF est envoyé au navigateur via PHP / Perl, il est très possible d'obscurcir le vrai chemin du PDF, ou même de l'avoir en dehors de la docroot pour qu'il ne soit pas directement accessible.
Stephen
1
Adobe Reader n'est requis que si l'utilisateur utilise un navigateur qui ne gère pas les PDF de manière native ...
GolezTrol
@Stephen il est bien sûr possible d'obscurcir le vrai chemin, mais ce que l'OP semble vouloir, c'est d'obscurcir l'URL pour éviter le vol.
Pekka
Supposons que les utilisateurs disposent du plug-in Adobe Reader. Alors, comment résoudre mon problème?
dimassony

Réponses:

49

Je suppose que vous voulez que le PDF s'affiche dans le navigateur, plutôt que de forcer un téléchargement. Si tel est le cas, essayez de définir l'en- Content-Dispositiontête avec une valeur de inline.

Souvenez-vous également que cela sera également affecté par les paramètres du navigateur - certains navigateurs peuvent être configurés pour toujours télécharger les fichiers PDF ou les ouvrir dans une autre application (par exemple Adobe Reader)

Stephen
la source
Oui. Mais quand j'essaye votre suggestion, j'obtiens une erreur disant "Le fichier ne commence pas par '% PDF-'". J'utilise 'Content-Disposition: inline; filename = "the.pdf" '. Ai-je fait une erreur?
dimassony
4
<? php header ('Content-type: application / pdf'); header ('Content-Disposition: inline; filename = "the.pdf"'); readfile ('/ dir / vers / le.pdf'); ?>
dimassony
semble que ce n'est pas un fichier PDF valide?
Stephen
@Stephen Quand j'ouvre droit au fichier, cela fonctionne. Mais quand j'utilise la dispisition de contenu en ligne, cela ne fonctionne pas.
dimassony
7
bon à entendre et bon de connaître la solution! Ce serait bien si vous pouviez publier le code final indiquant les en-têtes que vous envoyez, pour toute autre personne qui rencontre cette question.
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);

Testé et fonctionne très bien. Si vous souhaitez que le fichier soit téléchargé à la place, remplacez

    Content-Disposition: inline

avec

    Content-Disposition: attachment
Kareem
la source
Pourquoi désactivez-vous la compression? ini_set ('zlib.output_compression', '0');
Enigma Plus le
Parce que la compression zlib ne fonctionne pas avec ob_gzhandler () et qu'il s'agit d'un extrait de code plutôt que d'un script complet. Ngnix gère mieux la compression que php. Vous pouvez utiliser zlib si cela convient à la configuration de votre application et de votre serveur.
Kareem
4

Vous pouvez modifier un moteur de rendu PDF tel que xpdf ou prouver le rendu dans une image graphique sur votre serveur, puis fournir l'image à l'utilisateur. C'est ainsi que la vue rapide de Google sur les fichiers PDF fonctionne, ils le rendent localement, puis fournissent des images à l'utilisateur. Aucun fichier PDF téléchargé, et la source est assez bien obscurcie. :)

sarnold
la source
C'est le seul moyen vraiment sûr d'empêcher le vol du document original.
Pekka
1
Le vol de documents originaux ne me dérange pas. Sinon, je voulais que les utilisateurs puissent l'enregistrer. De plus, je voulais bloquer certains en-têtes de clients. Et peut-être que je mettrai en œuvre votre suggestion lorsque l'utilisateur n'a pas Adobe Reader.
dimassony
D'ailleurs, ce ne serait pas du vol, car l'original est toujours là.
Svante
@Svante - Je doute que les propriétaires de propriété intellectuelle soient d'accord avec votre logique.
ashleedawg
@ashleedawg: Je doute du surnom de «propriété intellectuelle». Il ne s'agit que de piratage de mots pour faire en sorte que la thésaurisation des informations ne soit pas seulement un modèle commercial légitime, mais qu'il soit également utile pour le public de se défendre contre l'innovation.
Svante
1

Le moyen le plus sûr d'avoir un affichage PDF au lieu de le télécharger semble être de l'incorporer à l'aide d'un élément objectou iframe. Il existe également des solutions tierces telles que la visionneuse PDF de Google.

Voir Meilleure façon d'incorporer un PDF dans HTML pour un aperçu.

Il existe également DoPDF , un visualiseur PDF intégré au navigateur basé sur Java. Je ne peux pas parler de sa qualité mais ça a l'air intéressant.

Pekka
la source
0

Vous pouvez également utiliser la classe fpdf disponible sur: http://www.fpdf.org . Il donne des options pour la sortie dans un fichier et l'affichage sur le navigateur.

tapananand
la source