QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

Acrobat Reader7.0で、PDFがブラウザ内に表示されない?

Webアプリケーションで、作成したPDFをブラウザに表示する
処理があるのですが、Acrobat Readerを5.1から7.0にアップデートしたら
以前はブラウザ内に表示されていたPDFが、ブラウザ内に表示されず
Acrobat Readerが立ち上がりその中に表示されるようになりました。

また出力時には、
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "inline; filename=hoge.pdf");
と指定しています。

クライアントのAcrobat Readerの設定は、「PDFをブラウザに表示」にチェックが
はいっており、HTMLからPDFへタグで遷移するなら、ブラウザ内に表示されます。

何か解決方法ございますでしょうか?

質問者:たけ

回答

過去記事を検索していた所、似た様な議題でしたので
こちらに再投下しました。

クライアントによって現象が発生したりしなかったりで、
非常に回答に困っています…結構緊急状態でして…。

【現象】
IE6では、ブラウザへのPDF表示が可能。
IE7だと、表示されるクライアントとされないクライアントがある。
また、表示されないものも8割方表示不可能なだけで、
全く表示が出来ない訳ではない。
なお、IE7の設定としてポップアップは「常に新しいタブ〜」に
設定してある。
ウィンドウに設定だと問題はないとの話だが、Vistaについては
情報不足のため未確認。

【環境】
クライアントOS:Windows XP Professional SP2またはWindows Vista
AP:IBM WebSphere base v6.1
Webサーバ:Apache 2.0.52
サーバOS:RedHat Enterprise Linux 4
ブラウザ:IE6 SP2、IE7
言語:Java1.5.0(IBM)
Adobe:7.0または、8.0

IE7における表示が出来ない場合の動作なのですが、
新規タブが一度は立ち上がるのですが、それが落ちてしまい
そのまま処理落ちします。
ところが、当方の環境(XP SP2)にて動作させると処理落ちすることもなく
正常にPDF表示がされる。といった状態です。

自分の環境では、IE6 SP2にて元々確認をしており、
この現象が発生したとの報告後、IE7をインストールし
動作させた所、処理はIE6時と同様に可能でした。

しかし、お客様先のVista&IE7、社内メンバーのマシン(XP2 SP&IE7)では
正常に処理出来ない場合があったり、なかったりと
非常に不安定な挙動をしています。
また、タブ落ちしているからといって処理エラーが起きている
ということもないようです。
※サーバのログにて確認。

Adobeの詳細なバージョンも知りたいのですが、
当方自体が確認できる状態ではないのであくまでも
大枠の情報からの推測になるのですが…。
また、Adobeのサポートデータベースで報告されている点を
確認できていないため、こちらの可能性も否定は出来ないのですが…。

http://support.adobe.co.jp/faq/faq/qadoc.sv?230396+002#anc_a-6
http://support.adobe.co.jp/faq/qadoc/AJ25.nsf/900f7bf03cd385244925696900084026/e3304fca84c603784925727a000bc541?OpenDocument

多分違う様な気がしています・・・
環境もきちんと確認出来ていないので、下手な事も言えないのですが…。

ちなみに、Javaでの出力処理は以下です。

response.setContentType("application/pdf");
response.setContentLength(reportToPdf.length);

OutputStream ouputStream = response.getOutputStream();
ouputStream.write(reportToPdf, 0, reportToPdf.length);
ouputStream.flush();
ouputStream.close();

既存に倣って処理しているつもりですが…。
コードよりも環境周りの気がしております。

IE7について、MSにも問合せてみましたが無償サポなので
有償で聞いてくれとの事で…現状、勝手な行動も出来ないので
有償サポには問合せていない次第です。
※どなたか問合せた事のある方、いらっしゃいますか?

似た現象、またはこの様な現象に遭遇したことがある方
何かしら情報をお願い致します。

投稿者:trickster

編集 履歴 (0)

自己レスでっす。

やはり環境が中途半端なだけに原因がはっきりしないとこですかね…。
何かしらヒントになりそうな事象でもあれば聞きたかったとこですが。

AdobeのアップデートやIEのアドオン、フィッシングの設定、
他色々な記事等を参考に試しましたが、一向に原因の究明には至れず…。
悔しいとこです。

明日一日でそれなりの調査結果を出さねばならないのですが、
決定打に繋がるものがわからないです。う〜ん。

MSの有償に聞くのも、業務都合上、今は出来る範囲で調べるという方向です。
悩んでいても仕方がないので、明日一日、調査しきって
それなりの答えを出したいと思います。

投稿者:trickster

編集 履歴 (0)

この期に及んでですが、情報あったらお願い致します。

Javascriptにおける挙動についてです。
以下のコードについての見解を頂きたいです。

winName = "hoge";
wnd = window.open("about:blank", winName, statusFlag); ①
wnd.close();                      ②
wnd = window.open("about:blank", winName, statusFlag); ③
//wnd.moveTo(screen.width-850, 0);           ④
//wnd.resizeTo(850,685);                ⑤
thisform.target = winName;
thisform.action = "hoge.do";
thisform.submit();

といった形でonclickで走る処理です。

④、⑤の処理はスクリプトエラーで「アクセス拒否」ないし、
「書き込みができません」のエラーを通知する事があるため、
現状は処理を外しました。

①〜③なのですが、これがいったい何をしたいがために
この様にしているのか!?ということを皆様にお聞きしたいのです〜!

当方の見解では、PDFが表示された画面が閉じていなかった場合を想定した
処理なのか?とも思ったのですが、必要ないと思う次第でして…。
この他にも似たような記述があるのですが、統一されておりません。

また、Vista + IE7において上記のコードだと相変わらず表示が
出来ないのですが、②の後にalert()を挟むと問題なく処理される様に
なることを確認しました。
※他にも色々試しましたが、alert()一つで問題がクリアされました。

直接的な解決ではないのですが、
document.readyStateやsetTimeout()による処理見直し等で
この件の問題が解決するのではと思っています。
ただ、原因として何が考えられるのか?
close()処理で終ってしまうのはなぜか?
この点について色々意見を聞きたい所存です。
※以前にもこの様な問題に直面したのを、今更ながらあった気が
したのですが、なぜか?という事がどうしてもわからないので…
情報あれば知りたい所です。

投稿者:trickster

編集 履歴 (0)

response.setContentType("application/pdf")

response.setContentType("application/pdf; name=hoge.pdf");
の違いで発生しますね。
後者の方は、ブラウザ内に表示されません。

しかし、前者で作ってしまうと保存するときにファイル名が指定されてなくなってしまう。
これって解決方法ありますか?

投稿者:ほげ

編集 履歴 (0)

Headerで、inlineを指定しているようですが
このあたりの情報をいじると動きが変わりませんか?

ところで、Acrobat Readerに「PDFをブラウザに表示」なんて設定あったんですね。
しらなかったです。

投稿者:頭脳パン

編集 履歴 (0)

失礼、inlineをattachmentに変えても
ダウンロードダイアログがでてきちゃいますね。

通常、たけさんのやり方で出来そうなのに。

投稿者:頭脳パン

編集 履歴 (0)

簡単なサーブレットを作って試してみました。
サーバはTomcat5.0.30
ブラウザはIE6(WinXP SP2)、FireFox1.0.6
Adobe Reader 7.0.1
の環境では、以下のコーディングでPDFをブラウザ内に表示します。
Content-Dispositionをinlineでなくattachementにするとダイアログが
表示されます。ので、私の環境では期待どおりに動作しています。

もし、期待どおり動作しないソースが私のソースと同じとすると、後は
PDFの中身によるのでしょうか?
ひとつひとつ切り分けをして行き、是非解決したいですね。

hoge.DownloadServlet.java
---
private void doTask(HttpServletRequest reqest, HttpServletResponse response) throws ServletException, IOException {
try {
File f = new File("c:/temp/a.pdf");
int size = (int)f.length();
BufferedInputStream bin = new BufferedInputStream(new FileInputStream(f));
byte[] buff = new byte[size];

response.setContentLength((int)size);
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "inline; filename=hoge.pdf");
//response.setHeader("Content-Disposition", "attachment; filename=hoge.pdf");
OutputStream out = response.getOutputStream();
int length = -1;
while ((length = bin.read(buff)) != -1) {
out.write(buff, 0, length);
}
bin.close();
out.flush();
out.close();
}
finally {
}
---
起動するためのJSP
index.jsp
--
<%@ page contentType="text/html; charset=Shift_JIS" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">




おためしぴょん

/hoge/hoge">
ボタンを押すとPDF




--

投稿者:むらぴー

編集 履歴 (0)

最初の投稿者と同じ状況かどうかは分かりませんが、Acrobat Reader 7.0xのみ
ブラウザ内表示されない現象が発生しました。

【調査結果】
Acrobat Reader 7.0xのみ、HTTPのヘッダ内で、
  Content-Type:application/pdf ; charset=Shift_JIS
のように、Content-Typeに文字セットの追加指定が行なわれていると、ブラウザ
内表示が行なわれないようです。
  Content-Type:application/pdf
のみであれば、ブラウザ内に表示されます。

当方の環境では、ソースコード上に
  response.setLocale(Locale.JAPAN)
があると、Content-Typeに文字セットの追加指定が入ってしまっていたため、この
コードを取り除く事で現象を回避しました。
このコードがあると、
  response.setContentType("application/pdf");
としても、ヘッダには文字セットの追加指定が行なわれてしまうようです。

setLocale()の削除により、ヘッダ内からContent-Language指定が消えるので、
必要であれば
  response.setHeader("Content-Language", Locale.JAPAN.toString())
等のコードを追加した方が良いと思います。

【テスト環境】
JDK1.4.2_06 / Apache 2.0.52 / Tomcat 4.1.31
IE6.0(WindowsXP Pro SP2) / Acrobat Reader 7.0.3

投稿者:K

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。