使用iText操作pdf檔案
前段時間寫過一篇文章《java讀取pdf檔案的內容》,pig0045給我回複,說可以直接利用iText搞定,我很感激,因為以前處理pdf檔案並不多,對這塊相關組件並不瞭解,pig0045給我介紹了一個新的方法,謝謝!欣喜之餘,馬上google了一把iText,發現iText在產生pdf檔案方面功能很強大,而在讀取pdf檔案內容方面似乎涉及並不多(也許是我沒查到,有不同觀點的朋友,大家探討一下阿)。
同時我也查了下java領域針對pdf的相關組件,發現有很多開源的東東,都可以操作pdf,恩,很不錯的。大致介紹幾個:xpdf,iText,PDFBox,感興趣的話,大家可以自己查一下。
好了,回到文章主題,查了下iText後,我也去稍微看了下相關的api,做了一些簡單的demo,雖然網上相關介紹很多,但是自己寫一遍程式再用自己的語言記錄下來,理解會更為深刻一點。
準備工作:到http://www.lowagie.com/iText/下載最新的iText的jar包,並將其放到classpath中。
一.Hello WorldiText建立pdf檔案是十分簡單的,為了示範其極其簡單性,我們做一個HelloWorld吧,讓大家體驗一下。
在這個pdf檔案中,我們只顯示一句話"Hello World",實現方式如下:
// 建立一個文檔對象
Document doc = new Document();
try ...{
// 定義輸出位置並把文檔對象裝入輸出對象中
PdfWriter.getInstance(doc, new FileOutputStream("/root/hello.pdf"));
// 開啟文檔對象
doc.open();
// 加入文字“Hello World”
doc.add(new Paragraph("HelloWorld"));
// 關閉文檔對象,釋放資源
doc.close();
} catch (FileNotFoundException e) ...{
e.printStackTrace();
} catch (DocumentException e) ...{
e.printStackTrace();
}
怎麼樣?很簡單吧?下面我們對以上代碼稍作解釋。
Document(文檔)是建立pdf需要使用的第一個類,一旦建立了文檔,要向pdf檔案裡寫入內容,則需要一個寫入器,而PdfWriter就是這樣的一個寫入器。Paragraph這個類表示一個縮排的段落。運行以上程式,我們就會在/root目錄下看到hello.pdf檔案。
但是在實際工作中,我們不可能做這麼簡單的工作,下面就介紹一下常用的操作。
二.設定頁面邊界如果我們希望定義頁面大小和頁面邊界,可以通過使用Document的構造方法實現:
public Document();
public Document(Rectangle pageSize);
public Document(Rectangle pageSize,
int marginLeft,
int marginRight,
int marginTop,
int marginBottom);
如下:
Rectangle pSize=new Rectangle(144,90);
//文檔的背景色
pSize.setBackgroundColor(Color.blue);
//建立一個文檔對象,設定初始化大小和頁面邊界
Document doc=new Document(pSize,5,5,5,5);
在上面的例子中我們通過Rectangle設定了文檔的大小,其實iText已經為我們定義好了許多常用的頁面,比如:A0-A10,我們可以直接調用,如下:
Document doc=new Document(PageSize.A4,5,5,5,5);
三.設定字型iText可以設定顯示文本的字型,大小,顏色等,如下:
// 加入文字“Hello World”,並設定字型為粗體,大小為20,顏色為紅色
doc.add(new Paragraph("HelloWorld", FontFactory.getFont(
FontFactory.COURIER, 20, Font.BOLD, new Color(255, 0, 0))));
而要實現中文支援,我們需要到http://itextdocs.lowagie.com/downloads/iTextAsian.jar下載中文支援包,然後把它放入classpath中(我試了幾次,都無法下載,這裡先不說這塊了)。
四.編輯表格pdf中的table和html中的table差不多,只是其儲存格是cell,如下代碼加入了一個2*2的表格,代碼很簡單,就不過多解釋了。
Document doc = new Document();
try ...{
// 定義輸出位置並把文檔對象裝入輸出對象中
PdfWriter.getInstance(doc, new FileOutputStream("/root/hello.pdf"));
// 開啟文檔對象
doc.open();
Table t = new Table(2,2);
t.setBorderColor(new Color(0, 0, 255));//設定邊框顏色為藍色
t.setPadding(5);
t.setSpacing(5);//設定儲存格邊界
t.setBorderWidth(1);//設定邊框寬度
Cell c1 = new Cell("header1");
c1.setHeader(true);
t.addCell(c1);
c1 = new Cell("Header2");
t.addCell(c1);
t.endHeaders();
t.addCell("1.1");
t.addCell("1.2");
doc.add(t);
// 關閉文檔對象,釋放資源
doc.close();
} catch (FileNotFoundException e) ...{
e.printStackTrace();
} catch (DocumentException e) ...{
e.printStackTrace();
}
五.插入圖片插入圖片和swing插入圖片差不多,大家可以參考一下:
Document doc = new Document();
Image jpeg;
try ...{
PdfWriter.getInstance(doc, new FileOutputStream("/root/hello.pdf"));
doc.open();
jpeg = Image.getInstance("/root/1.gif");
//圖片置中
jpeg.setAlignment(Image.ALIGN_CENTER);
doc.add(jpeg);
doc.close();
} catch (BadElementException e) ...{
e.printStackTrace();
} catch (MalformedURLException e) ...{
e.printStackTrace();
} catch (IOException e) ...{
e.printStackTrace();
} catch (DocumentException e) ...{
e.printStackTrace();
}
好了,到這裡我大致也介紹完了,歡迎大家拍磚,呵呵