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...
0 votes
Stephen, il est bien sûr possible de masquer le chemin d'accès réel, mais ce que l'OP semble vouloir, c'est masquer l'URL pour éviter le vol.
0 votes
Supposons que les utilisateurs disposent du plug-in Adobe Reader. Alors, comment résoudre le problème ?
0 votes
L'OP dit spécifiquement que la raison d'utiliser cette méthode est de suivre les clics.
0 votes
@Pekka désolé si ma question n'est pas claire pour vous. Ce que je voulais faire, c'est montrer à l'utilisateur un fichier pdf simple, en supposant que l'utilisateur a Adobe Reader. Les objectifs : 1) Les utilisateurs sont capables de sauvegarder mes fichiers pdf. 2) Je peux suivre mes fichiers pdf. 3) Je peux montrer des pages alternatives du pdf à l'utilisateur si celui-ci n'a pas le plug-in. 4) Je peux bloquer certains clients, et 5) Je peux utiliser mod_rewrite de Apache HTTPD pour utiliser des urls fantaisistes.
0 votes
@dimassony assez juste, cela rend les choses claires. La suggestion de @Stephen devrait être la bonne solution.
0 votes
@Stephen savez-vous comment le faire fonctionner ?
0 votes
Merci, mon IE10 a besoin de header('Accept-Ranges : bytes') ; pour fonctionner !
0 votes
N'oubliez pas de 'exit;' après le fichier de lecture. Si vous ne le faites pas, cela peut provoquer l'erreur pdf 'le fichier est endommagé et ne peut être réparé'.
0 votes
Accept-Ranges: bytes
indique à Adobe Reader et aux autres plugins PDF qu'ils peuvent émettre des messages intelligents.Range: bytes=XXX-YYY
Demandes HTTP pour télécharger des pages du fichier PDF, au lieu de l'ensemble du fichier en une seule fois.0 votes
Eh bien, le code fonctionne bien avec Mozilla Safari et Chrome, mais je suis ici avec une autre question. Si j'ai idm (internet download manager) installé dans mon PC, il force toujours le fichier à télécharger et ne laisse pas le navigateur ouvrir le fichier ... alors comment pouvons-nous empêcher les gestionnaires de téléchargement de saisir notre lien.