一、Itext简介
- API地址:javadoc/index.html;如 D:/MyJAR/原JAR包/PDF/itext-5.5.3/itextpdf-5.5.3-javadoc/index.html
- 功能:a Free Java-PDF;
- 中文支持:iTextAsian.jar,现在高版本Itext不支持语言包。
- 使用的版本:iTextpdf-5.0.0.jar, iTextAsian-2.0.jar,或者不用 iTextAsian-2.0.jar,直接使用ttf或ttc字体库
二、Itext API
(一)PDF文档生成的5步
- /**
- * 5步生成一个PDF
- */
- public void createPdf() throws Exception {
- // 1-创建文本对象 Document
- Document document = new Document(PageSize.A4, 500, 150, 50, 50);
- // 2-初始化 pdf输出对象 PdfWriter
- PdfWriter.getInstance(document, out);
- // 3-打开 Document
- document.open();
- // 4-往 Document 添加内容
- document.add(new Paragraph("Hello! PDF!!!"));
- // 5-关闭 Document
- document.close();
- }
- </span>
(二)文档对象:Document、Rectangle、PageSize
1、 Document — PDF对象
1)构造方法:
①、Document(Rectangle pageSize, float marginLeft, float marginRight, float marginTop,
float marginBottom):分别指pdf页面大小和内容距离文档边的距离。
②、默认 Document()为:A4,36,36,36,36
2)属性:
①、基本属性:版本(PdfVersionImp)、标题(Title)、作者(Author)、主题(Subject)、关键字(Keywords)、创建者(Creator)等等
②、其他属性:页面空白(Margins和marginLeft各个方位)
3)方法:
①、 add()-添加内容,newPage()-下一页, addDocListener-监听器
② 、getPageNumber()-第几页 ,getPageSize-页面大小 ,
top|left|right|bottom-页面预定义位置,置页眉页脚或者页码时有用,内部调用Rectangle的属性
setJavaScript_onLoad(添加js)等等
- // 2-2 横向打印
- document = new Document(PageSize.A4.rotate());// 横向打印
- document = new Document(tRectangle.rotate());// 横向打印
- try {
- // 解析器
- PdfWriter writer= PdfWriter.getInstance(document, new FileOutputStream("pdf/pdfText.pdf"));
- // 3-为pdf添加属性信息
- document.addAuthor("作者");
- document.addTitle("标题");
- document.addSubject("主题");
- document.addKeywords("关键字");
- //页边空白
- document.setMargins(10, 20, 30, 40);
- document.open();
- // 4-PDF添加内容
- document.add(new Paragraph("Hello world"));
- // 5-添加Page
- document.newPage();
- // writer.setPageEmpty(false);//显示空内容的页
- writer.setPageEmpty(true);//不会显示空内容的页
- document.newPage();
- document.add(new Paragraph("New page"));
- logger.debug("PDF创建结束....");
2、 Rectangle— 页面对象
1)构造方法:
Rectangle(final float llx, final float lly, final float urx, final float ury)
Rectangle(PageSize.A4) -PageSize 封装常用的 Rectangle
2)属性
①、NO_BORDER-无边框(单元格),left|top|right|bottom
3)方法
①、rotate()-横向打印
②、setBackgroundColor()-背景色,
setBorder()-边框,
setBorderColor()-边框颜色
- Document document = null;
- document = new Document();// 默认PageSize.A4, 36, 36, 36, 36
- document = new Document(PageSize.A4);// 等效于上面的
- document = new Document(PageSize.A4, 50, 50, 50, 50);// PageSize封装了大量常用的Rectangle数据
- // 2-Rectangle(pdf页面)创建Document
- // 一般是四个参数表示:左下角的坐标和右上角的坐标
- Rectangle tRectangle = null;
- tRectangle = PageSize.A4;// PageSize封装了大量常用的Rectangle数据
- tRectangle = new Rectangle(800, 600);// 长宽
- tRectangle = new Rectangle(0, 0, 800, 600);// 等于上面
- // 2-1 其他页面属性:不能和PageSize封装的静态一起使用
- tRectangle.setBackgroundColor(BaseColor.BLACK);// 背景色
- tRectangle.setBorder(1220);// 边框
- tRectangle.setBorderColor(BaseColor.BLUE);
- tRectangle.setBorderWidth(244.2f);
- document = new Document(tRectangle);</span>
);// 边框
(三)内容对象:
1、中文支持:
1)BaseFont-确认支持中文
2)Font-字体的设置,如颜色,字体,大小等
3)固定用法如下:
- <span style="font-family:SimSun;"> /**
- * 支持中文
- *
- * @return
- */
- public Font getChineseFont() {
- BaseFont bfChinese;
- Font fontChinese = null;
- try {
- bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
- // fontChinese = new Font(bfChinese, 12, Font.NORMAL);
- fontChinese = new Font(bfChinese, 12, Font.NORMAL, BaseColor.BLUE);
- } catch (DocumentException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- return fontChinese;
- }
- }
- </span>
2、Element接口
1)内容对象基本都实现这个接口。如Chunk、 Phrase、 Paragraph
2)一些有用的方位参数:
ALIGN_LEFT, ALIGN_CENTER、 ALIGN_RIGHT, ALIGN_JUSTIFIED 。
如设置居中对齐:setAlignment(Element.ALIGN_CENTER)
3、 Chunk
1)块对象: a String, a Font, and some attributes
2)方法:Chunk.NEWLINE-换行,
setUnderline(0.2f, -2f)- 下划线
setTextRise(6)-上浮
- <span style="font-family:SimSun;">// 1-Chunk块对象: a String, a Font, and some attributes
- document.add(new Chunk("中文输出: ", getChineseFont()));
- Chunk tChunk2 = new Chunk("输出的内容", getChineseFont());
- tChunk2.setBackground(BaseColor.CYAN, 1f, 0.5f, 1f, 1.5f); // 设置背景色
- tChunk2.setTextRise(6); // 上浮
- tChunk2.setUnderline(0.2f, -2f); // 下划线
- document.add(tChunk2);
- document.add(Chunk.NEWLINE); // 新建一行
- // document.add(new Phrase("Phrase page :")); //会上浮,不知道原因??</span>
4、 Phrase
1)Phrase短语对象: a List of Chunks with leading
2)方法:add(Element)-添加方法,add(Chunk.NEWLINE)-内部换行
setLeading(14f)-行间距
- <span style="font-family:SimSun;"> // 2-Phrase短语对象: a List of Chunks with leading
- document.add(new Phrase("Phrase page :"));
- Phrase tPhrase = new Phrase();
- Chunk name = new Chunk("China");
- name.setUnderline(0.2f, -2f);
- tPhrase.add(name);
- tPhrase.add(Chunk.NEWLINE);// 放在容器中好用
- tPhrase.add(new Chunk("换行了 :", getChineseFont()));
- tPhrase.add(new Chunk("chinese"));
- tPhrase.setLeading(14f);// 行间距
- document.add(tPhrase);
- // 这边就好用,上面是Chunk,就不好用
- // 放在段落或短语中又好用
- document.add(Chunk.NEWLINE);
- Phrase director2 = new Phrase();
- Chunk name2 = new Chunk("换行了---Japan", getChineseFont());
- name2.setUnderline(0.2f, -2f);
- director2.add(name2);
- director2.add(new Chunk(","));
- director2.add(new Chunk(" "));
- director2.add(new Chunk("japanese上浮下", getChineseFont()).setTextRise(3f));
- director2.setLeading(24);
- document.add(director2);</span>
5、 Paragraph—(新段落另起一行)
1)段落对象: a Phrase with extra properties and a newline
2)方法:
add(Element)-添加; setLeading(20f)-行间距,一个Paragraph只有一个行间距;
setIndentationLeft()-左缩进, setIndentationRight-右缩进, setFirstLineIndent-首行缩进;
setSpacingBefore-设置上空白, setSpacingAfter(10f)-设置段落下空;
setAlignment(Element.ALIGN_CENTER)-居中对齐;
- <span style="font-family:SimSun;">// 3-Paragraph段落对象: a Phrase with extra properties and a newline
- document.add(new Paragraph("Paragraph page"));
- Paragraph info = new Paragraph();
- info.add(new Chunk("China "));
- info.add(new Chunk("chinese"));
- info.add(Chunk.NEWLINE); // 好用的
- info.add(new Phrase("Japan "));
- info.add(new Phrase("japanese"));
- info.setSpacingAfter(10f);// 设置段落下空白
- document.add(info);
- // 段落是比较好用的
- Paragraph tParagraph = new Paragraph("段落是文章中最基本的单位。内容上它具有一个相对完整的意思;在文章中,段具有换行的标。段是由句子或句群组成的,在文章中用于体现作者的思路发展或全篇文章的层次。有的段落只有一个句子,称为独句段,独句段一般是文章的开头段、结尾段、"
- + "过渡段强调段等特殊的段落。多数段落包括不止一个句子或句群,叫多句段。中文段落开头前一般空两个格。", getChineseFont());
- tParagraph.setAlignment(Element.ALIGN_JUSTIFIED);// 对齐方式
- tParagraph.setIndentationLeft(12);// 左缩进
- tParagraph.setIndentationRight(12);// 右缩进
- tParagraph.setFirstLineIndent(24);// 首行缩进
- tParagraph.setLeading(20f);// 行间距
- tParagraph.setSpacingBefore(5f);// 设置上空白
- tParagraph.setSpacingAfter(10f);// 设置段落下空白
- document.add(tParagraph);
- // 每个新的段落会另起一行
- tParagraph = new Paragraph("新的段落", getChineseFont());
- tParagraph.setAlignment(Element.ALIGN_CENTER);// 居中
- document.add(tParagraph);
- </span>
.5f, 1f, 1.5f); // 设置背景色