web-dev-qa-db-ja.com

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

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

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

私が求めていたのは、showユーザーが私の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

rubyでそれをするなら、私に言ってください。しかし、私のサーバーがRailsをサポートしているかどうかはわかりません。

私のコードがメソッドから離れすぎて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);
?>

ありがとう! :)

116
dimassony

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

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

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

テスト済みで正常に動作します。代わりにファイルをダウンロードする場合は、置き換えます

    Content-Disposition: inline

    Content-Disposition: attachment
14
Kareem

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

4
sarnold

ダウンロードの代わりにPDFディスプレイを使用する最も安全な方法は、objectまたはiframe要素を使用して埋め込むことです。 GoogleのPDFビューアーなどのサードパーティソリューションもあります。

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

DoPDF 、Javaベースのブラウザー内PDFビューアーもあります。私はその品質について話すことはできませんが、面白そうです。

1
Pekka 웃

http://www.fpdf.org で利用可能なfpdfクラスを使用することもできます。ファイルへの出力とブラウザでの表示の両方のオプションを提供します。

0
tapananand