[Wicket-ja-user 376] Re: StringResourceStream を使用してのPDF表示について

Back to archive index

Tsutomu Yano t_yano****@me*****
2009年 9月 2日 (水) 03:00:15 JST


矢野です。

特に動作確認してないので勘のようなものでもうしわけないのですが...

stream.toString()でJava文字列に変換するときに、PDF内の文字データが壊れてないでしょうか。
ByteArrayOutputStream#toStringには、引数にエンコーディング名を取るものもあるのでそれを
使えばいいようにも見えますが、PDFのエンコーディングの取り扱いは、そう単純でもないみたいですね。

参考: http://www.informe.co.jp/useful/pdf/pdf7.html

PDFは文字列ではありますが、StringResourceStreamを使うには、PDF文字列をいったんJava文字列
に変換しないといけないので、エンコーディングではまりそうな気がします。


今回のケースですと、PDFデータとして完全なバイト配列がすでにあるわけですから、それを
そのままブラウザに返却し、クライアントのPDFリーダに処理を任せるのが良いように思います。

WicketのResourceStreamを使いたいのであれば、ByteArrayResourceオブジェクトを生成し、
getResourceStream()を呼び出すことで簡単にResourceStreamを取得することができます。

# 実際、ByteArrayResourceのJavaDocをみると、動的に生成されたPDFデータなんかに
# 使う、と書かれていますし...

さらに言えば、ResourceLinkとByteArrayResourceを使うと、ResourceStreamを自分で処理することも
なく、ResourceLinkのコンストラクタにByteArrayResourceを渡すだけで、リソースのダウンロード
リンクを作ることもできます。今回はそれが用途なのかどうかはわかりませんが...


以上、ご参考になれば。



On 2009/09/01, at 20:55, maeda wrote:

> maedaです。
>
> StringResourceStreamを使用してのPDF表示について質問なのですが
>
> PDF作成ライブラリを使用して吐き出されたByteArrayOutputStreamでPDF表示を行いたいのですが
> 下記のソースコードを実行すると
> ページ数は正しいのですが白紙のPDFが表示されてしまいます。
> なにか足りない処理などありますでしょうか?
>
> setCharsetで指定している文字コードはUTF-8です。
>
> /**
> *
> * 印刷ボタン
> */
> private SubmitLink printLink = new SubmitLink("printLink") {
> 	@Override
> 	public void onSubmit() {
> 		
> 		//PDF作成処理
> 		ByteArrayOutputStream stream = testService.printLink();
>
> 		StringResourceStream rs = null;
> 		rs = new StringResourceStream(stream.toString(),"application/pdf");
> 		rs.setCharset(Charset.forName(getResponse().getCharacterEncoding()));
> 		getRequestCycle().setRequestTarget(new ResourceStreamRequestTarget(rs));
> 	}
> };
>
> 下記のような感じで
> getResponseしてPDFを出力すると正しく表示されるのでPDFは問題ないと思うのですが・・・。
>
> /**
> *
> * 印刷ボタン
> */
> private SubmitLink printLink = new SubmitLink("printLink") {
> 	@Override
> 	public void onSubmit() {
> 		ByteArrayOutputStream stream = testService.printLink();
>
>        // responseを取得
>        WebResponse response = (WebResponse) getResponse();
>
>        // ヘッダー設定
>        response.setContentType("application/pdf");
>        response.setHeader("Content-Disposition", "inline");
>
>        // responseのOutputStreamにPDFのByteArrayOutputStreamをセット
>        try {
>        	OutputStream os = response.getOutputStream();
>            os.write(stream.toByteArray());
>            os.close();
>
>        }catch (Exception e) {
>        	throw new RuntimeException(e);
>        }
>        //responseをセット
>        setHeaders(response);
> 	}
> };
>
> _______________________________________________
> Wicket-ja-user mailing list
> Wicke****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/wicket-ja-user

---------------------------------------------------
矢野 勉(やの つとむ)
電子メール: t_yano****@me*****
---------------------------------------------------




Wicket-ja-user メーリングリストの案内
Back to archive index