iText简介与前期准备:
iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。
相关网站:
|
链接 |
说明 |
iText的官方主页 |
http://www.lowagie.com/iText/ |
|
iText的jar包 |
http://www.lowagie.com/iText/download.html |
官方下载;本系统使用的是最新的jar包:itext-2.0.5.jar |
iTextAsian.jar下载 |
http://itextpdf.sourceforge.net/ |
iText的亚洲字体支持包;因为在本系统中需要使用日文字体 |
iText的使用文档 |
http://itext.ugent.be/library/api/ |
在线文档(on-line) |
iText的使用文档 |
http://www.lowagie.com/iText/download.html text-docs-2.0.5.tar.gz |
下载(download) |
-bcprov-jdk15-137.jar |
http://www.bouncycastle.org/java.html |
pdf加密标准用到另外一个包-bcprov-jdk15-137.jar(官方网站) |
-bcprov-jdk15-137.jar |
http://www.bouncycastle.org/latest_releases.html |
因为这里所用的jar包跟系统所使用的java版本有关系,本系统使用的是jdk1.5.0_08,所以下载bcprov-jdk15-137.jar即可。注意:这里下载下来的包的后缀名为.zip,手动改成.jar文件即可。 |
PDF加密(在线文档(on-line)) |
http://www.bouncycastle.org/documentation.html |
|
PDF加密(下载(download)) |
http://www.bouncycastle.org/documentation.html |
|
|
|
|
二、使用:
用iText生成PDF文档需要5个步骤:
1、创建com.lowagie.text.Document类的对象:
Document document = new Document(PageSize.A4, 110, 110, 120, 140);
以上创建了一个标准A4纸的文档。五个参数分别代表:构建函数的第一个参数pageSize是文档页面的大小,后面四个参数分别代表左、右、上、下的页边距。以上页边距的数据是在加入图片边框之后逐一试验得出。
2、建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘或者一个输出流中,在本系统是写入一个输出流中。
<A>构造了一个输出流;
ByteArrayOutputStream bao = new ByteArrayOutputStream();
PdfWriter pdfWriter = PdfWriter.getInstance(document, bao);
一旦文档(document)对象建立好之后,需要建立一个或多个书写器(Writer)对象与之关联。通过书写器(Writer)对象可以将具体文档存盘成需要的格式,因为本系统要求生成pdf文件,所以使用了com.lowagie.text.PDF.PDFWriter书写器将文档存成PDF文件。
<B>根据要求,需要给生成的pdf加入一定的权限,
int intPermissions = PdfWriter.AllowPrinting | PdfWriter.AllowScreenReaders;
int intEncryptionType = PdfEncryption.STANDARD_ENCRYPTION_40;
pdfWriter.setEncryption(null, "test".getBytes(), intPermissions, intEncryptionType);
这里使用了书写器的setEncryption方法来设置权限,这里方法原型为: setEncryption(byte[] userPassword, byte[] ownerPassword, int permissions, int encryptionType);
userPassword是指使用者的密码,可以为null or 空,在设置了密码的情况下,在打开pdf时需要输入密码才能打开;
ownerPassword是指制造者或者拥有者的密码,可以为null or 空,在设置了密码的情况下,使用没有设置的权限时需要输入密码才能进行操作;
permissions从说明文档可以知道这里一共有八种权限设置。一旦设置了权限,用户被允许使用该权限操作,没有被设置的权限操作需要输入密码更改权限后被使用该操作。根据要求,本系统在这里设置了允许打印和阅读两种权限,其余没有被设置的权限在没有密码输入时是不被允许的。
encryptionType是指加密标准或加密类型,因为这里用到了加密标准,所以必须引入bcprov-jdk15-137.jar包,否则会抛出一个找不到class的异常。
<C>加入边框图片和字体:
根据pdf模板,需要在pdf中加入一个边框。根据pdf模板剪切了一个名为certificate.JPG的边框图片放在配置apache路径下面的/lily/pdf下面。
要求使用日文字体为:MS Gothic,这个字体在日文XP操作系统下:/WINDOWS/Fonts/下对应的是MSGOTHIC.TTC字体,而MSGOTHIC.TTC字体本身是一个字体集,包含有MS Gothic,MS PGothic,和MS UI Gothic三种字体。首先在操作系统下找到MSGOTHIC.TTC字体,将它放在配置apache路径下面的/lily/pdf下面。
//取apache路径,因为服务器端即相当于本地路径,所以只需要取apache的本地路径即可
String tempPath[] = CommonConfig.getPdfPath().split("/");
String path = CommonConfig.getApachePath() + "//" + tempPath[1] + "//" + tempPath[2];
//使用com.lowagie.text.Image类的getInstance(String filename) 方法构造一个Image对象
<D>设置图片
Image jpeg = Image.getInstance(path + "//certificate.JPG");
jpeg.setAlignment(Image.UNDERLYING);
jpeg.setAbsolutePosition(0, 0);
setAlignment(int alignment)方法是设置图片的位置,参数Image.UNDERLYING是作为文字的背景显示;
setAbsolutePosition(float absoluteX, float absoluteY)方法是设置图片的绝对位置。
<E>设置字体
BaseFont bfJapanese = BaseFont.createFont(path + "//MSGOTHIC.TTC,1", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
使用指定的字体构造了一个基础字体对象,原型来源于
createFont(String name, String encoding, boolean embedded);
第一个参数是指定字体的路径,这里因为MSGOTHIC.TTC字体本身是一个字体集,包含有MS Gothic,MS PGothic,和MS UI Gothic三种字体,而本系统需要使用MS Gothic字体,所以需要指定使用MSGOTHIC.TTC里的第一个字体。(注:所有以.ttc为后缀的字体都是字体集,以.ttf结尾的字体是单一的字体,可以直接使用。)
第二个参数是文字显示排版。有两个参数值。BaseFont.IDENTITY_H让文字横排显示。
根据需要构造字体的时候设置字体大小。
//构造字体
Font FontJapanese1 = new Font(bfJapanese,38, Font.BOLD);
Font FontJapanese2 = new Font(bfJapanese,18, Font.NORMAL);
按照要求,定义了两种字体,分别用于六个不同的位置。第三个参数是设置字体的属性。Font.BOLD设置字体加粗;Font.NORMAL设置字体正常显示(即没有任何附加状态,不加粗显示)。
<F>定义pdf文档内容
本系统中所有文档内容均使用com.lowagie.text.Paragraph类构造的段落对象来添加到pdf文档中。
String title1 = licenseForm.getLagerSegLicenseTitle();
Paragraph t1 = new Paragraph(title1, FontJapanese1);
t1.setAlignment(1);
以标题举例:
以Paragraph(String string, Font font)来构造一个段落对象。第一个String是填入段落的内容,第二个是字体。
setAlignment(int alignment) 是设置文字对齐方式的。参数值“1”表示居中对齐;参数值“2”表示靠右对齐,默认是靠左对齐。
setSpacingBefore(float spacing)设置段前行间距。
setSpacingAfter(float spacing) 设置段后行间距。
setLeading(float fixedLeading) 设置首行缩进。
setIndentationLeft(float indentation)设置左缩进。
3、打开文档:
document.open();
4、向文档中添加内容:
将需要加入文档的东西依次加进去就可以了。
document.add(jpeg);
document.add(t1);
document.add(n1);
document.add(par1);
5、关闭文档:
Document.close();
以上就已经完成了一个pdf文档的做成。剩下的工作只需要将这个写好流输出到客户端就可以了,这样不会在服务器端留下任何垃圾文件。
response.setContentType("application/pdf");
response.setContentLength(bao.size());
ServletOutputStream out = response.getOutputStream();
bao.writeTo(out);
out.flush();
Web 浏览器使用 MIME 类型来识别非 HTML 文档,并决定如何显示该文档内的数据。将插件 (plug-in) 与 MIME 类型结合使用,则当 Web 浏览器下载 MIME 类型指示的文档时,就能够启动相应插件处理此文档。某些 MIME 类型还可以与外部程序结合使用,浏览器下载文档后会启动相应的外部程序。
PDF 文件的 MIME 类型是 "application/pdf"。要用servlet 来打开一个 PDF 文档,需要将 response 对象中 header 的 content 类型设置成 "application/pdf":
// PDF 文件的 MIME 类型
res.setContentType( "application/pdf" );
//添加相应包长度
response.setContentLength(bao.size());
//构造一个servlet输出流
ServletOutputStream out = response.getOutputStream();
//将此字节数组输出流bao的全部内容写入到指定的输出流out参数中
bao.writeTo(out);
//将out输出
out.flush();