web-dev-qa-db-fra.com

Afficher un PDF fichiers dans le navigateur de l'utilisateur via PHP / Perl

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 effectué une recherche sur Internet et je n'ai trouvé que la façon d'afficher la boîte de dialogue de sauvegarde aux utilisateurs et de créer un fichier PDF, et non de montrer les fichiers aux utilisateurs.

Ce que je voulais, c’est afficher les utilisateurs mes fichiers pdf, ne pas créer ou télécharger le pdf. Voici ce que j'ai reçu de la documentation officielle 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, dites-le-moi s'il vous plaît. Mais je ne suis pas sûr que mon serveur prenne en charge Rails.

Désolé si mon code est trop éloigné de la méthode d'affichage du fichier PDF, car je ne connais rien au traitement des fichiers PDF et à la mise en œuvre de ce problème.

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

edit: Je veux montrer un fichier pdf simple. 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: Le code fonctionne maintenant. 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! :)

117
dimassony

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

N'oubliez pas non plus 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 (Adobe Reader, par exemple).

49
Stephen
    $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
14
Kareem

Vous pouvez modifier un rendu PDF tel que xpdf ou evince pour le rendre dans une image graphique sur votre serveur, puis transmettre l'image à l'utilisateur. C’est ainsi que fonctionnent les fichiers Aperç de PDF de Google: ils le restituent localement, puis livrent des images à l'utilisateur. Aucun fichier PDF téléchargé, et la source est assez bien obscurcie. :)

4
sarnold

Le moyen le plus sûr d’avoir un affichage PDF au lieu d’un téléchargement semble l’incorporer à l’aide d’un élément object ou iframe. Il existe également des solutions tierces telles que le visualiseur PDF de Google.

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

Il y a aussi DoPDF , un visualiseur basé sur Java dans le navigateur PDF. Je ne peux pas parler de sa qualité mais ça a l'air intéressant.

1
Pekka 웃

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.

0
tapananand