126 votes

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

Je veux montrer à mes utilisateurs des fichiers PDF. La raison pour laquelle j'utilise un 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 la façon de montrer la boîte de dialogue d'enregistrement aux utilisateurs et de créer un PDF, mais pas de 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 google-search-result :

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 ruby, merci de me le dire. Mais je ne suis pas sûr que mon serveur supporte les rails.

Désolé si mon code est trop éloigné de la méthode pour afficher le pdf, puisque je ne connais rien au traitement des pdf et à la mise en œuvre de ce problème.

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

modifier : Je veux afficher un fichier PDF simple. Mon objectif principal est de suivre mes fichiers PDF et d'utiliser quelques urls fantaisistes.

modifier : Voici mon code php principal :

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

modifier : Maintenant le code fonctionne. Mais la barre de progression du chargement (sur le plugin Adobe Reader X) ne s'affiche pas. Pourquoi ? Quelqu'un peut-il 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);
?>

modifier : 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 ! :)

5 votes

La fonction "show" n'est possible que si le client a installé le plug-in Acrobat Reader. Sinon, il sera toujours servi comme un fichier à télécharger, il n'y a rien que vous puissiez faire à ce sujet. Obscurcir le chemin du PDF est également impossible, il est trivial de le découvrir. Qu'est-ce qu'on essaie de faire ? Il existe peut-être des alternatives si nous en savons plus sur vos objectifs.

4 votes

Le plugin Adobe Reader n'est nécessaire que si vous utilisez un navigateur qui ne gère pas les PDF en mode natif. de plus, si le PDF est envoyé au navigateur via PHP/Perl, il est muy Il est possible de masquer le chemin d'accès réel du PDF, ou même de le placer en dehors du répertoire docroot pour qu'il ne soit pas directement accessible.

1 votes

Adobe Reader n'est nécessaire que si l'utilisateur est d'utiliser un navigateur qui ne gère pas les PDF en natif...

49voto

Stephen Points 5339

Je suppose que vous voulez que le PDF s'affiche dans le navigateur, plutôt que de forcer un téléchargement. Si c'est le cas, essayez de définir le paramètre Content-Disposition avec une valeur de inline .

N'oubliez pas non plus que les paramètres du navigateur peuvent influer sur ce résultat. Certains navigateurs peuvent être configurés pour toujours télécharger des fichiers PDF ou les ouvrir dans une autre application (par exemple, Adobe Reader)

0 votes

Oui. Mais lorsque j'essaie 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 ?

5 votes

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

0 votes

Il semble que ce ne soit pas un fichier PDF valide ?

19voto

Karim Points 161
    $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 bien. Si vous voulez que le fichier soit téléchargé à la place, remplacez

    Content-Disposition: inline

avec

    Content-Disposition: attachment

0 votes

Pourquoi désactivez-vous la compression ? ini_set('zlib.output_compression', '0') ;

0 votes

Parce que la compression zlib ne fonctionne pas avec ob_gzhandler() et que c'est un bout de code plutôt qu'un script complet. Ngnix gère mieux la compression que php. Vous pouvez utiliser zlib si cela convient à votre configuration et à votre serveur.

3voto

sarnold Points 62720

Vous pourriez modifier un moteur de rendu de PDF tel que xpdf ou evince pour obtenir une image graphique sur votre serveur, puis fournir l'image à l'utilisateur. C'est de cette façon que le site Web de Google vue rapide des fichiers PDF fonctionne, ils le rendent localement, puis livrent les images à l'utilisateur. Pas de fichier PDF téléchargé, et la source est plutôt bien cachée :)

0 votes

C'est le seul moyen vraiment sûr d'éviter le vol du document original.

1 votes

Le vol du document original ne me dérange pas. Sinon, je voulais que les utilisateurs puissent le sauvegarder. Je voulais également bloquer certains en-têtes du client. Et peut-être que je mettrai en œuvre votre suggestion lorsque l'utilisateur n'a pas Adobe Reader.

1 votes

De plus, ce ne serait pas du vol, car l'original est toujours là.

2voto

Pekka 웃 Points 249607

Le moyen le plus sûr d'afficher un PDF au lieu de le télécharger semble être de l'intégrer à l'aide d'un fichier de type object o iframe élément. Il existe également des solutions tierces, comme la visionneuse PDF de Google.

Voir Meilleur moyen d'intégrer un PDF dans un HTML pour un aperçu.

Il y a aussi DoPDF un visualisateur de PDF en navigateur basé sur Java. Je ne peux pas parler de sa qualité mais il semble intéressant.

0voto

Tapan Anand Points 28

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X