CGI-BBS > CGI > Perl > PDFファイルのCGI経由での表示


カレッヂ
カレッヂ


質問者 トモ  投稿日 3/7(木) 10:28:21
現在、TurboLinux6、Perl5を使用してパスワード制限を掛けたサイトからのPDFファイルの表示機能を模索しています。
PDFファイルはcgi-binの下のDirにおいてあります。

現行、
Cntent-Type: application/pdf
とすることでWindows上のブラウザIE5(まだこれしかTESTしていない)では表示できるのですが、Mac上のブラウザ(IE4.5、NN4.7)では表示がされず、実際のPDFの内容がプログラム名(hyouji.cgi)でダウンロードマネージャでダウンロードされます。
Windowsでもダウンロード(マウスの右クリック)を行うと、不思議、hyouji.pdf としてダウンロードされます。

Content-Disposition:attachment;filename="abcd.pdf"

の指定も試しましたが、うまくファイル名として認識されません。

どなたか、これに関してアドバイスをお願いします。
結構、身近なところで見落としに気づいていないのかもしれません。

よろしくお願いします。

----------- コーディング内容 ------------
        print "Content-type: application/pdf\n\n";
        print "Content-Disposition:attachment;filename=\"$pdfFile"\n";

        open PDF, "<$pdfFile";  
        while(read(PDF, $value, 4096)){
                print $value;
        }

回答者 みみみ  [削除]  投稿日 3/8(金) 11:37:46
それは単純にAcrobat Readerが入っていないのでは?

もし入っているのであれば関連付けがされていないとか?


質問者 トモ  [削除]  投稿日 3/8(金) 14:11:47
Win、Mac共にAcrobatReaderは入っています。
Macのほうは、ダウンロードされたファイルはacrobatのアイコンになっています。
当然クリックすると見ることが出来ますが、Webページからの連携が利かないのです。
ダウンロード時にプログラム名でダウンロードされてしまうのが原因ではないかと考えているのです。そこでCGIを経由してもPDFファイル名でダウンロードできないか模索しているのです。

回答者 しあわせのツボ  [削除]  投稿日 3/8(金) 15:36:09
単純なところから。
print "Content-type: application/pdf\n\n";
print "Content-Disposition:attachment;filename=\"$pdfFile"\n";

print "Content-type: application/pdf\n";
print "Content-Disposition:attachment;filename=\"$pdfFile"\n\n";
とすべきでしょうね。
質問者 トモ  [削除]  投稿日 3/8(金) 17:10:03
御指摘ありがとうございます。

\n\n に替えて早速やってみましたが、結果は変わりません。
この掲示板に投稿する前に幾度となくトライ&エラーを繰り返した
中で既に試したような気がします。

本件で、まだ何かヘッダーに足せるものがあるのでしょうか?
回答者 まさ  [削除]  投稿日 3/8(金) 20:00:42
凄く単純なんですけど単にそのPDFファイルにリンクを貼るだけじゃだめなんですか?
ちなみにうちではそれで上手くいってますけど。

回答者 鮎友  [削除]  投稿日 3/8(金) 21:21:27
MAC IEでの初期設定でファイルヘルパーとしてacrobatが割り当てられていて
処理方法としてブラウザで表示する、あるいはアプリケーションで表示する
になっていますか?
質問者 トモ  [削除]  投稿日 3/8(金) 22:15:29
今回のはまず、第一にパスワードを掛けたサイト=一般には見せたくない。
第二に.htaccessでの制御はユーザ登録の一元化のため使用しない=通常のHTMLエリアには配置できない。

これを踏まえて表示を考えると、パスワードを入力して表示される各htmlまでもCGI経由とならざるを得ません。そこの配置されているPDFも同様です。
HTMLは変換も含めてすべてOKなのですが、PDFのその部分だけがうまくないのです。

通常のHTML置場に置けば、PDFは問題なく表示されますよ。もちろんダウンロードも問題は発生しません。
でもこれでは見せたくない人にまで見えてしまいますし、ダウンロードできてしまいます。

この話しは、初回の質問で“パスワード制限を掛けたサイトからのPDFファイルの表示”という一文でさらりと触れたのですが...伝わってなかった?

それとも他に、今回の条件に合うサイトの構築方法を知ってる方いますか?
回答者 今夜がやすだ  [削除]  投稿日 3/10(日) 01:10:14
そもそもpdfファイルってバイナリですよね。それで、バイナリであることはRPC1867より強調するように言ってたような?image/gifとか同様にね。そんなわけで、

print <<EOF;
Content-type: application/pdf
Content-disposition: attachment;filename="$pdfFile"
Content-Transfer-Encoding: binary

EOF

とかするんじゃなかったかな〜?メールとかと同じように。
うちでは、これで、うまくファイルのDLできるようにはなりました。
でわでわ。
回答者 今夜がやすだ  [削除]  投稿日 3/10(日) 01:18:09
RPC1867とかわけわかんないこと言いました。RFC1521でした。
質問者 トモ  [削除]  投稿日 3/11(月) 10:38:02
“今夜がやすだ”さん ありがとうございます。
早速試してみました。

その前に、お恥ずかしい私のミスをここで書かなければなりません。

いろいろお教えいただいて、変更してしている最中。
ずっと
print "Content-type: application/pdf\n\n";
これでやっておりました。
せっかく“幸せのつぼ”さんに御指摘いただいたのに、そのときも上記になっていました。
それに対して、状況変わらずなんてレスポンスした私はタコ。m(_ _)m スミマセン

まず、これを修正することで、ダウンロードでの名前問題(詳細は後述)はほぼ解決を見ました。
しかし、クリック(左)するといきなりダウンロードを開始してしまうので、名前指定を以下のように変更しました。
print "Content-Disposition:inline;filename="PDFfile"\n\n;

inlineにすることで添付文書ではなくて本文として扱います。
すると、クリック(左)をすると表示が、クリック(右)でダウンロードが可能になりました。


“今夜がやすだ”さん からいいただきました

Content-Transfer-Encoding: binary

は、入れる前の状態と変化ががありませんでしたので、現状では外しています。
RFC上から見たら入れたほうが良いのだろうな。きっと。


以下に、
print "Content-type: application/pdf\n"
print "Content-Disposition:inline;filename=\"PDFfile\"\n\n"
状態での各プラットフォーム&ブラウザでの動作を示します。

これを読んでいる方で、他の環境でどうなるか試してみてこの掲示板に返信いただけたら
ありがたいです。
他の方へも大変有効な情報になると思います。

<動作>
Windows IE 5.01
クリック(左)=表示
クリック(右)=PDFファイル名で保存先ダイヤログ表示

Mac IE4.5
クリック(左)=表示できず
クリック(右)=cgi名で保存先ダイヤログ表示


Mac IE5
クリック(左)=表示
クリック(右)=cgi名で保存先ダイヤログ表示

Mac NN4.7
クリック(左)=表示
クリック(右)=PDFファイル名で保存先ダイヤログ表示


質問者 トモ  [削除]  投稿日 3/11(月) 11:43:34
忘れてました。

明日からでも皆様がテストできるように、テスト環境を今晩中に公開サーバーで作成しておきます。

URLはそのときお知らせします。


質問者 トモ  [削除]  投稿日 3/12(火) 01:26:13
テスト環境がUPできましたのでお知らせいたします。

URL
http://www.ef-fective.co.jp/cgi-bin/pdftest.cgi?pg=/pdftest/pdftest.html

となっています。

結果報告の書込みお待ちしています。
回答者 今夜がやすだ  [削除]  投稿日 3/14(木) 06:52:52
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.0.2914)
左クリック--->空のページを表示(そのままのpdfリンクはうまくActobatReaderが起動します。)
右クリック保存--->feedback.pdfとして保存できます。

Mozilla/4.75 [ja] (Windows NT 5.0; U)
左クリック--->AcrobatReaderで表示しました。
右クリック保存--->pdftest.cgiとして保存と言ってきます。(わたしの環境下でも、こうなります。)
回答者 はせがわ  [削除]  投稿日 11/7(木) 15:49:46
左クリックがうまく表示していません。
OS Windows2000
Browser IE6.0

自分も今、pdf表示にとりくんでいるので参考にしているんですが
今、現在は解決したのでしょうか?

ちなみに自分はbinmode関数を使っているんですが
結果は左も右も駄目ですね・・・

↓こんな感じです。

print "Content-type:application/pdf\n";
print "Content-Transfer-Encoding:binary\n";
print "Content-disposition:inline;filename=$pdf\n\n";

open (PDF, "<$pdf");
binmode(PDF);
while(read(PDF, $value, 4096)){
  print $value;
}
close(PDF);

なにかまだ必要なものがありますか?
質問者 トモ  [削除]  投稿日 11/7(木) 17:33:03
IE6は初めてですね。

私もテストしていませんので興味深々です。

もう少し状況をお聞かせください。

1)PDFがブラウザ上で表示できる環境にありますか?
2)右クリックしたときに表示されるダイヤログ(もしくはメッセージ)は何ですか?
  内容を細かく書いてください。
3)うまくいかないとはどんな状況ですか?手順を追って詳細に書いてください。

回答者 はせがわ  [削除]  投稿日 11/7(木) 18:53:48
> 1)PDFがブラウザ上で表示できる環境にありますか?

だと思います。Google等によくあるPDFのHTML表示はうまくいっています。
それとも前のレスにあるようにAcrobatReaderの関連付けがされていないのでしょうか?
(すいません、やりかたがわからないんですが・・・)
ちなみに直接リンク(PDFファイル1)はうまくできました。


> 2)右クリックしたときに表示されるダイヤログ(もしくはメッセージ)は何ですか?
  内容を細かく書いてください。

http://www.ef-fective.co.jp/cgi-bin/pdftest.cgi?pg=/pdftest/pdftest.htmlの場合
右クリックするとpop-up windowがでてきて普通のリンクと同じ感じです。
  開く
  新しいウィンドウで開く
  対象をファイルに保存
  ...
  ナドナド
問題なしです。

自作はダウンロードまでできますがそれを開くと
「このファイルは壊れているため現在修理中です。」
というダイアログの後、空のAcrobatReaderが開きます。
ちなみに元ファイルには問題ありませんでしたしopenに失敗したら
die "$!"しています。


> 3)うまくいかないとはどんな状況ですか?手順を追って詳細に書いてください。

http://www.ef-fective.co.jp/cgi-bin/pdftest.cgi?pg=/pdftest/pdftest.html
の場合は左クリックでAcrobatReaderの起動が始まり
まわりがIEブラウザの枠で囲まれた白い画面がでてきます。

ちなみに自分が作ったものは
左クリックでAcrobatReaderの起動が始まり
まわりがIEブラウザの中にAcrobatReaderの枠で囲まれた白い画面がでてきます。

こんな感じでしょうか?
ちなみにローカルの場合(Windows2000)はbinmodeをつけてもつけなくても
右クリックの場合ダウンロードはできてもファイルが壊れています。
案外Apacheの設定の問題かもしれません(素人なのでよくわかりませんが・・・)
あとダウンロードしたファイルはPDFファイル名になっています。

以上です。分かりにくかったらまたご連絡ください。
質問者 トモ  [削除]  投稿日 11/7(木) 21:45:02
もしかしたら、PDFファイルが壊れているのかもしれません。

はせがわ さんが作られたPDFはローカルで見ることが出来ますか?
PDFはPDFwriterで作成されたものであれば問題ないと思います。
確かに作成したバージョンより低いacrobatreaderでOPENすると「カラーマップが合わない」など
エラーが発生し正常に表示されないことがあります。
「壊れている」という現象は、どうゆう訳かたまに見かけます。
経験上、GohstSCRIPTなどの純正以外のツールでPDFドキュメントを作成したときに
発生しました。

そして、サーバーへのUPLOADはbinmodeでUPしていますか?
PDFの中身はテキストファイルですのがUPLOADの仕方によっては問題が発生するかもしれません。

ともかく、他のPDFドキュメント、ネット上から落としたもなど、正常に表示されるもので
テストすることをお勧めします。



回答者 はせがわ  [削除]  投稿日 11/8(金) 13:57:08
> PDFはローカルで見ることが出来ますか?
見れます。ちなみにpdfファイル自体は他のサイトからダウンロードしたものも
自作したものも問題なく表示されました。

> 確かに作成したバージョンより低いacrobatreaderでOPENすると「カラーマップが合わない」など
> エラーが発生し正常に表示されないことがあります。
自分の場合はAcrobatReaderのほうが新しいです。
PDFWriter 4.0, AcrobatReader5.1
ちなみにPDFファイル2のリンクからはブラウザ表示はできませんでしたが
保存したものは問題なく表示できました。
自作のは両方ともダメでした。
4.0が邪魔しているのかと思って 環境設定 -> 一般 ->オプション の
「起動時にスタート画面表示」以外のチェックをはずしてやってみましたが
結果は同じでした。

> サーバーへのUPLOADはbinmodeでUPしていますか?
現段階ではテスト中なので全てローカル内(Windows2000)でやっています。

うーん、トモさんのソースを真似したものをローカルで使っても
保存したファイルが壊れているのでローカル設定に問題がありそうです。
ソースをShift_JISで書いているのがいけないのかもと思って
EUCにしてみましたが結果は同じでした。
ローカルではWindowsにApache使っているんですがそれではダメなのでしょうか?


回答者 iwanaka  [削除]  投稿日 11/13(水) 05:47:55
私も昔、おんなじ問題でヘッダいじりに頭を悩まされました。
私の場合はcgiはc言語、ファイルはpdfとcsvという環境でしたが
IE4〜6、NN数種類(verは忘れました)でテストして散々でした。
結論からいえばcgiからのcsv、pdfの出力ではブラウザの「動き
(DLダイアログが出たり出なかったり、ブラウザにcsvやpdfの
バイナリがテキストで表示されちゃったり)」はおろかダウン
ロードできるかどうかもまちまちでした。
もちろん、ブラウザ側のアプリへの関連付けやマイムの設定は統一して
テストしましたが、だめでした。
ブラウザは呼び出すファイルの拡張子が.pdfや.csvの時にはだいたい一
定の動きをしますが、.cgiをgetあるいはpost(ちなみにこのメソッドに
よってもブラウザの動きが変わってきます・・)で呼んだ帰りが.pdfや
.csvだとさまざまな動きをしてくれちゃいます。
ブラウザはレスポンスヘッダを見ずに、呼びだした.cgiがそのまま帰って
くることしか考えてない場合があるのが原因だと思います。たぶんwww規格
どうりの動きじゃないと思います。
MSとかネスケのサポセン見たいなところに聞いたほうがいいかもしれません。
回答者 はせがわ  [削除]  投稿日 11/13(水) 12:14:07
やはりサーバの設定も関係あるみたいですね。(確信ではないですが・・・)
自分の場合ローカルの設定をかえずにWindows2000サーバとUNIXサーバに
同じソースを上げて実行してみたところ、
Windowsの場合は保存してもファイルが壊れてしまっているのですが
Unixの場合はとりあえず保存できました。
ただしファイル名は cgi名.pdf と言う形でしたが・・・

今のところは左クイックの場合でも Acrobat のポップアップが出てきて
保存かキャンセルしかできない状態です。ローカルの設定が変なのかと思って
トモさんの「PDFファイル2」でやってみましたが
結果は白紙のブラウザが表示されました。
ファイルの保存はきちんとfeedback.pdfになっていました。

というわけでソース、ローカル設定だけではなく
サーバの設定も関係してくると思うのですが、どうなんでしょう?

ちなみにトモさんはPDFファイル2の左クイックできちんと表示されてます?
質問者 トモ  [削除]  投稿日 11/13(水) 17:39:33
こちらでは、うまくいっています。
但し、IE6ではありません。IE5です。

サーバーの設定となると、MIME関連になるのでしょうか。
ちょっと私も詳しくないんで、そうなるとその筋(メ)の方の
アドバイスが必要かもしれません。
回答者 はせがわ  [削除]  投稿日 11/14(木) 15:16:31
ブラウザ表示できるようになりました。

print "Content-disposition:inline;filename=$pdf"の
filename=$pdf をはずしたらブラウザに書き込むようになりました。
ただしWindowsサーバの場合はファイルが壊れたままですが・・・

OS:     Windows2000
ブラウザ: IE6
ソース:
print "Content-type:application/pdf\n";
print "Content-Transfer-Encoding:binary\n";
  #--もともとは
  #--print "Content-disposition:inline;filename=$pdf\n\n
print "Content-disposition:inline;\n\n";

open (PDF, "<$pdf");
binmode(PDF);
while(read(PDF, $value, 4096)){
  print $value;
}
close(PDF);

ただし全ての環境で動くかは不明です。
ちなみに
print "Content-Transfer-Encoding:binary\n";
 と
binmode(PDF)
はなくても動きましたが念のためつけておきました。

一瞬、IE6の場合 filename=... をつけると
inline があっても attachment として扱うのかなと思いましたが
PDFファイル2はそんなこともないのでcgiのpdf書き込みは
iwanakaさんがいうみたいに環境によって結果が変わる不安定なものかもしれませんね
回答者 ブランドスーパーコピー  [削除]  投稿日 2019/7/5(金) 16:59:44
シュプリーム コピーから定番BOXロゴのTシャツです。 
伸縮性があり、柔らかな生地を採用。
 http://agvol.com ブランドスーパーコピー 
ブランドを代表するBOXロゴがフロントにプリントされた
シュプリーム tシャツ コピー http://www.keevoo.com/brand-731.html 
 で人気のベーシックアイテムです。通気性、速乾性に優れているので、
暑い日でも快適に着用ができます。 

返信(回答)する


Web裏技