Kullanıcı tarayıcısında PHP / Perl aracılığıyla bir PDF dosyası göster


121

Kullanıcılarıma PDF dosyalarını göstermek istiyorum. Pdf'i göstermek için cgi'yi kullanmamın nedeni, pdf için tıklamaları izlemek ve kaydedilen pdf'nin gerçek konumunu gizlemek istememdir.

İnternette arama yapıyorum ve yalnızca kullanıcılara kaydetme iletişim kutusunu nasıl göstereceğimi ve bir pdf oluşturmayı öğrendim, dosyaları kullanıcılara göstermiyor.

İstediğim şey , kullanıcılara pdf dosyalarımı göstermek , pdf'yi oluşturmak veya indirmek değil . İşte resmi php belgelerinden elde ettiğim şey:

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

Ayrıca google arama sonucu perl kodum:

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

Ruby'de yaparsan, lütfen bana söyle. Ancak sunucumun rayları destekleyip desteklemediğinden emin değilim.

Pdf işleme ve bu sorunun nasıl uygulanacağı hakkında hiçbir şey bilmediğim için kodum pdf'yi gösterme yönteminden çok uzaksa özür dilerim.

Kullanıcıların Adobe Reader eklentisine sahip olduğunu varsayalım. Peki sorunumu nasıl çözebilirim?

düzenleme : Düz pdf dosyası göstermek istiyorum. Birincil amacım: pdf dosyalarımı takip etmek ve bazı süslü url'ler kullanmak.

düzenleme : İşte ana php kodum:

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

edit : Şimdi kod çalışıyor. Ancak yükleme ilerleme çubuğu (Adobe Reader X eklentisinde) görünmüyor. Neden? Biri bana yardım edebilir mi? İşte ana kodum:

<?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 : Tüm sorunlarım çözüldü. İşte son kod:

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

Teşekkürler! :)


4
"göster" yalnızca istemcide Acrobat Reader eklentisi yüklüyse mümkündür. Aksi takdirde, her zaman bir indirme dosyası olarak sunulacaktır, bununla ilgili yapabileceğiniz hiçbir şey yoktur. PDF'nin yolunu kapatmak da imkansızdır, öğrenmek önemsizdir. Ne yapmaya çalışıyorsun? Belki hedefleriniz hakkında daha fazla şey biliyorsak bazı alternatifler vardır
Pekka

4
Adobe Reader eklentisi yalnızca PDF'leri yerel olarak işlemeyen bir tarayıcı kullanıyorsanız gereklidir. ayrıca, PDF tarayıcıya PHP / Perl aracılığıyla gönderilmişse , gerçek PDF yolunu gizlemek veya hatta doğrudan erişilememesi için docroot dışında tutmak çok mümkündür.
Stephen

1
Adobe Reader yalnızca , kullanıcı PDF'leri yerel olarak işlemeyen bir tarayıcı kullanıyorsa gereklidir ...
GolezTrol

@Stephen elbette gerçek yolu gizlemek mümkündür, ancak OP'nin istediği şey hırsızlığı önlemek için URL'yi gizlemektir.
Pekka

Kullanıcıların Adobe Reader eklentisine sahip olduğunu varsayalım. Peki sorunumu nasıl çözebilirim?
dimassony

Yanıtlar:


49

İndirmeye zorlamak yerine PDF'nin tarayıcıda görüntülenmesini istediğinizi varsayıyorum. Bu durumda, Content-Dispositionbaşlığı değeriyle ayarlamayı deneyin inline.

Ayrıca bunun tarayıcı ayarlarından da etkileneceğini unutmayın - bazı tarayıcılar her zaman PDF dosyalarını indirecek veya bunları farklı bir uygulamada açacak şekilde yapılandırılmış olabilir (örn. Adobe Reader)


Evet. Ancak önerinizi denediğimde, "Dosya '% PDF-' ile başlamıyor" hatası alıyorum. 'Content-Disposition: inline; filename = "the.pdf"'. Bir hata mı yaptım
dimassony

4
<? php başlığı ('İçerik türü: uygulama / pdf'); başlık ('Content-Disposition: inline; filename = "the.pdf"'); readfile ( '/ dir / etmek / the.pdf'); ?>
dimassony

geçerli bir PDF dosyası değil gibi görünüyor?
Stephen

@Stephen Dosyayı açtığımda işe yarıyor. Ancak satır içi içerik anlaşmazlığını kullandığımda işe yaramıyor.
dimassony

7
duymak güzel ve çözümü bilmek harika! Bu soruyla karşılaşan diğer herkes için hangi başlıkları gönderdiğini gösteren son kodu gönderebilirseniz iyi olur.
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);

Test edildi ve iyi çalışıyor. Bunun yerine dosyanın indirilmesini istiyorsanız,

    Content-Disposition: inline

ile

    Content-Disposition: attachment

Neden sıkıştırmayı kapatıyorsunuz? ini_set ( 'zlib.output_compression', '0');
Enigma Plus

Çünkü zlib sıkıştırması ob_gzhandler () ile çalışmaz ve bu tam bir komut dosyası yerine bir kod parçacığıdır. Ngnix sıkıştırmayı php'den daha iyi idare eder. Uygulamanıza ve sunucu kurulumunuza uygunsa zlib'i kullanabilirsiniz.
Kareem

4

Xpdf gibi bir PDF oluşturucuyu değiştirebilir veya sunucunuzdaki bir grafik görüntüsüne dönüştürebilir ve ardından görüntüyü kullanıcıya teslim edebilirsiniz. Google'ın PDF dosyalarının hızlı görünümü bu şekilde çalışır, dosyayı yerel olarak işler ve ardından görüntüleri kullanıcıya sunar. İndirilen PDF dosyası yok ve kaynak oldukça gizlenmiş durumda. :)


Orijinal belgenin çalınmasını önlemenin gerçekten güvenli tek yolu budur.
Pekka

1
Orijinal belge hırsızlığı umurumda değil. Aksi takdirde, kullanıcıların onu kaydetmesini istedim. Ayrıca, bazı müşteri başlıklarını engellemek istedim. Ve belki de kullanıcı Adobe Reader'a sahip olmadığında önerinizi uygulayacağım.
dimassony

Üstelik hırsızlık olmazdı çünkü orijinal hala orada.
Svante

@Svante - Fikri mülkiyet sahiplerinin mantığınıza katılacağından şüpheliyim .
ashleedawg

@ashleedawg: "Fikri mülkiyet" takma adından şüpheliyim. Bu, bilgi istiflemenin sadece meşru bir iş modeli değil, aynı zamanda halkın yeniliğe karşı savunması için değerli görünmesini sağlamak için sadece kelime hacklemesidir.
Svante

1

İndirme yerine bir PDF görüntüsüne sahip olmanın en güvenli yolu, onu bir objectveya iframeöğesi kullanarak gömmek gibi görünüyor . Google'ın PDF görüntüleyicisi gibi 3. taraf çözümleri de vardır.

Genel bakış için PDF'yi HTML'ye Gömmenin En İyi Yolu'na bakın .

Java tabanlı bir Tarayıcı içi PDF görüntüleyici olan DoPDF de var . Kalitesiyle konuşamıyorum ama ilginç görünüyor.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.