`
jinvasshole
  • 浏览: 770195 次
文章分类
社区版块
存档分类
最新评论

Java中利用iText生成pfd文档

 
阅读更多

  在java中使用iText 生成pdf
下载iText.jar架包网站http://itextpdf.com/最新为5.0;api帮助文档http://api.itextpdf.com/

从最基本的hello world!开始源码如下:
package com.jzbr
import java.io.FileOutputStream;
import java.io.IOException;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter;

public class HelloWorld {
public static final String RESULT = "d://hello.pdf";

public static void main(String[] args)
throws DocumentException, IOException {
// step 1
Document document = new Document();
// step 2
PdfWriter.getInstance(document, new FileOutputStream(RESULT));
// step 3
document.open();
// step 4
document.add(new Paragraph("Hello World!"));
// step 5
document.close();
}
}

从上源码中可以看出使用iText生成PDF文档需要5个步骤:

step1:建立Document对象的实例
step2:建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中。
step3:打开文档
step4: 向文档中添加信息
step5: 关闭文档

下面对这几个步骤做一下详细说明

step1:建立com.itextpdf.text.Document的实例对象
构造方法有三种:
public Document();
public Document(Rectangle pageSize);
public Document(Rectangle pageSize, int marginLeft, int marginRight, int marginTop, int marginBottom);

构建函数的参数pageSize是文档页面的大小,对于第一个构建函数,页面的大小为A4,同Document(PageSize.A4)的效果一样;对于第三个构建函数,参数marginLeft,marginRight,marginTop,marginBottom分别为左、右、上、下的页边距.

以下代码定义一个自己的pdf页面
Rectangle pageSize = new Rectangle(144, 720);
pageSize.BackgroundColor = new Color(0xFF, 0xFF, 0xDE);
Document document = new Document(pageSize);

在你写入任何实际数据之前,你可能希望通过以下几种方法写入一些关于本文档的摘要说明可以设定文档的标题、主题、作者、关键字、装订方式、创建者、生产者、创建日期等属性,调用的方法分别是:

public boolean addTitle(String title)
public boolean addSubject(String subject)
public boolean addKeywords(String keywords)
public boolean addAuthor(String author)
public boolean addCreator(String creator)
public boolean addProducer()
public boolean addCreationDate()
public boolean addHeader(String name, String content)

其中方法addHeader对于PDF文档无效,addHeader仅对html文档有效,用于添加文档的头信息.

如果你需要一个水印或者页眉页角对象出现在文档第一页的开始处,你需要在打开文档前添加这些,设置该文档其他页水印、页眉、页角、页数和尺寸.调用下列方法:
public boolean setPageSize(Rectangle pageSize)
public boolean add(Watermark watermark)
public void removeWatermark()
public void setHeader(HeaderFooter header)
public void resetHeader()
public void setFooter(HeaderFooter footer)
public void resetFooter()
public void resetPageCount()
public void setPageCount(int pageN)

如果要设定第一页的页面属性,这些方法必须在文档打开之前调用.


step2:创建com.itextpdf.text.pdf.PdfWriter实例
构造方法如下:
protected PdfWriter()
protected PdfWriter(PdfDocument document, OutputStream os)
只能通过下面的方法创建一个实例:
static PdfWriter getInstance(Document document, OutputStream os)

PdfWriter.getInstance(document, new FileOutputStream("xx.pdf"));

还可以通过下面的方法创建一个实例:
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("xx.pdf"));

step3:打开文档
document.open();
注意添加摘要和显示样式设置都必须在文档打开之前完成设置

step4:向pdf文档中写内容

解决中文显示问题:需要向pdf中写入中文时要先设定中文字体
二种方式:
第一种:客户端需要安装Asian font pack from Adobe
第二种使用window自带的语句包解决
SIMSUN.TTC:宋体和新宋体
SIMKAI.TTF:楷体
SIMHEI.TTF:黑体
SIMFANG.TTF:仿宋体

示例:
BaseFont bfChina = BaseFont.createFont("c:\\windows\\fonts\\simsun.ttc,1",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
Font fChina = new Font(bfChina, 18, Font.BOLD);
第一个参数为基本字体类型,第二个参数为字体大小,第三个参数为字体样式

Font常用方法
setColor(BaseColor color)
Sets the color.
void setColor(int red, int green, int blue)
Sets the color.
void setFamily(String family)
Sets the family using a String ("Courier", "Helvetica", "Times New Roman", "Symbol" or "ZapfDingbats").
void setSize(float size)
Sets the size.
void setStyle(int style)
Sets the style.
void setStyle(String style)
Sets the style using a String containing one of more of the following values: normal, bold, italic, underline, strike.

在给pdf添加内容时对其结构做一个了解:
一个pdf按从大到小可分为:文档,章节,小节,段落,表格,列表
com.itextpdf.text.Document;//文档
com.itextpdf.text.Chapter;//章节
com.itextpdf.text.Section;//小节
com.itextpdf.text.Paragraph;//段落
com.itextpdf.text.Phrase;//短语
com.itextpdf.text.Chunk;//文本块

 
iText中用文本块(Chunk)、短语(Phrase)和段落(paragraph)处理文本。
文本块(Chunk)是处理文本的最小单位,有一串带格式(包括字体、颜色、大小)的字符串组成。如以下代码就是产生一个字体为HELVETICA、大小为10、带下划线的字符串:
Chunk chunk1 = new Chunk("This text is underlined", FontFactory.getFont(FontFactory.HELVETICA, 12, Font.UNDERLINE));
如果是显示中文:
Chunk chunk = new Chunk("这是一个测试语句",fChina);
//fChina为前面定义的中文字体

短语(Phrase)由一个或多个文本块(Chunk)组成,短语(Phrase)也可以设定字体,但对于其中以设定过字体的文本块(Chunk)无效。通过短语(Phrase)成员函数add可以将一个文本块(Chunk)加到短语(Phrase)中,如:phrase.add(chunk);


段落(paragraph)由一个或多个文本块(Chunk)或短语(Phrase)组成,相当于WORD文档中的段落概念,同样可以设定段落的字体大小、颜色等属性。另外也可以设定段落的首行缩进、对齐方式(左对齐、右对齐、居中对齐)。通过函数setAlignment可以设定段落的对齐方式,setAlignment的参数1为居中对齐、2为右对齐、3为左对齐,默认为左对齐。完整示例:

//创建文档
Document doc = new Document(PageSize.A4);
//关联文档输出流
PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream("d:\\t.pdf"));
//打开文档
doc.open();

// 创建中文字体

/*
* 常用Font类型:Font.NORMAL正常Font.BOLD加粗Font.ITALIC斜体 BaseFont
* bfChina=BaseFont.createFont("STSong-Light","UniGB-UCS2-H",
* BaseFont.NOT_EMBEDDED); 需要语言架包
*/

// 调用系统中存在的字体样式
BaseFont bfChina = BaseFont.createFont("c:\\windows\\fonts\\simsun.ttc,1", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
Font fChina = new Font(bfChina, 18, Font.BOLD);

// 设置一个段落时设置其的字体和颜色
Paragraph p = new Paragraph("这是第一章", fChina);
p.setAlignment(1);// 设置居中显示

// 创建一个章节对象第一个参数为标题,第二个为章节编号
Chapter chapter = new Chapter(p, 1);

// 设置标题级别0表示在pdf中不显示章节编号1,
chapter.setNumberDepth(0);

// 设置小节的字体大小,其它颜色都可以设置
fChina.setSize(16);
// 设置小节标题
Paragraph title = new Paragraph("这是一个测试", fChina);

/*
* 创建小节对象Section
* 构造方法:
protected Section()
Constructs a new Section.
protected Section(Paragraph title, int numberDepth)
Constructs a new Section.
通过Chapter.addSection(Paragraph p)可以得到一个Sectio实例
*/
//通过chapter.addSection(小节标题)得到一个小节实例
Section section = chapter.addSection(title);

Paragraph p2 = new Paragraph("这是第二个小节", fChina);
//添加第二个小节标题在pdf中自动编号
Section section1 = chapter.addSection(p2);
//设置小节中的内容字体样式
fChina.setSize(12);
fChina.setStyle(Font.ITALIC);
Paragraph pText = new Paragraph("这是1.1小节的内容。。。。。。。。", fChina);
//将内容添加至小节下
section.add(pText);
//将章节添加至文档
doc.add(chapter);
//关闭文档
doc.close();


在pdf中添加表格和图片
iText中表格和图片处理类为:
com.itextpdf.text.pdf.PdfPTable;//表格
com.itextpdf.text.pdf.PdfPCell;//单元格
com.itextpdf.text.pdf.Image;//图片
表格构造方法:
protected PdfPTable()
PdfPTable(float[] relativeWidths)
Constructs a PdfPTable with the relative column widths.
PdfPTable(int numColumns)
Constructs a PdfPTable with numColumns columns.
PdfPTable(PdfPTable table)
Constructs a copy of a PdfPTable.

示例代码如下:

Document doc = new Document(PageSize.A4);

PdfWriter.getInstance(doc, new FileOutputStream("d:\\tableAndImage.pdf"));

doc.open();

// 设置中文字体调用系统中存在的字体样式
BaseFont bfChina = BaseFont.createFont("c:\\windows\\fonts\\simsun.ttc,1", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
Font font = new Font(bfChina, 20, Font.BOLD);
// 创建章节标题
Paragraph p = new Paragraph("表格的示例", font);
Chapter chapter = new Chapter(p, 1);
font.setSize(12);
// 创建小节标题
Paragraph ps = new Paragraph("示例表格", font);
Section s = chapter.addSection(ps);
/*
* 创建表格 pdf中表格是由Cell单元格的组成根据单元格添加来构建,从第一第*一列开始,然后是第二列
* 当一行满后,下一单元格自动添加到下一行的第一列中,所有的显示样式设置*都由Cell控制如 单元格边框线,显示位置,填充,间距等等
*/
PdfPTable table = new PdfPTable(4);// 创建一个有四列的表格
// 创建第一个单元格内容
PdfPCell cell = new PdfPCell(new Paragraph("这是学员信息表", font));
cell.setColspan(4);// 第一个单元格合并四列
cell.setHorizontalAlignment(Element.ALIGN_CENTER);// 设置水平显示居中
table.addCell(cell);// 将此列加入到表格中
// 第一行已经放满自动换到下一行
table.addCell(new Paragraph("学号", font));
table.addCell(new Paragraph("姓名", font));
table.addCell(new Paragraph("班级", font));
table.addCell(new Paragraph("照片", font));
// 第二行放满直接进入第三行
table.addCell("NO100");// 英文直接添加
cell = new PdfPCell(new Paragraph("shark"));
cell.setHorizontalAlignment(Element.ALIGN_CENTER);// 水平居中
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);// 垂直居中
table.addCell(cell);
table.addCell("s1t00");
// 通过com.itextpdf.text.Image创建一张图片
Image image = Image.getInstance("D:\\My Documents\\MyPictures\\dao.jpg");
table.addCell(image);// 将图片放入单元格

// 将table加到小节下
s.add(table);
// 将章节加入到文档
doc.add(chapter);
// 关闭文档
doc.close();

当表格的宽度是确定,当图片超出单元格的宽度时,将自动缩小.当表格合并行,列较为复杂时可以嵌套表格方式(单元格中显示表格)完成布局
图片压缩:
image.scalePercent(size);可将图片压缩至size大小
image.scaleAbsolute(float f1,float f2);width,height


在pdf中添加列表:
在iText中生成列表的类为:
com.itextpdf.text.List;//列表
com.itextpdf.text.ListItem;//列表项

示例代码:
/*
* 通过com.itextpdf.text.List创建列表 第一个参数表示有序或无序true为有
* 序第二个参数表示字母还是数字编号false为数字 第三个参数表示内容与编号*之间的距离List overview = new List(false, 10); 表示无序
*/
List list = new List(true, false, 20);

// 通过com.itextpdf.text.ListItem创建列表项
for (int i = 0; i < 5; i++) {
ListItem item = new ListItem("第" + i + "项", font);
list.add(item);// 将列表项添加到列表
}
// 将列表添加至小节中
section.add(list);

更换无序的图标(在子项加载前设置):
list.setListSymbol("*");


step4:加内容添加至文档
注意小节添加和其它稍有不同
通过chapter.addSection(小节标题)得到一个小节实例
Section section = chapter.addSection(title);

step5: 关闭文档
doc.close();


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics