Mostra un file PDF nel browser degli utenti tramite PHP / Perl


121

Voglio mostrare ai miei utenti i file PDF. Il motivo per cui utilizzo cgi per mostrare il pdf è che desidero tenere traccia dei clic per il pdf e nascondere la posizione reale del pdf salvato.

Ho cercato su Internet e ho trovato solo come mostrare la finestra di dialogo di salvataggio agli utenti e creare un pdf, non mostrare i file agli utenti.

Quello che volevo era mostrare agli utenti i miei file pdf, non creare o scaricare il pdf. Ecco cosa ho ottenuto dalla documentazione ufficiale di php:

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

Anche il mio codice perl dei risultati di ricerca di 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

se lo fai su ruby, per favore dillo a me. Ma non sono sicuro che il supporto del mio server ritorni.

Scusa se il mio codice è troppo lontano dal metodo per mostrare il pdf, poiché non so nulla sull'elaborazione del pdf e su come implementare questo problema.

Supponiamo che gli utenti dispongano del plug-in di Adobe Reader. Quindi, come risolvere il mio problema?

modifica : voglio mostrare un semplice file pdf. Il mio scopo principale: tenere traccia dei miei file pdf e utilizzare alcuni URL fantasiosi.

modifica : ecco il mio codice php principale:

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

modifica : ora il codice funziona. Ma la barra di avanzamento del caricamento (sul plug-in Adobe Reader X) non viene visualizzata. Perché? Qualcuno può aiutarmi? Ecco il mio codice principale:

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

modifica : tutti i miei problemi risolti. Ecco il codice finale:

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

Grazie! :)


4
"show" è possibile solo se sul client è installato il plug-in di Acrobat Reader. Altrimenti, sarà sempre servito come file di download, non c'è niente che puoi fare al riguardo. Anche oscurare il percorso del PDF è impossibile, è banale scoprirlo. Cosa stai cercando di fare? Forse ci sono alcune alternative se sappiamo di più sui tuoi obiettivi
Pekka

4
il plug-in Adobe Reader è necessario solo se utilizzi un browser che non gestisce i PDF in modo nativo. inoltre, se il PDF viene inviato al browser tramite PHP / Perl, è molto possibile oscurare il percorso PDF reale, o anche averlo fuori dal docroot in modo che non sia direttamente accessibile.
Stephen

1
Adobe Reader è richiesto solo se l'utente utilizza un browser che non gestisce i PDF in modo nativo ...
GolezTrol

@Stephen è ovviamente possibile oscurare il percorso reale, ma ciò che l'OP sembra volere è oscurare l'URL per prevenire il furto.
Pekka

Supponiamo che gli utenti dispongano del plug-in Adobe Reader. Quindi, come risolvere il mio problema?
dimassony

Risposte:


49

Presumo che tu voglia che il PDF venga visualizzato nel browser, piuttosto che forzare un download. In tal caso, prova a impostare l' Content-Dispositionintestazione con un valore diinline .

Ricorda inoltre che ciò sarà influenzato anche dalle impostazioni del browser: alcuni browser potrebbero essere configurati per scaricare sempre file PDF o aprirli in un'applicazione diversa (ad esempio Adobe Reader)


Sì. Ma quando provo il tuo suggerimento, ricevo un errore che dice "Il file non inizia con '% PDF-'". Uso 'Content-Disposition: inline; filename = "the.pdf"'. Ho fatto un errore?
dimassony

4
<? intestazione php ('Content-type: application / pdf'); header ('Content-Disposition: inline; filename = "the.pdf"'); ReadFile ( '/ dir / a / the.pdf'); ?>
dimassony

sembra che non sia un file PDF valido?
Stephen

@Stephen Quando apro direttamente il file, funziona. Ma quando uso la distribuzione del contenuto in linea, non funziona.
dimassony

7
bello sentire e bello conoscere la soluzione! Sarebbe bello se potessi pubblicare il codice finale che mostra quali intestazioni stai inviando, per chiunque altro incontri questa domanda.
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);

Testato e funziona bene. Se invece desideri che il file venga scaricato, sostituisci

    Content-Disposition: inline

con

    Content-Disposition: attachment

Perché stai disattivando la compressione? ini_set ( 'zlib.output_compression', '0');
Enigma Plus

Perché la compressione zlib non funziona con ob_gzhandler () e questo è uno snippet di codice piuttosto che uno script completo. Ngnix gestisce la compressione meglio di php. Puoi usare zlib se si adatta alla tua app e alla configurazione del server.
Kareem,

4

È possibile modificare un renderer PDF come xpdf o evince per renderizzarlo in un'immagine grafica sul server, quindi consegnare l'immagine all'utente. Questo è il modo in cui funziona la visualizzazione rapida dei file PDF di Google , vengono visualizzati localmente, quindi forniscono immagini all'utente. Nessun file PDF scaricato e la fonte è abbastanza ben oscurata. :)


Questo è l'unico modo veramente sicuro per prevenire il furto del documento originale.
Pekka

1
Non mi importa del furto di documenti originali. Altrimenti, volevo che gli utenti potessero salvarlo. Inoltre, volevo bloccare alcune intestazioni client. E forse implementerò il tuo suggerimento quando l'utente non ha Adobe Reader.
dimassony

Inoltre, non sarebbe un furto, perché l'originale è ancora lì.
Svante

@Svante - Dubito che i proprietari di proprietà intellettuale siano d'accordo con la tua logica.
ashleedawg

@ashleedawg: Dubito del soprannome di "proprietà intellettuale". Questa è solo una parola hacking per far sembrare l'accumulo di informazioni non solo un modello di business legittimo, ma anche utile per il pubblico per difendersi dall'innovazione.
Svante

1

Il modo più sicuro per visualizzare un PDF invece del download sembra essere incorporarlo utilizzando un elemento objecto iframe. Esistono anche soluzioni di terze parti come il visualizzatore PDF di Google.

Vedere Modo migliore per incorporare PDF in HTML per una panoramica.

C'è anche DoPDF , un visualizzatore di PDF nel browser basato su Java. Non posso parlare della sua qualità ma sembra interessante.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.