PHP / Perl経由でユーザーのブラウザーにPDFファイルを表示する


121

ユーザーにPDFファイルを表示したい。私がcgiを使用してpdfを表示する理由は、pdfのクリックを追跡し、保存されたpdfの実際の場所を隠したいためです。

私はインターネットで検索していて、ユーザーにファイルを表示せずに、ユーザーに保存ダイアログを表示してPDFを作成する方法を見つけました。

私が欲しかったのは、PDFを作成またはダウンロードするのではなく、PDFファイルをユーザーに表示することです。ここに私が公式のphpドキュメントから得たものがあります:

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

また、私のgoogle-search-result perlコード:

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

ルビーでやるなら言ってください。しかし、サーバーがレールをサポートしているかどうかはわかりません。

私のコードがメソッドから遠すぎてpdfを表示できない場合は申し訳ありません。pdf処理とこの問題の実装方法について何も知らないためです。

ユーザーがAdobe Readerプラグインを持っていると仮定しましょう。それで、私の問題をどのように修正しますか?

編集:プレーンPDFファイルを表示します。私の主な目的:PDFファイルを追跡し、いくつかの凝ったURLを使用します。

編集:ここに私のメインのphpコードがあります:

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

編集:これでコードが機能します。ただし、読み込みの進行状況バー(Adobe Reader Xプラグイン上)は表示されません。どうして?誰でも手伝ってくれる?これが私のメインコードです:

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

編集:すべての問題が解決しました。これが最終的なコードです:

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

ありがとう!:)


4
「表示」は、クライアントにAcrobat Readerプラグインがインストールされている場合にのみ可能です。それ以外の場合は、常にダウンロードファイルとして提供されます。そのためにできることは何もありません。PDFのパスを曖昧にすることも不可能であり、見つけるのは簡単です。何をしようとしていますか?多分私達があなたの目標についてもっと知っていればいくつかの選択肢があります
Pekka

4
Adobe Readerプラグインは、PDFをネイティブで処理しないブラウザーを使用している場合にのみ必要です。PDFは、PHP / Perlの経由でブラウザに送信された場合も、非常に本当のPDFのパスを不明瞭、あるいはそれが直接アクセス可能ではありませんので、ドキュメントルートの外にそれを持つことが可能。
Stephen

1
Adobe Readerは、ユーザーがPDFをネイティブで処理しないブラウザーを使用している場合にのみ必要です...
GolezTrol

@Stephenは実際のパスを隠すことはもちろん可能ですが、OPが望んでいるように見えるのは、URLを隠して盗難を防ぐことです。
Pekka

ユーザーがAdobe Readerプラグインを持っていると仮定しましょう。それで、私の問題をどのように修正しますか?
dimassony

回答:


49

ダウンロードを強制するのではなく、ブラウザにPDFを表示したいとします。その場合は、Content-Dispositionヘッダーに値を設定してみてくださいinline

また、これはブラウザー設定の影響も受けることに注意してください。一部のブラウザーは、常に PDFファイルをダウンロードするか、別のアプリケーション(Adobe Readerなど)で開くように構成されている場合があります。


はい。しかし、あなたの提案をしようとすると、「ファイルが '%PDF-'で始まっていません」というエラーが表示されます。私は 'Content-Disposition:inline;を使用しています。filename = "the.pdf" '。間違えましたか?
dimassony 2011年

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

それは有効なPDFファイルではないように聞こえますか?
Stephen

@Stephenファイルを直接開くと機能します。しかし、インラインコンテンツのdispisitionを使用すると、機能しません。
dimassony

7
聞いて良かったし、解決策を知ってよかった!この質問に出くわした他の人のために、送信するヘッダーを示す最終的なコードを投稿していただければ幸いです。
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);

テストされ、正常に動作します。代わりにファイルをダウンロードする場合は、

    Content-Disposition: inline

    Content-Disposition: attachment

なぜ圧縮をオフにするのですか?ini_set( 'zlib.output_compression'、 '0');
エニグマプラス

zlib圧縮はob_gzhandler()では機能せず、これは完全なスクリプトではなくコードのスニペットであるためです。Ngnixはphpよりも圧縮をうまく処理します。アプリとサーバーのセットアップに適している場合は、zlibを使用できます。
カリーム

4

xpdfやevinceなどのPDFレンダラーを変更してサーバー上のグラフィックスイメージにレンダリングし、そのイメージをユーザーに配信できます。これが、GoogleのPDFファイルのクイックビューの仕組みです。PDFファイルをローカルでレンダリングし、画像をユーザーに配信します。ダウンロードされたPDFファイルはなく、ソースはかなりはっきりしていません。:)


これは、元のドキュメントの盗難を防ぐ唯一の本当に安全な方法です。
Pekka

1
オリジナルのドキュメントの盗難は気にしません。それ以外の場合は、ユーザーが保存できるようにしたかったのです。また、一部のクライアントヘッダーをブロックする必要がありました。そして、おそらくユーザーがAdobe Readerを持っていないときに、私はあなたの提案を実装します。
dimassony

その上、オリジナルがまだそこにあるので、それは盗難ではないでしょう。
Svante、2011年

@Svante- 知的財産の所有者があなたの論理に同意するかどうか疑問です。
ashleedawg

@ashleedawg:私はモニカの「知的財産」を疑っています。これは単なる言葉のハッキングであり、情報の蓄積は正当なビジネスモデルのように見えるだけでなく、一般の人々がイノベーションから身を守る価値があるように見えます。
Svante

1

ダウンロードではなくPDFを表示する最も安全な方法は、objector iframe要素を使用して埋め込むことです。GoogleのPDFビューアなどのサードパーティソリューションもあります。

概要については、HTMLPDFを埋め込むための最良の方法を参照してください。

また、Javaベースのブラウザー内PDFビューアであるDoPDFもあります。質は言えませんが面白そうです。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.