問題の原因
つい最近、JSP を通じて PDF レポートを生成する小さなプロジェクトを実行しましたが、これは驚くべきことでした。企業情報の一部はネットワーク経由でHTMLレポートを作成していますが、IEでは表示内容を直接印刷することができますが、HTMLの表示結果を直接印刷すると見た目があまり美しくありません。 PDF ファイルに変換して印刷すると、印刷効果がさらに向上します。
iText の概要
iText は、PDF ファイルを簡単に生成するために使用できるオープン ソースの Java クラス ライブラリです。 http://sourceforge.net/project/showfiles.php?group_id=15255&release_id=167948 にアクセスして、クラス ライブラリの最新バージョンをダウンロードできます。ダウンロードが完了すると、.jar パッケージが取得されます。それを使用するための JDK クラスパス。生成された PDF ファイルに中国語、日本語、および韓国語の文字を表示する必要がある場合は、 http://itext.sourceforge.net/downloads/iTextAsian.jarにアクセスして iTextAsian.jar パッケージをダウンロードする必要もあります。
iText クラス ライブラリの使用については、 http://www.lowagie.com/iText/tutorial/index.html に詳細なチュートリアルがあります。このチュートリアルでは、PDF ファイルにテキスト、画像、表などを配置する方法とテクニックを基礎から体系的に紹介します。このチュートリアルを読むと、単純な PDF ファイルから複雑な PDF ファイルまでを作成できるようになります。ただし、PDF ファイルを生成するプロセスで遭遇するすべての困難をチュートリアルで解決しようとするのは、間違いなく贅沢です。したがって、iText API ドキュメントを読むことが非常に重要です。読者はクラス ライブラリをダウンロードするときに、クラス ライブラリのドキュメントもダウンロードできます。
iText を使用して Java プログラムで PDF レポートを生成する方法
以下は、上記のチュートリアルの最も単純な例であり、iText を通じて PDF ファイルを生成するための一般的なプログラム フレームワークを示しています。読者は、PDF ファイルに入れたいコンテンツを document.open() と document.close(); の 2 つのステートメントの間に追加するだけで済みます。この例では、「Hello World」というテキスト行を PDF ファイルに追加するだけです。
ドキュメント document = new Document();
try
{
PdfWriter.getInstance(document, new FileOutputStream ("Chap0101.pdf"));
document.add
(
new
Paragraph("Hello World"));
DocumentException de)
{
System.err.println(de.getMessage());
}
catch(IOException ioe)
{
System.err.println(ioe.getMessage())
;
からわかるように
、
上の例では、プログラムのフレームワークは非常に明確で簡単です。しかし、PDF内の文字や図、表の位置を指定するのは非常に面倒な作業です。プログラム内の位置を常に変更し、プログラムを実行して PDF ファイルを生成し、PDF 内の要素の位置が適切かどうかを観察するというプロセスを除けば、これより良い方法はないようです。
JSP を介して PDF レポートを生成する方法は
iText チュートリアルには記載されておらず、インターネット上には関連情報が比較的少ないです。以前、誰かが実装の詳細を求める投稿を CSDN に投稿しているのを見たことがあり、実装の原則について誰かが答えました。まずサーバー上で PDF ファイルを生成し、次にユーザーは PDF ファイルを指すハイパーリンクをクリックしてダウンロードするか開くかを選択します。これはアイデアというかアイデアの一つです。この記事では、このアイデアを実現し、別のアイデアを与えて 2 つの方法で実装します。
1) PDF ファイルをサーバー上で直接生成します。
<%@ page import ="com.lowagie.text.*,com.lowagie.text.pdf.*, java.io.*"%>
<%
String filename = "PDF"+(new Random()).nextInt ()+".pdf" ;
ドキュメント document = new Document(PageSize.A4
)
= response.getOutputStream();
try
{
PdfWriter ライター = PdfWriter.getInstance(document, new FileOutputStream(filename) );
);
document.add(新しい段落("Hello World"));
}
catch(例外 e)
{}%>
上記のプログラムは、サーバー上に静的な PDF ファイルを生成します。当然のことながら、各実行で取得される PDF ファイルの名前は一意であり、重複してはなりません。このプログラムは、ランダム関数を使用して、生成された PDF ファイルに名前を付けます。このプログラムの欠点は、実行されるたびにサーバー上に PDF ファイルが生成され、それが期限内に削除されないと、ファイル数がどんどん大きくなってしまうことです。これは明らかにサイト管理者にとって望ましくないことです。見る。
2) PDF ファイルをストリーム形式でクライアントのキャッシュに転送します。この利点は、サーバー上に「遺物」が残らないことです。
i) JSP ページを通じて直接生成
<%@
page import="java.io.*,java.awt.Color,com.lowagie.text.*,com.lowagie.text.pdf.*"%>
<%
response.setContentType( "application/pdf" );
ドキュメント document = new Document();
ByteArrayOutputStream バッファ = new ByteArrayOutputStream();
document.open
(
);
document.close();
DataOutput 出力 = new DataOutputStream(response.getOutputStream() );
byte[] bytes =buffer.toByteArray()
;
for( int i = 0; i < バイト。長さ; i++ )
{
出力.writeByte( bytes[i] )
}
%>
ii) サーブレットを通じて生成
インポート java.io.*;
インポート javax.servlet.
*;
インポート
com.lowagie.text.
*;
HttpServletResponse)
throws IOException,ServletException
{
Document document = new Document(PageSize.A4, 36,36,36,36);
ByteArrayOutputStream
ba = new ByteArrayOutputStream()
try
{
PdfWriter Writer = PdfWriter.getInstance(document, ba);
.open();
document.add(new Paragraph("Hello World"));
}
catch(DocumentException de)
{
de.printStackTrace();
System.err.println("ドキュメント エラー:" +de.getMessage() );
}
document.close();
応答
.setContentLength
(
ba.size
());
()
;
プロジェクトで 2 番目のアプローチを使用すること
になりました
。この記事のソース コードは Tomcat4 でデバッグされています。皆様に利便性をもたらすことができれば幸いです。
どなたでもご利用いただけますので、転載する場合は出典を明記してください。