Menampilkan file PDF di browser pengguna melalui PHP / Perl

121

Saya ingin menampilkan file PDF pengguna saya. Alasan mengapa saya menggunakan cgi untuk menampilkan pdf adalah saya ingin melacak klik untuk pdf, dan menyembunyikan lokasi sebenarnya dari pdf yang disimpan.

Saya telah mencari di Internet dan hanya menemukan cara menampilkan dialog simpan kepada pengguna dan membuat pdf, bukan menampilkan file kepada pengguna.

Yang saya inginkan adalah menunjukkan kepada pengguna file pdf saya, bukan membuat atau mengunduh pdf. Inilah yang saya dapatkan dari dokumentasi resmi php:

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

Juga kode perl hasil pencarian google saya:

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

jika Anda melakukannya dengan ruby, tolong katakan padaku. Tapi saya tidak yakin apakah dukungan server saya benar.

Maaf jika kode saya terlalu jauh dari metode untuk menampilkan pdf, karena saya tidak tahu apa-apa tentang pemrosesan pdf dan bagaimana menerapkan masalah ini.

Mari kita asumsikan bahwa pengguna memiliki plug-in Adobe Reader. Jadi, bagaimana cara mengatasi masalah saya?

edit : Saya ingin menampilkan file pdf biasa. Tujuan utama saya: melacak file pdf saya dan menggunakan beberapa url mewah.

edit : Inilah kode php utama saya:

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

edit : Sekarang kode bekerja. Tetapi bilah kemajuan pemuatan (pada plugin Adobe Reader X) tidak muncul. Mengapa? Ada yang bisa membantu saya? Inilah kode utama saya:

<?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 : Semua masalah saya terpecahkan. Inilah kode terakhirnya:

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

Terima kasih! :)

bodoh
sumber
4
"show" hanya mungkin jika klien menginstal plug-in Acrobat Reader. Jika tidak, itu akan selalu disajikan sebagai file unduhan, tidak ada yang dapat Anda lakukan tentang itu. Menyamarkan jalur PDF juga tidak mungkin, mudah untuk mengetahuinya. Apa yang coba lakukan? Mungkin ada beberapa alternatif jika kami tahu lebih banyak tentang tujuan Anda
Pekka
4
plugin Adobe Reader hanya diperlukan jika Anda menggunakan browser yang tidak menangani PDF aslinya. juga, jika PDF dikirim ke browser melalui PHP / Perl, sangat mungkin untuk mengaburkan jalur PDF yang sebenarnya, atau bahkan menyimpannya di luar docroot sehingga tidak dapat diakses secara langsung.
Stephen
1
Adobe Reader hanya diperlukan jika pengguna menggunakan browser yang tidak menangani PDF secara asli ...
GolezTrol
@ Stephen tentu saja mungkin untuk mengaburkan jalur yang sebenarnya, tetapi apa yang tampaknya diinginkan OP adalah mengaburkan URL untuk mencegah pencurian.
Pekka
Mari kita asumsikan bahwa pengguna memiliki plug-in Adobe Reader. Jadi, bagaimana cara mengatasi masalah saya?
dimassony

Jawaban:

49

Saya berasumsi bahwa Anda ingin PDF ditampilkan di browser, daripada memaksakan unduhan. Jika demikian, coba setel Content-Dispositionheader dengan nilai inline.

Ingat juga bahwa ini juga akan dipengaruhi oleh pengaturan browser - beberapa browser mungkin dikonfigurasi untuk selalu mendownload file PDF atau membukanya di aplikasi lain (mis. Adobe Reader)

Stephen
sumber
Iya. Tetapi ketika saya mencoba saran Anda, saya mendapatkan pesan kesalahan "File tidak dimulai dengan '% PDF-'". Saya menggunakan 'Content-Disposition: inline; nama file = "the.pdf" '. Apakah saya melakukan kesalahan?
dimassony
4
<? php header ('Jenis konten: aplikasi / pdf'); header ('Content-Disposition: inline; filename = "the.pdf"'); readfile ('/ dir / to / the.pdf'); ?>
dimassony
terdengar seperti itu bukan file PDF yang valid?
Stephen
@ Stephen Ketika saya membuka langsung ke file, itu berhasil. Tapi ketika saya menggunakan dispisition konten inline, itu tidak berhasil.
dimassony
7
senang mendengarnya, dan senang mengetahui solusinya! Akan lebih baik jika Anda dapat memposting kode terakhir yang menunjukkan tajuk mana yang Anda kirim, untuk siapa pun yang menemukan pertanyaan ini.
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);

Diuji dan berfungsi dengan baik. Jika Anda ingin file diunduh, ganti

    Content-Disposition: inline

dengan

    Content-Disposition: attachment
Kareem
sumber
Mengapa Anda mematikan kompresi? ini_set ('zlib.output_compression', '0');
Enigma Plus
Karena kompresi zlib tidak berfungsi dengan ob_gzhandler () dan ini adalah cuplikan kode, bukan skrip lengkap. Ngnix menangani kompresi lebih baik daripada php. Anda dapat menggunakan zlib jika sesuai dengan aplikasi dan pengaturan server Anda.
Kareem
4

Anda dapat memodifikasi perender PDF seperti xpdf atau bahkan untuk merender menjadi gambar grafik di server Anda, dan kemudian mengirimkan gambar tersebut ke pengguna. Beginilah cara kerja quick view Google terhadap file PDF, mereka merendernya secara lokal, kemudian mengirimkan gambar ke pengguna. Tidak ada file PDF yang diunduh, dan sumbernya cukup dikaburkan. :)

sarnold
sumber
Ini adalah satu-satunya cara yang sangat aman untuk mencegah pencurian dokumen asli.
Pekka
1
Saya tidak keberatan dengan pencurian dokumen asli. Jika tidak, saya ingin agar pengguna dapat menyimpannya. Selain itu, saya ingin memblokir beberapa header klien. Dan mungkin saya akan menerapkan saran Anda jika pengguna tidak memiliki Adobe Reader.
dimassony
Selain itu tidak akan pencurian, karena aslinya masih ada.
Svante
@Svante - Saya ragu bahwa pemilik kekayaan intelektual akan setuju dengan logika Anda.
ashleedawg
@ashleedawg: Saya meragukan julukan "kekayaan intelektual". Ini hanyalah peretasan kata untuk membuat penimbunan informasi tampak tidak hanya sebagai model bisnis yang sah, tetapi bahkan bermanfaat bagi publik untuk mempertahankan diri dari inovasi.
Svante
1

Cara paling aman untuk memiliki tampilan PDF daripada mengunduh tampaknya menyematkannya menggunakan elemen objectatau iframe. Ada juga solusi pihak ketiga seperti penampil PDF Google.

Lihat Cara Terbaik untuk Menyematkan PDF dalam HTML untuk ikhtisar.

Ada juga DoPDF , penampil PDF dalam browser berbasis Java. Saya tidak dapat berbicara tentang kualitasnya tetapi ini terlihat menarik.

Pekka
sumber
0

Anda juga dapat menggunakan kelas fpdf yang tersedia di: http://www.fpdf.org . Ini memberikan opsi untuk mengeluarkan ke file dan ditampilkan di browser.

tapananand
sumber