一、Itext項目簡介
iText 是著名的開放源碼的站點sourceforge一個項目, 是用於生成 PDF 文檔的一個java類庫.
官網地址:http://developers.itextpdf.com
二、iText核心類
• kernel 和 io: 包含低層次常用的基礎的函數
• layout: 包含高層次的函數
• forms: 有關AcorForms操作需要的函數庫
• pdfa: 有關PDF/A(電子文檔標準)的相關操作
• pdftest: test例子中所引用的庫
除了這些常用的JAR包意外,還有一些其他可能的包:
• barcodes: 當你想要創建bar code(條形碼)時使用
• hyph: 當你想要文字有連字符時使用
• font-asian: 當你想要用CJK字符時 (Chinese / Japanese / Korean)
• sign: 當你想要使用電子簽名時使用
所需依賴包
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- Itext PDF相關 -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>kernel</artifactId>
<version>7.0.3</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>io</artifactId>
<version>7.0.3</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>layout</artifactId>
<version>7.0.3</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>font-asian</artifactId>
<version>7.0.3</version>
</dependency>
</dependencies>
三、輸出寫着hello world 的PDF文檔
package com.iText;
import java.io.FileNotFoundException;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;
public class HelloPDF {
public static void main(String[] args) throws FileNotFoundException {
//1、創建PDFWrite
PdfWriter write = new PdfWriter("d:\\hello.pdf");
//2、創建PDFDocument對象
PdfDocument pdfDocument = new PdfDocument(write);
//3、創建Document對象
Document document = new Document(pdfDocument);
//向Document對象寫入內容
document.add(new Paragraph("hello world!"));
document.close();
}
}
四、PDF文檔相關屬性設置
4.1可以通過 Document 的構造器定義 Pdf 文檔的大小
Document document = new Document(pdf,PageSize.A4);
4.2設定文檔屬性
在文檔打開之前, 可以設定文檔的標題、主題、作者、關鍵字、創建者、生產者等屬性,調用的方法分別是:
PdfDocument pdf = new PdfDocument(writer);
通過獲取pdf文檔對象的PdfDocumentInfo 對象來設置文檔屬性。
@Test
public void setDocumentInfo() throws FileNotFoundException{
PdfWriter pdfWriter = new PdfWriter("d:\\pdf\\info.pdf");
PdfDocument pdfDocument = new PdfDocument(pdfWriter);
//通過PdfDocument對象獲取到PdfDocumentInfo
PdfDocumentInfo documentInfo = pdfDocument.getDocumentInfo();
//設置文檔作者
documentInfo.setAuthor("志想匯");
//設置文檔創建人
documentInfo.setCreator("志想匯");
//三個字股文檔關鍵字,多個關鍵字用,隔開
documentInfo.setKeywords("JAVA,學習,志想匯");
//設置文檔主題
documentInfo.setSubject("文檔主題");
//設置文檔標題
documentInfo.setTitle("文檔標題");
Document document = new Document(pdfDocument,PageSize.A4);
document.add(new Paragraph("document info"));
document.close();
}
五、向PDF文件添加文檔內容
所有向文檔添加的內容都是以對象爲單位的, 如Phrase、Paragraph、Table等. 比較常用的是段落(Paragraph)對象, 用於向文檔中添加一段文字
可以設定段落的字體大小、顏色等屬性. 還可以設定段落的首行縮進、對齊方式(左對齊、右對齊、居中對齊)
@Test
public void testPdfText() throws IOException{
PdfWriter writer = new PdfWriter("d:\\pdf\\texttest.pdf");
PdfDocument pdfDocument = new PdfDocument(writer);
Document document = new Document(pdfDocument);
//1、創建段落對象
Paragraph paragraph = new Paragraph("java0411");
//設置文字對齊方式,居中
paragraph.setTextAlignment(TextAlignment.CENTER);
//創建PDF字體
PdfFont font = PdfFontFactory.createFont(FontConstants.TIMES_BOLD);
//爲段落對象制定字體
paragraph.setFont(font);
//設置字體顏色
paragraph.setFontColor(Color.BLUE);
//設置字體大小
paragraph.setFontSize(30);
//把段落對象添加到Document對象
document.add(paragraph);
document.close();
System.out.println("ok");
}
六、解決PDF中文亂碼
因爲iText默認不支持中文,所以如果需要在pdf中使用中文的話,需要單獨處理。
需要 iText Font Asian.jar 的類庫文件.
通過下邊的代碼解決中文輸出問題:
@Test
public void testChinese() throws IOException{
PdfWriter writer = new PdfWriter("d:\\pdf\\cn.pdf");
PdfDocument pdfDocument = new PdfDocument(writer);
Document document = new Document(pdfDocument);
//創建支持中文的字體
PdfFontFactory.createFont("STSong-Light","UniGB-UCS2-H",false);
}
七、生成帶表格的PDF
iText中處理表格的類爲:com.itextpdf.layout.element.Table
類的構造函數有四個:
①Table(float[] pointColumnWidths)
②Table(float[] columnWidths, boolean largeTable)
③Table(UnitValue[] columnWidths)
④Table(UnitValue[] columnWidths, boolean largeTable)
參數pointColumnWidths 、columnWidths 、columnWidths分別爲表格的每列寬度佔比屬性. 創建表格時必須指定表格的每列寬度比。
生成單元格對象:
• Cell 類表示單元格.
• Cell headcell=new Cell();//表示創建一個普通的單元格
• Cell headcell=new Cell(1,4);//表示創建一個跨1行4列的單元格
• 可以在單元格添加Paragraph對象
• 通過對Paragraph對象指定字體、位置、顏色
• new Paragraph(“Job tile”).setTextAlignment(TextAlignment.CENTER).setFont(font).setBold()
• 指定了文字位置、字體、是否加粗
生成表格演示:
package com.iText;
import java.io.File;
import java.io.IOException;
import com.itextpdf.io.font.FontConstants;
import com.itextpdf.kernel.color.Color;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Cell;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.element.Table;
import com.itextpdf.layout.property.TextAlignment;
import com.itextpdf.layout.property.VerticalAlignment;
public class PdfTable {
public static final String TEST = "d:\\pdf\\pdftest.pdf";
public static void main(String[] args) throws IOException {
File file = new File(TEST);
file.getParentFile().mkdir();
new PdfTable().creatrPdf(TEST);
}
public void creatrPdf(String test) throws IOException {
// Initialize PDf writer
PdfWriter writer = new PdfWriter(test);
// Initialize PDF document
PdfDocument pdfDocument = new PdfDocument(writer);
// Initialize document
Document document = new Document(pdfDocument, PageSize.A4.rotate());
// 設定頁邊距
document.setMargins(20, 20, 20, 20);
PdfFont font = PdfFontFactory.createFont(FontConstants.HELVETICA);
// 創建表格對象
Table table = new Table(new float[] { 400, 200, 200, 400 });
table.setWidthPercent(100);
// 創建單元格對象,誇1行4列
Cell headcell = new Cell(1, 4);
// 設置單元格背景顏色
headcell.setBackgroundColor(Color.ORANGE);
// 向表格對象添加表頭單元格,裏面包含內容Job titile,設置居中、加粗
table.addHeaderCell(
headcell.add(new Paragraph("Jobtile").setTextAlignment(TextAlignment.CENTER).setFont(font).setBold()));
// 向表格對象添加單元格,創建新的單元格,添加內容爲one、two、three、four
table.addCell(new Cell().add(new Paragraph("one").setFont(font)));
table.addCell(new Cell().add(new Paragraph("two").setFont(font)));
table.addCell(new Cell().add(new Paragraph("three").setFont(font)));
table.addCell(new Cell().add(new Paragraph("four").setFont(font)));
// 循環向表格對象增加17個單元格,每個單元格內容爲1-17點序號數字
for (int i = 1; i < 17; i++) {
table.addCell(new Cell().add(new Paragraph(i + "").setFont(font)));
}
// 創建一個跨2行1列的單元格,背景色設置爲綠色
Cell bootcell = new Cell(2, 1);
// 設定垂直居中
bootcell.setVerticalAlignment(VerticalAlignment.MIDDLE);
bootcell.setBackgroundColor(Color.GREEN);
table.addCell(bootcell);
// 循環向表格對象添加6個單元格,背景設置爲粉紅色,內容爲數組1-6
for (int i = 1; i < 7; i++) {
table.addCell(new Cell().setBackgroundColor(Color.PINK).add(new Paragraph("" + i).setFont(font)));
}
// 把表格添加到文檔對象
document.add(table);
// Close document
document.close();
}
}
八、生成帶圖像的PDF
iText中處理表格的類爲com.itextpdf.layout.element.Image,目前iText支持的圖像格式有:GIF, Jpeg, PNG,BMP等格式,對於不同的圖像格式,iText用同樣的構造函數自動識別圖像格式。
Image fox = new Image(ImageDataFactory.create(“d:\pdftest\dog.bmp”));
圖像演示:
package com.iText;
import java.io.File;
import java.io.FileNotFoundException;
import java.net.MalformedURLException;
import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Image;
import com.itextpdf.layout.element.Paragraph;
public class PdfImage {
public static final String MAN = "d:\\pdf\\man.jpg";
public static final String WOMAN = "d:\\pdf\\woman.jpg";
public static final String TEST = "d:\\pdf\\man_woman.pdf";
public static void main(String[] args) throws FileNotFoundException, MalformedURLException {
File file = new File(TEST);
file.getParentFile().mkdirs();
new PdfImage().creatPdf(TEST);
}
public void creatPdf(String test) throws FileNotFoundException, MalformedURLException {
// Initialize PDF writer
PdfWriter writer = new PdfWriter(TEST);
// Initialize PDF document
PdfDocument pdfdocument = new PdfDocument(writer);
// Initialize document
Document document = new Document(pdfdocument);
// Compose Paragraph
Image manimage = new Image(ImageDataFactory.create("d:\\pdf\\fox.png"));
Image womanimage = new Image(ImageDataFactory.create("d:\\pdf\\dog.png"));
Paragraph paragraph = new Paragraph("The quick brown").add(manimage).add("jumps over the lazy").add(womanimage);
// Add Paragraph to document
document.add(paragraph);
// Close document
document.close();
}
}