• 締切済み

Java Webアプリ。PDFダウンロード

Tomcat6(Struts2.x)で構築されたWebサイトにPDFダウンロード機能を実装しています。 PDFファイルの内容は動的に変更する必要があり別のライブラリを使いExcelテンプレートを元にに生成しています。 この処理(Excelテンプレ → (DBなどのデータを動的に埋め込み) → PDFファイル生成)は正常にできています。 ただ正常に動かす為には生成したPDFファイルをサーバー内のディレクトリに置いた後、そのファイルを使い InputStream inputStream = FileUtils.openInputStream(new File("そのファイル")); としてこの inputStream をStruts2のアクションの設定ファイルで --------------------------------------------------------------------------- <result type="stream"> <param name="contentType">application/pdf</param> <!-- 上記のメンバ変数の imputStreamを指定。 --> <param name="inputName">inputStream</param> <param name="contentDisposition">attachment; filename = ${fileName}</param> <param name="bufferSize">${bufferSize}</param> <param name="contentLength">${contentLength}</param> </result> --------------------------------------------------------------------------- としています。この方法だとうまくいってますし最終的にやりたい事も実現できてます。 しかし、 生成したPDFファイルをサーバー内のディレクトに置くという処理が気になっています。 というのも前述したExcelファイルからPDFを生成するライブラリは以下のように使います。 ※わかり辛いですが全体的な処理の流れとしては上記までが下記より後に実行されます!! --------------------------------------------------------------------------- // まず FileOutputStream のインスタンスを作る(C:/hoge.pdf はもちろんこの時点では存在しなくてOK)。 FileOutputStream fos = new FileOutputStream("C:/hoge.pdf"); // PDF生成ライブラリのクラスのコンストラクタ。 HogeTemplatePdf pdf = new HogeTemplatePdf("サーバー内に置いたExcelのテンプレ"); // このprintPdf()メソッドを実行するとPDF(C;/hoge.pdf)が生成されます。 pdf.printPdf(fos); --------------------------------------------------------------------------- ※このPDF生成のライブラリは私の方では変更できないものです。 このように printPdf() メソッドは OutputStream へPDFを出力します。 しかし一番上に書いたファイルそのもののダウンロード処理は inputStream で指定しないといけないようです。 つまり現在の処理の流れは、 (FileOutputStream)  ↓ (PDFファイル生成 ※実際に指定したサーバーのパスにファイルができる)  ↓ (サーバー内にできたファイルを指定して inputStream を生成)  ↓ (ダウンロード) という流れですがこれを (FileOutputStream)  ↓ (??? 実際にサーバー内にファイルは生成して欲しくない)  ↓ (サーバー内にできたファイルを指定して inputStream を生成)  ↓ (ダウンロード) のような実装にしたいと考えています。 つまり outputStream を inputStream に変換(?)のような事が行いたいです。 実際にサーバー内にファイルを作るのではなくメモリ上にファイルをつくる(?)のような感じですかね? このような事は可能でしょうか?? 以上です。よろしくお願いします。

みんなの回答

  • kakusuke
  • ベストアンサー率36% (95/259)
回答No.2

コードを見ている限り、 ファイルストリームにする必要は無さそうです。 ByteArrayOutputStream o = new ByteArrayOutputStream() ; HogeTemplatePdf pdf = new HogeTemplatePdf("サーバー内に置いたExcelのテンプレ"); pdf.printPdf(o); ByteArrayInputStream in = new ByteArrayInputStream( o.toByteArray() ) ; o.close() ; o = null ;

回答No.1

#Strus2学ぶの面倒だから試さず、 >つまり outputStream を inputStream に変換(?)のような事が行いたいです。 しか読んでないが、前にそんなの書いたなーと。dosでやったほうが良かったかな…当時も http://ideone.com/DqOFW

関連するQ&A