iTextを利用してJSPでPDFレポートを生成する。


問題の由来はこの前JSPを通じてPDFレポートを生成する小さいプロジェクトをしました。視野を広げました。企業のいくつかの情報は、ネットワークを通じてHtmlレポートを形成しています。IEは直接にその中に表示されている内容を印刷することができますが、画面上から見ると、Htmlの表示結果を直接印刷すると、あまりきれいではありません。それをPDFファイルに変えて印刷すると、印刷効果が多くなります。iTextプロファイルiTextはJavaライブラリのオープンソースであり、PDFファイルを簡単に生成することができます。みんなは訪問を通じてhttp://sourceforge.net/project/showfiles.php?group_id=15255&release_ID=167948は最新バージョンのクラスライブラリをダウンロードして、ダウンロードしたら一つをもらいます。jarパッケージは、このカバンをJDKのクラスパスパスに入れて使えます。生成されたPDFファイルに中国語、日本語、韓国語の文字が必要であれば、アクセスが必要です。http://itext.sourceforge.net/downloads/iTextAsian.jariText Asian.jarパッケージをダウンロードします。iTextライブラリの使用については、http://www.lowagie.com/iText/tutorial/index.html比較的詳しい教程があります。本教程は入門から始まり、PDFファイルに文字、画像、表などを入れる方法とテクニックを体系的に紹介しています。この教程を読んで、簡単から複雑なPDFファイルまで大体できます。しかし、教程を通じてPDFファイルを生成する過程で発生したすべての困難を解決しようとするのは過分の望みに違いない。ですから、iTextのapi文書を読むことはとても重要です。読者は、ライブラリをダウンロードすると同時に、ライブラリのドキュメントをダウンロードすることができます。どのようにiTextを利用してjavaプログラムでPDFレポートを生成するかは、上記の教程の中で最も簡単な例であり、この例はiTextを通じてPDFファイルを生成する一般的なプログラムの枠組みを描写している。読者はdocument.openだけが必要です。とdocument.close();二つの文の中に自分のPDFファイルに入れたい内容を入れてください。この例はPDFファイルに「ハローWorld」の一行の文字しか入れていません。Dcument document=new Dcument();try{PdfWriter.get Instance(document,new FileOutput Stream(“Chop 0101.pdf”);document.open()document.add(new Paraph(「ハローWorld」);catch(DcumentException de){System.err.println(de.getMessage()};catch(IOExceptioe){System.err.println(ioe.get Message()};document.close()以上の例から分かるように、プログラムの枠組みは非常に明確である。しかし、PDFで文字、図画、表の位置を指定するのは大変です。常にプログラム内で位置を修正し、プログラムを実行し、PDFファイルを生成し、PDF中の要素の位置が合理的かどうかを観察するプロセス以外に、他によい方法はないようです。どのようにJSPを通してPDFレポートを作成するかはiTextの教程にはないです。ネット上の関連資料も少ないです。CSDNで書き込み問い合わせをしたことがありますが、実現の原理を答えた人がいます。まずサーバーでPDFファイルを作成してから、ユーザーはPDFファイルへのハイパーリンクをクリックしてダウンロードまたは開くことを選択します。これは考え方です。あるいは考え方の一つです。本論文はこの構想を実現し、また別の考え方を提供し、二つの道を通じて実現した。1)直接にサーバ上でPDFファイルを生成します。<%@page import="comp.lowagie.text.*,comp.lowagie.text.pdf.*,java.io.*"<%String filename="PDF"+(new Random).nextInt()+".pdf";Document document=new Dcument(PageSize.A 4)ServletOutputStream out 1=reponse.get Output Stream();try{PdfWriter writer=PdfWriter.get Instance(document,new FileOutput Stream);document.open()Dcument.add(new Paraph(「ハローワールド」);document.close()}catch(Exception e){%> 上のプログラムはサーバ上で静的なPDFファイルを生成しました。明らかに、毎回実行して得られたPDFファイルの名前は唯一無二で重いものはないはずです。このプログラムはランダム関数によって生成されたPDFファイルに名前を付けます。このプログラムの欠点は、実行するたびにサーバー上にPDFファイルが作成されます。削除しないと、ますます数量が大きくなります。これは明らかにサイトのメンテナが見たくないです。 2)PDFファイルをフローによってクライアントのキャッシュに転送する。このようにするメリットは、サーバ上にいかなる「遺跡」も残らないことです。 i)直接JSPページで生成する  <%@page import="java.io.*,java.awt.C.olor,comp.lowagie.text.*,comp.lowagie.text.pdf.*"<%reponse.set ContentType(「appication/pdf」);Dcument document=new Dcument();ByteArayOutputStream buffer=new ByteArayOutputStream();PdfWriter=PdfWriter.get Instance(document,buffer);document.open()Dcument.add(new Paraph(「ハローワールド」);document.close()DataOutput output=new Data Output Stream(reponse.get Output Stream);byte[]bytes=buffer.toByteAray();レスポンス.set ContintLength(bytes.length)for(int i=0;i<bytes.lengthi+){output.writeByte(bytes[i];} ii)Servletによる生成  import java.io.*;import javax.servlet.*;import javax.servlet.http.*;import come.lowagie.text.*;import come.lowagie.text.pdf.*;public void doGet(HttpServletRequest request、HttpServletResonse reponse)throws IOException、Servlet Excetion{Dcument document=new Dcument(PageSize.A 4,36,36,36);ByteArayOutputStream ba=new ByteArayOutputStream();try{PdfWriter writer=PdfWriter.get Instance(document,ba);document.open()Dcument.add(new Paraph(「ハローワールド」);}catch(Docment Exception de){de.print StockTrace();System.err.printel("A Dockment error:"+de.get Message());}document.close();レスポンス.set ContectType(「appication/pdf」)レスポンス.set ContintLength(ba.size();ServletOutputStream out=reponse.get Output Stream()ba.writeTo(out);out.flush()私がプロジェクトで採用したのは第二の方法です。本文のソースコードは私のtomcat 4の上に全部デバッグで通っています。皆さんに便利にしてほしいです。ご利用を歓迎します。転載が必要なら、出典を明記してください。