IText实现对PDF⽂档属性的基本设置
⼀、Itext简介
iText是著名的开放源码的站点sourceforge⼀个项⽬,是⽤于⽣成PDF⽂档的⼀个java类库。通过iText不仅可以⽣成PDF或rtf的⽂档,⽽且可以将XML、Html⽂件转化为PDF⽂件。
iText的安装⾮常⽅便,在⽹站上下载iText.jar⽂件后,只需要在系统的CLASSPATH中加⼊iText.jar的路径,在程序中就可以使⽤iText类库了。
⼆、⽣成PDF步骤
1、创建⽂档对象实例t什么意思
Document document = new Document();
2、建⽴书写器(Writer)与⽂档对象(document)关联,通过书写器将⽂档写⼊磁盘
PdfWriter writer = Instance(document, new FileOutputStream(DEST));
DEST:⽣成PDF⽂件
3、打开⽂档
document.open();
4、向⽂档中添加内容
document.add(new Paragraph("PDF demo"));
5、关闭⽂档
document.clo();
三、具体分析
1、对象实例
public document();
public document(Rectangle pageSize);
public document(Rectangle pageSize, int marginLeft, int marginRight, int marginTop, int marginBottom);
pageSize是指⽂档页⾯⼤⼩,public document();页⾯⼤⼩为A4,效果等同于Document(PageSize.A4);
marginLeft、marginRight、marginTop、marginBottom分别为左、右、上、下的页边距。
通过参数pageSize可以设定页⾯⼤⼩、⾯背景⾊、以及页⾯横向/纵向等属性。iText定义了A0-A10、AL、LETTER、HALFLETTER、_11x17、LEDGER、NOTE、B0-B5、ARCH_A-ARCH_E、FLSA和FLSE等纸张类型,也可以通过Rectangle pageSize = new Rectangle(144, 720);⾃定义纸张。通过Rectangle⽅法rotate()可以将页⾯设置成横向。
2、书写器对象
⼀旦⽂档(document)对象建⽴好之后,需要建⽴⼀个或多个书写器(Writer)对象与之关联。通过书写器(Writer)对象可以将具体⽂档存盘成需要的格式。
PDFWriter可以将⽂档存成PDF⽂件;HtmlWriter可以将⽂档存成html⽂件
3、⽂档属性
在⽂档打开之前,可以设定⽂档的标题、主题、作者、关键字、装订⽅式、创建者、⽣产者、创建⽇期等属性,调⽤的⽅法分别是:
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⽂档有效,⽤于添加⽂档的头信息。
当新的页⾯产⽣之前,可以设定页⾯的⼤⼩、书签、脚注(HeaderFooter)等信息,调⽤的⽅法是:
public boolean tPageSize(Rectangle pageSize)
public boolean add(Watermark watermark)
public void removeWatermark()
public void tHeader(HeaderFooter header)
public void retHeader()
public void tFooter(HeaderFooter footer)
public void retFooter()
public void retPageCount()
public void tPageCount(int pageN)
如果要设定第⼀⾯的页⾯属性,这些⽅法必须在⽂档打开前调⽤。
对于PDF⽂档,iText还提供了⽂档的显⽰属性,通过调⽤书写器的 tViewerPreferences⽅法可以控制⽂档打开时Acrobat Reader的显⽰属性,如是否单页显⽰、是否全屏显⽰、是否隐藏状态条等属性。
另外,iText也提供了对PDF⽂件的安全保护,通过书写器(Writer)的tEncryption⽅法,可以设定⽂档的⽤户⼝令、只读、可打印等属性。
4、添加⽂档内容
所有向⽂档添加的内容都是以对象为单位的,如Phra、Paragraph、Table、Graphic对象等。⽐较常⽤的是段落(Paragraph)对象,⽤于向⽂档中添加⼀段⽂字。
IText中⽤⽂本块(Chunk)、短语(Phra)和段落(paragraph)处理⽂本。⽂本块(Chunk)是处理⽂本的最⼩单位,有⼀串带格式(包括字体、颜⾊、⼤⼩)的字符串组成。如以下代码就是产⽣⼀个字体为HELVETICA、⼤⼩为10、带下划线的字符串:
Chunk chunk1 = new Chunk("This text is underlined",
短语(Phra)由⼀个或多个⽂本块(Chunk)组成,短语(Phra)也可以设定字体,但对于其中以设定过字体的⽂本块(Chunk)⽆效。通过短语(Phra)成员函数add可以将⼀个⽂本块(Chunk)加到短语(Phra)中,如:phra6.add(chunk);
段落(paragraph)由⼀个或多个⽂本块(Chunk)或短语(Phra)组成,相当于WORD⽂档中的段落概念,同样可以设定段落的字体⼤⼩、颜⾊等属性。另外也可以设定段落的⾸⾏缩进、对齐⽅式(左对齐、右对齐、居中对齐)。通过函数tAlignment可以设定段落的对齐⽅式,tAlignment的参数1为居中对齐、2为右对齐、3为左对齐,默认为左对齐。
Itext中处理表格在有PDFTable,Table。对于简单在表格处理可以⽤Table,但如果要处理复杂的表格就需要PDFTable进⾏处理。
创建表格时,必须要指定列,⾏则不是必须的。
建⽴表格之后,可以设定表格的属性,如:边框宽度、边框颜⾊、衬距(padding space 即单元格之间的间距)⼤⼩等属性。
IText中处理图像的类为Image,⽬前iText⽀持的图像格式有:GIF, Jpeg, PNG, wmf等格式,对于不同的图像格式,iText⽤同样的构造函数⾃动识别图像格式。通过下⾯的代码分别获得gif、jpg、png图像的实例。
Image gif = Instance("vonnegut.gif");
Image jpeg = Instance("myKids.jpg");
经济制度
Image png = Instance("hitchcock.png");
图像的位置
乡情作文500字图像的位置主要是指图像在⽂档中的对齐⽅式、图像和⽂本的位置关系。IText中通过函数public void tAlignment(int alignment)进⾏处理,参数alignment为Image.RIGHT、Image.MIDDLE、Image.LEFT分别指右对齐、居中、左对齐;当参数alignment为
Image.TEXTWRAP、Image.UNDERLYING分别指⽂字绕图形显⽰、图形作为⽂字的背景显⽰。这两种参数可以结合以达到预期的效果,如tAlignment(Image.RIGHT|Image.TEXTWRAP)显⽰的效果为图像右对齐,⽂字围绕图像显⽰。
图像的尺⼨和旋转
甜叶菊如果图像在⽂档中不按原尺⼨显⽰,可以通过下⾯的函数进⾏设定:
独自行走public void scaleAbsolute(int newWidth, int newHeight)
public void scalePercent(int percent)
public void scalePercent(int percentX, int percentY)
函数public void scaleAbsolute(int newWidth, int newHeight)直接设定显⽰尺⼨;
函数public voidscalePercent(int percent)设定显⽰⽐例,如scalePercent(50)表⽰显⽰的⼤⼩为原尺⼨的50%;
⽽函数scalePercent(int percentX, int percentY)则图像⾼宽的显⽰⽐例。
如果图像需要旋转⼀定⾓度之后在⽂档中显⽰,可以通过函数public void tRotation(double r)设定,参数r为弧度,如果旋转⾓度为30度,则参数r= Math.PI/6。
四、中⽂处理
默认的iText字体设置不⽀持中⽂字体,需要下载远东字体包iTextAsian.jar,否则不能往PDF⽂档中输出中⽂字体。通过下⾯的代码就可以在⽂档中使⽤中⽂了:
BaFont bfChine = ateFont("STSong-Light", "UniGB-UCS2-H", BaFont.NOT_EMBEDDED);
或者
BaFont bfChine = ateFont("C:/Windows/f",BaFont.IDENTITY_H,
BaFont.NOT_EMBEDDED);、
memwatch注意:此处⼤⼩写敏感!例如宋体的英⽂名称是SimSun(注意不是simsun!,⾸字母都是⼤写的)
错误写法:font-family:宋体 或者 font-family:simsun
正确写法:font-family:SimSun 或者 font-family:SimHei
确保上述所有字体均通过addFont加⼊,字体名称错误或者字体不存在会抛出异常,很⽅便,但是没导⼊的字体不会有任何提⽰。
五、例⼦
1、IText添加⽔印,并且增加权限
1 @Test
2 public void addWaterMark() throws Exception{
3 String srcFile="D:\\work\\pdf\\win10.pdf";//要添加⽔印的⽂件
4 String text="系统集成公司";//要添加⽔印的内容
5 int textWidth=200;
6 int textHeight=440;
7 PdfReader reader = new PdfReader(srcFile);// 待加⽔印的⽂件
8 PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(new File("D:\\work\\pdf\\addWaterMark.pdf")));// 加完⽔印的⽂件
9 // byte[] urPassword = "123".getBytes();
10 byte[] ownerPassword = "12345".getBytes();
11 // int permissions = PdfWriter.ALLOW_COPY|PdfWriter.ALLOW_MODIFY_CONTENTS|PdfWriter.ALLOW_PRINTING;
12 // stamper.tEncryption(null, ownerPassword, permissions,fal);
13 stamper.tEncryption(null, ownerPassword, PdfWriter.ALLOW_ASSEMBLY, fal);
14 stamper.tEncryption(null, ownerPassword, PdfWriter.ALLOW_COPY, fal);
15 stamper.tEncryption(null, ownerPassword, PdfWriter.ALLOW_DEGRADED_PRINTING, fal);
16 stamper.tEncryption(null, ownerPassword, PdfWriter.ALLOW_FILL_IN, fal);
17 stamper.tEncryption(null, ownerPassword, PdfWriter.ALLOW_MODIFY_ANNOTATIONS, fal);
18 stamper.tEncryption(null, ownerPassword, PdfWriter.ALLOW_MODIFY_CONTENTS, fal);
19 stamper.tEncryption(null, ownerPassword, PdfWriter.ALLOW_PRINTING, fal);江东是现在的哪里
20 stamper.tEncryption(null, ownerPassword, PdfWriter.ALLOW_SCREENREADERS, fal);
21 stamper.tEncryption(null, ownerPassword, PdfWriter.DO_NOT_ENCRYPT_METADATA, fal);
22 stamper. tViewerPreferences(PdfWriter.HideToolbar|PdfWriter.HideMenubar);
23 // stamper.tViewerPreferences(PdfWriter.HideWindowUI);
24 int total = NumberOfPages() + 1;
25 PdfContentByte content;
26 BaFont font = ateFont("font/SIMKAI.TTF", BaFont.IDENTITY_H, BaFont.EMBEDDED);
27 for (int i = 1; i < total; i++)// 循环对每页插⼊⽔印
28 {
29 content = UnderContent(i);// ⽔印的起始
30 content.beginText();// 开始
31 content.tColorFill(BaColor.GREEN);// 设置颜⾊默认为蓝⾊
32 content.tFontAndSize(font, 38);// 设置字体及字号
33 content.tTextMatrix(textWidth, textHeight);// 设置起始位置
34 content.showTextAligned(Element.ALIGN_LEFT, text, textWidth, textHeight, 45);// 开始写⼊⽔印
35 dText();
36 }
37 stamper.clo();
38 }
2、IText添加书签
1 Document document = new Document(PageSize.A4);
2
3 BaFont bfCN =
4 ateFont("C:/Windows/f",BaFont.IDENTITY_H, BaFont.NOT_EMBEDDED);
5 // 章的字体
6 Font chFont = new Font(bfCN, 12, Font.NORMAL, BaColor.BLUE);
7 // 节的字体
8 Font cFont = new Font(bfCN, 12, Font.NORMAL, new BaColor(0, 204,
9 255));
10 // 正⽂的字体
11 Font textFont = new Font(bfCN, 12, Font.NORMAL, BaColor.BLACK);
12
13 Instance(document, new FileOutputStream(DEST));
14 document.open();
15
16 int chNum = 1;
17 Chapter chapter = new Chapter(new Paragraph("Michael介绍", chFont),
18 chNum++);
19
20 Section ction = chapter.addSection(new Paragraph("基本信息", cFont));
21 ction.tIndentation(10);
22 ction.tIndentationLeft(10);
22 ction.tIndentationLeft(10);
23 ction.tBookmarkOpen(true);
24 ction.tNumberStyle(Section.NUMBERSTYLE_DOTTED_WITHOUT_FINAL_DOT);
25 ction.add(new Paragraph("苦逼的码农⼀枚。。。", textFont));
26
27 Section ction2 = chapter.addSection(new Paragraph("SNS", cFont));
28 ction2.tIndentation(10);
29 ction2.tIndentationLeft(10);
30 ction2.tBookmarkOpen(fal);
31 ction2.tNumberStyle(Section.NUMBERSTYLE_DOTTED_WITHOUT_FINAL_DOT);
32 ction2.add(new Paragraph("SNS地址分类:", textFont));
33
34 ction = ction2.addSection(new Paragraph(new Chunk("我的博客", cFont)
35 .tUnderline(0.2f, -2f).tAnchor("/xiaoSY-learning")));
36 ction.tBookmarkOpen(fal);
37 ction.tIndentation(10);
38 ction.tIndentationLeft(10);
39 ction.tNumberStyle(Section.NUMBERSTYLE_DOTTED_WITHOUT_FINAL_DOT);
40 ction.add(new Paragraph(new Chunk("我的blog地址:/xiaoSY-learning/",
41 textFont).tUnderline(0.2f, -2f).tAnchor(
42 "/xiaoSY-learning/")));
43 ction.add(new Paragraph("分享⾃⼰的技术⼼得。", textFont));
44
45 ction = ction2.addSection(new Paragraph(new Chunk("我的weibo",
46 cFont).tUnderline(0.2f, -2f).tAnchor(
47 "/u/2772113512")));
48 ction.tIndentation(10);
49 ction.tIndentationLeft(10);
50 ction.tBookmarkOpen(fal);
51 ction.tNumberStyle(Section.NUMBERSTYLE_DOTTED_WITHOUT_FINAL_DOT);
52 ction.add(new Paragraph(new Chunk("我的weibo:/u/2772113512",
53 textFont).tUnderline(0.2f, -2f).tAnchor(
54 "/u/2772113512")));
55 ction.add(new Paragraph("发表下⼼情,分享下技术,转转乱七⼋糟的新闻。", textFont));
56
57 ction = ction2.addSection(new Paragraph(new Chunk("twitter",
58 cFont)));
栀子花的英语59 ction.tIndentation(10);
60 ction.tIndentationLeft(10);
61 ction.tBookmarkOpen(fal);
62 ction.tNumberStyle(Section.NUMBERSTYLE_DOTTED_WITHOUT_FINAL_DOT);
63 ction.add(new Paragraph(new Chunk("twitter:@suncto", textFont)
64 .tUnderline(0.2f, -2f).tAnchor("twitter:twitter:twitter:")));
65 ction.add(new Paragraph("⼀个常常被墙的地⽅", textFont));
66
67 LineSeparator line = new LineSeparator(1, 100, new BaColor(204, 204,
68 204), Element.ALIGN_CENTER, -2);
69
70 Paragraph p_line = new Paragraph("分割线");
71 p_line.add(line);
72 chapter.add(p_line);
73 document.add(chapter);
74
75 chapter = new Chapter(new Paragraph("Miu的介绍", chFont), chNum++);
76 ction = chapter.addSection(new Paragraph("基本信息", cFont));
77 ction.tIndentation(10);
78 ction.tIndentationLeft(10);
79 ction.tBookmarkOpen(fal);
80 ction.tNumberStyle(Section.NUMBERSTYLE_DOTTED_WITHOUT_FINAL_DOT);
81 ction.add(new Paragraph("90后⼀枚,喜欢美⾷和旅游。。。", textFont));
82
83 document.add(chapter);
84
85 document.clo();