2008年3月12日 星期三

[iText] iText : A free java-PDF library

Introduction

iText 是一個可以讓Java program 產生 PDF 檔案的 library。其安裝的方式如下列步驟:

1) 經由 iText 官方網站[1]下載此 library,如下圖一

請選擇左邊的 [Download iText](圖一藍圈處) -> [Compiled Code]

clip_image004

圖一 官方下載的網頁

2) 下載的 iText-2.0.8.jar (後面的版本編號可能有所不同),若是一般的 Java Application 要使用,請設定 classpath 位置;若是需要在 Web Server 上面的 Web Application 使用,請放置該 Web Application 的 WEB-INF / lib 之下。

Example

我們在此展現一個將 iText 使用在 Struts framework 上的範例。

(1) 首先就是要先建立一個 PDFAction extends Action

public class PDFAction extends Action
{
    public ActionForward execute(...)  throws Exception
    {}
}

(2)再來就是要建立一個 Document 物件,此物件是 iText library 中最核心的物件,因為他會幫我們展現我們最後的 PDF 內容。

Document document = new Document(PageSize.A4, 50, 50, 30, 30);

(3)建立完核心的物件後,最重要的就是設定該 document 的輸出,一般的 application 就可以直接設定成檔案的輸出,不過在網頁中的輸出卻是 user 的 browser,所以輸出的設定也是一項考驗。

ByteArrayOutputStream out = new ByteArrayOutputStream();
PdfWriter.getInstance(document, out);
document.open();

//PDF Wrinting begin=================================

//PDF Wrinting end==================================

document.close();
response.setContentType("application/pdf");
ServletOutputStream sout = response.getOutputStream();
out.writeTo(sout);
sout.flush();
sout.close();
return null;

首先我們要建立一個 ByteArrayOutputStream 物件,他會負責幫我們將結果輸出成 ByteArray 的形式(類似 row data),並且我們要將 document 的輸出串流指定成剛剛的 ByteArrayOutputStream,接著就是啟動 document 物件。

設定好撰寫內容的起始設定後,當我們內容撰寫完後,我們也必須設定一些物件的狀態。當然,第一步就是關閉我們的 document 物件的寫入,這就當之後有程式碼要對他在進行寫入的動作時,系統會 throw an exception 給我們。另外,告知 browser 我們所要給他的文件格式也是很重要的,所以,我們就設定 response 物件的 content type 為 application/pdf。

接下來就是比較神奇的設定,我們要從 response 中獲得一個 output stream,並且將他指定為 ServletOutputStream,因為 ServletOutputStream 物件可以將我們的 PDF 內容轉換成 Binary data 傳送給 client 端,並且,我們要將先前建立的 ByteArrayOutputStream 的寫出導到 ServletOutputStream,最後就是將 stream 給 flush 並且關閉他。Action 的 execute method 最後回傳的 ActionForward 物件必須為 null,因為我們不需要在做任何的轉換,也不需要在將 controller (也就是此 Action) 的控制權轉交給某個頁面,因為我們已經將輸出的 content type and content 給設定好,所以是回傳 null 的 ActionForward。

(3)再來就是我們要輸出的 PDF 內容囉!從上述的程式碼,我們撰寫 PDF 的內容是在兩段 comments 之間。另外,在官方網站中的範例,他的程式碼都是 run 在單機上,不過對於 PDF 內容的撰寫卻可以移植到我們的 action 中,也就是接下來,您可以參考官方網站的範例程式,將 PDF 撰寫的程式碼放在上面程式碼中的 comments 之間,就可以執行了。當然,Struts 的基本設定是少不了的,在此就不再贅述了~

References

[1] iText 官方網站 http://www.lowagie.com/iText/

該網站提供所有相關於 iText 的所有資訊

[2] iText API http://itext.ugent.be/library/api/

[3] iText Tutorial : iText by Example http://itextdocs.lowagie.com/tutorial/

該網站提供許多線上的基本範例,除了提供範例程式外,還提供程式產生 PDF 的結果以供參考

沒有留言: