登入  |  English
感謝您對「自由軟體鑄造場」的支持與愛護,十多年來「自由軟體鑄造場」受中央研究院支持,並在資訊科學研究所以及資訊科技創新研究中心執行,現已完成階段性的任務。 原網站預計持續維運至 2021年底,網站內容基本上不會再更動。本網站由 Denny Huang 備份封存。
也紀念我們永遠的朋友 李士傑先生(Shih-Chieh Ilya Li)。
技術專欄 iText

iText

Java Opensources for Web Development Part I: 嘗試使用來自 Opensource 的小工具(1)
Lession 6 : iText

上期我們使用 JasperReport 產生報表,然而,輸出的圖表與 PDF 都是使用其他 Opensource 的元件,我們常利用到 iText 來產生 PDF 檔案,有時候,我們也可以利用其他的 Java opensource 來建立 PDF,例如 pdfbox 。

在金融資訊服務之中,我們常常會遇到客戶需要一些不可修改的文件備查,PDF 是 Adobe 公司的公開文件格式,非常適合應用在這方面。雖然 PDF 的保密編碼方式還是有點漏洞,可以遭到破解,但是比起其他的文件格式來說,PDF 可以方便列印與檔案保存,只要妥善地利用,也可以作為相關的文件版本控管。所以當我們無法利用 Jasper-Report 來產生適當的報表之時,我們就必須直接利用 iText 來打造自己的 pdf 輸出。

◎ 利用 iText 作最簡單的 PDF 輸出

所有開發都是得先說 Hello World , 讓我們首先就來製作 HelloWorld.PDF 吧。

package com.softleader.pdf;

import java.io.FileOutputStream;

import com.lowagie.text.Document;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.PdfWriter;

public class HelloWorldPDF {
public static void main(String[] args) {
Document doc = new Document(); // (1)
try {

PdfWriter.getInstance(doc, new FileOutputStream("HelloWorld.pdf")); // (2)
doc.open(); // (3)
doc.add(new Paragraph("Hello World")); // (4)

} catch ( Exception ex ) {
System.out.println(ex);
} finally {
doc.close(); // (5)
}
}

}
在程式後面我加入數字註解,為了就是說明 iText 五個步驟,(1) 文件 -> (2) 輸出 -> (3) 開啟 -> (4) 內容 -> (5) 關閉。稍微對照程式碼,就不難了解產生的方式。 主要來說,我們將著重於 (4) 內容的調整,例如可以放入各式各樣的文字或是圖檔,也可以產生表格。另外,也可以加入 XmlParser 匯入 XML/XHTML 格式的檔案,相關的應用,就給讀者自行上網查詢。另外,我們使用 PDF 的時候,必須使用附加中文字型,我們必須放入 iTextAsian.jar 來使用 CJK fonts(中日韓表意文字)在 classpath 之中,如果要附加其他字型,也可利用 TTF fonts。(文鼎的字型有支援 pdf,大多的華康字型是無法使用的)。
BaseFont.createFont("\\kaiu.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
◎ 利用 Servlet 輸出利用 iText 產出的 PDF

最後,必須要說明的是,因為我們要放在網頁之中,有時候不想存放實體檔案,希望直接匯到客戶端出去。所以可以利用下面這方式利用 Servlet 輸出。

ByteArrayOutputStream baosPDF = // 產生 PDF
String pdfname = “helloworld.pdf”;
//設定 HttpHeaders
response.setHeader("Expires", "0");
response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
//設定 ContentType 為 ‘application/pdf”
res.setContentType("application/pdf");
// M$ IE 需要 輸出的 size()
res.setContentLength(baosPDF.size());
// write ByteArrayOutputStream to the ServletOutputStream
ServletOutputStream out = res.getOutputStream();
baosPDF.writeTo(out);
out.flush();



自由軟體鑄造場電子報 : 第 64 期 GPL3 草案修改要點解析

分類: 技術專欄