先生の「iTextを使ってPDF帳票を出力するためのラッパー 」と「JSPからiTextを使う」を拝見させて頂きましたが、私の問題と似ているが、ちょっと違う質問です。
動的にJSP(HTML?)のボタンをクリックすることによって、最新のデータを基ついてPDFファイルを作成して、そのPDFファイルをリアルタイムでIEで表示することは可能でしょうか?
JSPで、
<embed src="test.pdf" type="application/pdf" width="100%" height="100%">
と間接にアクセスように
<a href="test.pdf">show pdf</a>
両方をやってみました。
結果ですが、
1.ファイル上test.pdfには最新のデータが反映しています。
但し、
2.IEでは変更前ののままで表示されています。
#IEの「最新の情報に更新」してもだめです。
3.ECLIPSE3.3で確認しているから、Refresh(F5)すれば、IEに最新のものが表示されます。
#新規ファイル名で作成してもRefresh(F5)しない限り存在することが認識されないみたいです。
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Expires" content="Thu, 01 Dec 1994 16:00:00 GMT">
などもJSPに入れてみましたが、結果は一緒です。
TOMCATの設定の気もしますが、どう解決できるかを、ご存知でしたら教えて頂けますか?
宜しくお願い申しあげます。
動的にJSP(HTML?)のボタンをクリックすることによって、最新のデータを基ついてPDFファイルを作成して、そのPDFファイルをリアルタイムでIEで表示することは可能でしょうか?
JSPで、
<embed src="test.pdf" type="application/pdf" width="100%" height="100%">
と間接にアクセスように
<a href="test.pdf">show pdf</a>
両方をやってみました。
結果ですが、
1.ファイル上test.pdfには最新のデータが反映しています。
但し、
2.IEでは変更前ののままで表示されています。
#IEの「最新の情報に更新」してもだめです。
3.ECLIPSE3.3で確認しているから、Refresh(F5)すれば、IEに最新のものが表示されます。
#新規ファイル名で作成してもRefresh(F5)しない限り存在することが認識されないみたいです。
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Expires" content="Thu, 01 Dec 1994 16:00:00 GMT">
などもJSPに入れてみましたが、結果は一緒です。
TOMCATの設定の気もしますが、どう解決できるかを、ご存知でしたら教えて頂けますか?
宜しくお願い申しあげます。
投稿:chu[chu]/2009年 11月 05日 21時 38分
/更新:2009年 11月 05日 21時 40分
RE:JSPからPDFファイルを動的に表示することは可能でしょうか?
by 竹形 誠司[takegata]
竹形です。こんにちは。
ご質問の件ですが、test.pdfが生成されるタイミングの問題ではないかと思います。ブラウザがtest.pdfを読み込もうとした時点では、まだtest.pdfの生成が終わっていないのではないでしょうか。
サーバ側でファイルを生成して、それをブラウザで読み込む場合は、ファイルの生成が完了したことをブラウザに知らせ、ブラウザはそれを待って読みに行くような仕掛けが必要になります。
ByteArrayOutputStreamを使って(HTMLではなく)バイナリデータを直接ブラウザに返せばこのような問題は起きません。次のようなコードでJSPからPDFファイルを動的に生成することができます(ただし問題があります)。
http://www.orquesta.org/takegata/test/iTextJSP_Form.jsp
このコードでブラウザにPDFは表示されますが、Tomcatのログに次のようなエラーメッセージが残ります。
私もいろいろ試してみましたが、結論としては面倒でもサーブレットを使った方がよいようです。
ご質問の件ですが、test.pdfが生成されるタイミングの問題ではないかと思います。ブラウザがtest.pdfを読み込もうとした時点では、まだtest.pdfの生成が終わっていないのではないでしょうか。
サーバ側でファイルを生成して、それをブラウザで読み込む場合は、ファイルの生成が完了したことをブラウザに知らせ、ブラウザはそれを待って読みに行くような仕掛けが必要になります。
ByteArrayOutputStreamを使って(HTMLではなく)バイナリデータを直接ブラウザに返せばこのような問題は起きません。次のようなコードでJSPからPDFファイルを動的に生成することができます(ただし問題があります)。
<%@ page pageEncoding="utf-8"%>
<%@ page import="java.io.*, com.lowagie.text.*, com.lowagie.text.pdf.*"%>
<%@ page contentType="application/pdf"%>
<%
request.setCharacterEncoding("utf-8");
String str = request.getParameter("str");
Document document = new Document();
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
PdfWriter pdfwriter = PdfWriter.getInstance( document, buffer );
document.open();
BaseFont bf = BaseFont.createFont("HeiseiKakuGo-W5","UniJIS-UCS2-H",false);
PdfContentByte pcb = pdfwriter.getDirectContent();
pcb.beginText();
pcb.setTextMatrix(180,700);
pcb.setFontAndSize(bf,50);
pcb.setLeading(15);
pcb.showText(str);
pcb.endText();
document.close();
response.setContentLength(buffer.size());
ServletOutputStream output = response.getOutputStream();
buffer.writeTo(output);
output.flush();
%>
テストページを作って置いたので、下のフォームで何かを入力してみてください。<%@ page import="java.io.*, com.lowagie.text.*, com.lowagie.text.pdf.*"%>
<%@ page contentType="application/pdf"%>
<%
request.setCharacterEncoding("utf-8");
String str = request.getParameter("str");
Document document = new Document();
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
PdfWriter pdfwriter = PdfWriter.getInstance( document, buffer );
document.open();
BaseFont bf = BaseFont.createFont("HeiseiKakuGo-W5","UniJIS-UCS2-H",false);
PdfContentByte pcb = pdfwriter.getDirectContent();
pcb.beginText();
pcb.setTextMatrix(180,700);
pcb.setFontAndSize(bf,50);
pcb.setLeading(15);
pcb.showText(str);
pcb.endText();
document.close();
response.setContentLength(buffer.size());
ServletOutputStream output = response.getOutputStream();
buffer.writeTo(output);
output.flush();
%>
http://www.orquesta.org/takegata/test/iTextJSP_Form.jsp
このコードでブラウザにPDFは表示されますが、Tomcatのログに次のようなエラーメッセージが残ります。
致命的: サーブレット jsp のServlet.service()が例外を投げました
java.lang.IllegalStateException: getOutputStream()はこのレスポンスに対して既に呼び出されています
また、プログラムを注意してかかないと、改行コードがバイナリデータに混ざってしまうことがあるので、JSPからバイナリデータを生成することは、あまり一般的ではないようです。java.lang.IllegalStateException: getOutputStream()はこのレスポンスに対して既に呼び出されています
私もいろいろ試してみましたが、結論としては面倒でもサーブレットを使った方がよいようです。
投稿:竹形 誠司[takegata]/2009年 11月 05日 23時 15分
/更新:2009年 11月 05日 23時 16分
早い返事有難うございます。
まず、
> テストページを作って置いたので、下のフォームで何かを入力してみて...
http://www.orquesta.org/takegata/test/iTextJSP_Form.jsp
確かにPDFのページに入力したものが表示されます。
おっしゃたように
> test.pdfが生成されるタイミングの問題ではないかと思います。ブラウザがtest.pdfを読み込もうとした時点では、まだtest.pdfの生成が終わっていないのではないでしょうか。
これはちょっと違うと思われます。理由は
a.複数回を実行しても同じ結果です。つまり、2回目の実行する前に、test.pdfもう新しい内容になっていることが確認されているが、2回目、3回目、...もIE上は最新になっておりません。
b.Eclipseで生成したpdfファイルが入るフォルダをRefreshすれば、IEに最新の内容が表示されます。
c.別なファイル名に出力すれば、IEでは空白のページが表示されます。ファイルが存在しないみたいです。無論ファイルは存在しています。a.と同じく複数回を実行しても同じ結果です。b.と同じくRefreshすれば、IEでは正しく表示されます。
考えば、作って頂いたiTextJSP_Form.jspで正しく表示されます。私も似ている方法で作っていますが、違いは私のほうは一旦ファイルに落として、そのファイルをIEで表示しようとしています。
IEに"PDFファイル"での表示は静的にしかできませんか?
PDFファイルを作成したあと、自動的にRefreshのやり方はできませんか?
宜しくお願い申し上げます。
投稿:chu[chu]/2009年 11月 06日 00時 18分
/更新:2009年 11月 06日 00時 18分
>#新規ファイル名で作成してもRefresh(F5)しない限り存在することが認識されないみたいです。
ということだったので、test.pdfを読み込もうとした時点では、まだtest.pdfの生成が終わっていないのではないかと思いました。
リフレッシュしないと更新されないのは、ブラウザがキャッシュからデータを読んでいるからではないでしょうか。
ということだったので、test.pdfを読み込もうとした時点では、まだtest.pdfの生成が終わっていないのではないかと思いました。
リフレッシュしないと更新されないのは、ブラウザがキャッシュからデータを読んでいるからではないでしょうか。
投稿:竹形 誠司[takegata]/2009年 11月 06日 02時 57分
/更新:2009年 11月 06日 03時 19分
遅くまで回答して頂いて申し訳ありません。本当にありがとうございます。
> ということだったので、test.pdfを読み込もうとした時点では、まだtest.pdfの生成が終わっていないのではないかと思いました。
いいえ。2回目以降は同じ名前(1回目新規と同じ名前)にしても2回目も3回目も...IEには反映されないです。
> リフレッシュしないと更新されないのは、ブラウザがキャッシュからデータを読んでいるからではないでしょうか。
a.ブラウザがキャッシュしていないと思って<mete...>などを入れたです。効果がありません。
b.ブラウザの「最新の情報に更新」をやっても駄目です。
c.EclipseのpdfのフォルダをRefreshすれば、ブラウザの「最新の情報に更新」をやれば最新になります。
TOMCAT(?)が最初読み込んで、そのあと、Refreshしない限り最新の内容を読まないから最初のもの返すとの感じです。つまり、Eclipseからimportでなくて、勝手にwinからファイルをprojectのフォルダにコピーしてrefreshしないとEclipseが認識しないと同じ現象です。
宜しくお願い申し上げます。
> ということだったので、test.pdfを読み込もうとした時点では、まだtest.pdfの生成が終わっていないのではないかと思いました。
いいえ。2回目以降は同じ名前(1回目新規と同じ名前)にしても2回目も3回目も...IEには反映されないです。
> リフレッシュしないと更新されないのは、ブラウザがキャッシュからデータを読んでいるからではないでしょうか。
a.ブラウザがキャッシュしていないと思って<mete...>などを入れたです。効果がありません。
b.ブラウザの「最新の情報に更新」をやっても駄目です。
c.EclipseのpdfのフォルダをRefreshすれば、ブラウザの「最新の情報に更新」をやれば最新になります。
TOMCAT(?)が最初読み込んで、そのあと、Refreshしない限り最新の内容を読まないから最初のもの返すとの感じです。つまり、Eclipseからimportでなくて、勝手にwinからファイルをprojectのフォルダにコピーしてrefreshしないとEclipseが認識しないと同じ現象です。
宜しくお願い申し上げます。
投稿:chu[chu]/2009年 11月 06日 08時 09分
>TOMCAT(?)が最初読み込んで、そのあと、Refreshしない限り最新の内容を
>読まないから最初のもの返すとの感じです。つまり、Eclipse からimport
>でなくて、勝手にwinからファイルをprojectのフォルダにコピーしてrefresh
>しないとEclipseが認識しないと同じ現象です。
うーむ、それはTomcatの設定とは関係ないような気がしますが・・・・
私はEclipseを使わないので詳しくは分かりません、すみません。
>読まないから最初のもの返すとの感じです。つまり、Eclipse からimport
>でなくて、勝手にwinからファイルをprojectのフォルダにコピーしてrefresh
>しないとEclipseが認識しないと同じ現象です。
うーむ、それはTomcatの設定とは関係ないような気がしますが・・・・
私はEclipseを使わないので詳しくは分かりません、すみません。
投稿:竹形 誠司[takegata]/2009年 11月 06日 18時 48分
/更新:2009年 11月 06日 18時 49分
竹形 様
色々有難うございます。貴重なヒントを頂いて、解決方法を見つかりました。pdfファイルを直接読み込んで、あとは竹形様の例と同じく、サーブレットを使ってリアルタイムで表示できました。
#同じくTomcatのログにエラーメッセージが残ってしまいます。
お陰様で無事に解決できて、本当に有難うございます。
これからも宜しくお願い申し上げます
色々有難うございます。貴重なヒントを頂いて、解決方法を見つかりました。pdfファイルを直接読み込んで、あとは竹形様の例と同じく、サーブレットを使ってリアルタイムで表示できました。
#同じくTomcatのログにエラーメッセージが残ってしまいます。
お陰様で無事に解決できて、本当に有難うございます。
これからも宜しくお願い申し上げます
投稿:chu[chu]/2009年 11月 06日 19時 40分
/更新:2009年 11月 06日 19時 40分
そうですか。私の方ではちょっと原因が分かりませんが、解決したのは良かったですね。
また何かあれば遠慮なく書き込んでください。
また何かあれば遠慮なく書き込んでください。
投稿:竹形 誠司[takegata]/2009年 11月 07日 07時 37分
/更新:2009年 11月 07日 07時 38分
XMLで帳票のテンプレートを作成し、JPSから動的にPDFを出力する方法についてエントリを書きましたので、こちらも参照してください。
http://www.orquesta.org/takegata/Article/ArticleView.jsp?article_id=825
http://www.orquesta.org/takegata/Article/ArticleView.jsp?article_id=825
投稿:竹形 誠司[takegata]/2011年 05月 21日 19時 28分
/更新:2011年 05月 21日 19時 28分