itext的介绍

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

猜你喜欢

转载自blog.csdn.net/qq_40876052/article/details/81235232