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

	}
}

发布了19 篇原创文章 · 获赞 17 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_42548384/article/details/83007177