Java實戰—使用iText開源組件生成PDF文檔

一、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();

	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章