
接下来让我们学习一下如何用iText库来基本丰富我们所需要的PDF文件吧!
注意:示例图片都是代码运行后截图所得,可能图片会偏大,那是因为缩放比例存在不一致,不用在意。
1,文件属性
这个示例是给我们的PDF文件设置文件属性,比如标题,主题,关键字等;
public static void main(String[] args) {Document document = new Document();PdfWriter pdfWriter = null;try {// 创建 PdfWriter 对象 第一个参数是对文档对象的引用,第二个参数是文件的实际名称,在该名称中还会给出其输出路径。pdfWriter = PdfWriter.getInstance(document, new FileOutputStream("E:/PDFDemo/demo/pdfBase1.pdf"));// 3,打开文档[打开作文本]document.open();// 3.1 设置文档属性[作文相关属性]// 标题document.addTitle("This is title");// 主题document.addSubject("This is subject");// 关键字document.addKeywords("Keywords");// 作者document.addAuthor("JiaDuoKu");// 应用程序document.addCreator("JiaDuoKu.com");// 生产者document.addProducer();// 创建时间document.addCreationDate();// 添加文档的头信息[方法addHeader对于PDF文档无效,addHeader仅对html文档有效,用于添加文档的头信息。]document.addHeader("Hello", "HelloHelloHelloHelloHello");// 4,写入内容[写字]document.add(new Paragraph("Hello World!"));// 5,关闭文档[写完收工]document.close();// 6,关闭书写器[放下笔]pdfWriter.close();} catch (Exception e) {e.printStackTrace();}}
效果如下:

2,页面调整
页面调整,即给文档内容设置左右上下间距,方法很简单,Document对象有个有参构造,对应给上相应的值即可。
public static void main(String[] args) {//Document document = new Document();// 给文档设置左右上下间距int marginLeft = 0;int marginRight = 0;int marginTop = 0;int marginBottom = 0;//参数:A4 纸张,左,右,上,下内容间距Document document = new Document(PageSize.A4, marginLeft, marginRight, marginTop, marginBottom);PdfWriter pdfWriter = null;try {// 创建 PdfWriter 对象 第一个参数是对文档对象的引用,第二个参数是文件的实际名称,在该名称中还会给出其输出路径。pdfWriter = PdfWriter.getInstance(document, new FileOutputStream("E:/PDFDemo/demo/pdfBase2.pdf"));// 3,打开文档[打开作文本]document.open();// 4,写入内容[写字]document.add(new Paragraph("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"));document.add(new Paragraph("BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"));// 5,关闭文档[写完收工]document.close();// 6,关闭书写器[放下笔]pdfWriter.close();} catch (Exception e) {e.printStackTrace();}}
效果如下:
3,文本处理
文件那些基本设置好后,我们就可以真正的给PDF文件里新增内容了。
在此之前,我们先解决无法给PDF里添加中文的问题。
Tip1:解决无法给PDF文件添加中文问题
取自文章评论:https://blog.csdn.net/yizezhong/article/details/48005461
// 方式一:使用Windows系统字体(TrueType)BaseFont baseFont =BaseFont.createFont("C:/Windows/Fonts/SIMYOU.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);// 方式二:使用资源字体(ClassPath)BaseFont baseFont = BaseFont.createFont("/SIMYOU.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);// 方式三:使用iTextAsian.jar中的字体[下面有具体示例]BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
方式三:首先,在Maven中添加输出中文支持的itext-asian.jar包
<dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency>
其次,定义一个基本字体BaseFont对象[示例中的字体来自依赖包/外部字体],再定义基本Font,并给段落对应属性赋值。如下:
public static void main(String[] args) {BaseFont bfChinese = null;Font baseFont = null;Font buleBoldFont = null;Document document = new Document();PdfWriter pdfWriter = null;try {// ***解决无法给PDF文件添加中文问题***bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);// 默认字体baseFont = new Font(bfChinese, 15, Font.NORMAL);buleBoldFont = new Font(bfChinese, 11, Font.BOLD, BaseColor.BLUE);// 创建 PdfWriter 对象 第一个参数是对文档对象的引用,第二个参数是文件的实际名称,在该名称中还会给出其输出路径。pdfWriter = PdfWriter.getInstance(document, new FileOutputStream("E:/PDFDemo/demo/pdfBase3.pdf"));// 3,打开文档[打开作文本]document.open();// 4,写入内容[写字]document.add(new Paragraph("haha中文输入进来了。", baseFont));// 5,关闭文档[写完收工]document.close();// 6,关闭书写器[放下笔]pdfWriter.close();} catch (Exception e) {e.printStackTrace();}}
Tip2:Chunk,Phrase,Paragraph之间的关系
文本块(Chunk)是处理文本的最小单位,短语(Phrase)由一个或多个文本块(Chunk)组成,段落(Paragraph)由一个或多个文本块(Chunk)或短语(Phrase)组成。
Chunk < Phrase < Paragraph.
3.1,Chunk【文本块】
文本块(Chunk)是处理文本的最小单位,有一串带格式(包括字体、颜色、大小)的字符串组成。
3.1.1,单一文本块示例
public static void main(String[] args) {BaseFont bfChinese = null;Font baseFont = null;Document document = new Document();PdfWriter pdfWriter = null;try {// ***解决无法给PDF文件添加中文问题***bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);// 默认字体baseFont = new Font(bfChinese, 15, Font.NORMAL);// 创建 PdfWriter 对象 第一个参数是对文档对象的引用,第二个参数是文件的实际名称,在该名称中还会给出其输出路径。pdfWriter = PdfWriter.getInstance(document, new FileOutputStream("E:/PDFDemo/demo/pdfBase4.pdf"));// 3,打开文档[打开作文本]document.open();// 4,写入内容[写字]// 示例一:// 定义文本块对象Chunk chunk1 = new Chunk("我是第一个Chunk,啦啦啦啦");chunk1.setFont(baseFont);// 定义段落对象Paragraph paragraph1 = new Paragraph();// 把块添加到段落中paragraph1.add(chunk1);// 把段落内容写入文档document.add(paragraph1);// 5,关闭文档[写完收工]document.close();// 6,关闭书写器[放下笔]pdfWriter.close();} catch (Exception e) {e.printStackTrace();}}
3.1.2,多个文本块【写法多种】
public static void main(String[] args) {BaseFont bfChinese = null;Font baseFont = null;Document document = new Document();PdfWriter pdfWriter = null;try {// ***解决无法给PDF文件添加中文问题***bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);// 默认字体baseFont = new Font(bfChinese, 15, Font.NORMAL);// 创建 PdfWriter 对象 第一个参数是对文档对象的引用,第二个参数是文件的实际名称,在该名称中还会给出其输出路径。pdfWriter = PdfWriter.getInstance(document, new FileOutputStream("E:/PDFDemo/demo/pdfBase5.pdf"));// 3,打开文档[打开作文本]document.open();// 4,写入内容[写字]// 示例一:Chunk chunk1 = new Chunk("我是第一个Chunk,啦啦啦啦");chunk1.setCharacterSpacing(1);chunk1.setLineHeight(20);chunk1.setFont(baseFont);// 定义段落对象Paragraph paragraph2 = new Paragraph();paragraph2.add(chunk1);document.add(paragraph2);// 示例二:document.add(new Chunk("我是第二个Chunk,啦啦啦啦"));// 5,关闭文档[写完收工]document.close();// 6,关闭书写器[放下笔]pdfWriter.close();} catch (Exception e) {e.printStackTrace();}}
3.2,Phrase【短语】
3.2.1,短语示例
public static void main(String[] args) {BaseFont bfChinese = null;Font baseFont = null;Document document = new Document();PdfWriter pdfWriter = null;try {// ***解决无法给PDF文件添加中文问题***bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);// 默认字体baseFont = new Font(bfChinese, 15, Font.NORMAL);// 创建 PdfWriter 对象 第一个参数是对文档对象的引用,第二个参数是文件的实际名称,在该名称中还会给出其输出路径。pdfWriter = PdfWriter.getInstance(document, new FileOutputStream("E:/PDFDemo/demo/pdfBase6.pdf"));// 3,打开文档[打开作文本]document.open();// 4,写入内容[写字]// 定义短语[注:这种方式新增]document.add(new Phrase("This is sentence 1. "));document.add(new Phrase("This is sentence 2. "));document.add(new Phrase("This is sentence 3. "));document.add(new Phrase("This is sentence 4. "));document.add(new Phrase("This is sentence 5. "));// 5,关闭文档[写完收工]document.close();// 6,关闭书写器[放下笔]pdfWriter.close();} catch (Exception e) {e.printStackTrace();}}
效果如下:
3.2.2,短语与文本块同用示例
public static void main(String[] args) {BaseFont bfChinese = null;Font baseFont = null;Document document = new Document();PdfWriter pdfWriter = null;try {// ***解决无法给PDF文件添加中文问题***bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);// 默认字体baseFont = new Font(bfChinese, 15, Font.NORMAL);// 创建 PdfWriter 对象 第一个参数是对文档对象的引用,第二个参数是文件的实际名称,在该名称中还会给出其输出路径。pdfWriter = PdfWriter.getInstance(document, new FileOutputStream("E:/PDFDemo/demo/pdfBase7.pdf"));// 3,打开文档[打开作文本]document.open();// 4,写入内容[写字]// 定义ChunkChunk chunk = new Chunk("This is a Chunk.");// 定义短语Phrase phrase = new Phrase();// 添加短句phrase.add(chunk);phrase.add(chunk);phrase.add(chunk);phrase.add(chunk);phrase.add(chunk);phrase.add(chunk);// 把短语添加到文档中document.add(phrase);// 5,关闭文档[写完收工]document.close();// 6,关闭书写器[放下笔]pdfWriter.close();} catch (Exception e) {e.printStackTrace();}}
3.2.3,样式优先级问题
当Chunk对象已经设置了字体时,Phrase对象再设置字体的情况下,此时,Phrase设置的字体会对Chunk无效。
public static void main(String[] args) {BaseFont bfChinese = null;Font baseFont = null;Font buleBoldFont = null;Document document = new Document();PdfWriter pdfWriter = null;try {// ***解决无法给PDF文件添加中文问题***bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);// 默认字体baseFont = new Font(bfChinese, 15, Font.NORMAL);// 蓝色加粗字体buleBoldFont = new Font(bfChinese, 11, Font.BOLD, BaseColor.BLUE);// 创建 PdfWriter 对象 第一个参数是对文档对象的引用,第二个参数是文件的实际名称,在该名称中还会给出其输出路径。pdfWriter = PdfWriter.getInstance(document, new FileOutputStream("E:/PDFDemo/demo/pdfBase8.pdf"));// 3,打开文档[打开作文本]document.open();// 4,写入内容[写字]// 定义ChunkChunk chunk = new Chunk("This is a buleBoldFont Chunk.");//给Chunk设置字体chunk.setFont(buleBoldFont);// 定义短语Phrase phrase = new Phrase();// 添加短句phrase.add("This is sentence 1. ");phrase.add(chunk);phrase.add("This is sentence 1. ");//给Phrase设置字体phrase.setFont(baseFont);// 把短语添加到文档中document.add(phrase);// 5,关闭文档[写完收工]document.close();// 6,关闭书写器[放下笔]pdfWriter.close();} catch (Exception e) {e.printStackTrace();}}
3.3,Paragraph【段落】
参考文章:https://blog.csdn.net/yizezhong/article/details/48005461
3.3.1,段落示例
public static void main(String[] args) {BaseFont bfChinese = null;Font baseFont = null;Font buleBoldFont = null;Document document = new Document();PdfWriter pdfWriter = null;try {// ***解决无法给PDF文件添加中文问题***bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);// 默认字体baseFont = new Font(bfChinese, 15, Font.NORMAL);buleBoldFont = new Font(bfChinese, 11, Font.BOLD, BaseColor.BLUE);// 创建 PdfWriter 对象 第一个参数是对文档对象的引用,第二个参数是文件的实际名称,在该名称中还会给出其输出路径。pdfWriter = PdfWriter.getInstance(document, new FileOutputStream("E:/PDFDemo/demo/pdfBase9.pdf"));// 3,打开文档[打开作文本]document.open();// 4,写入内容[写字]//段落活用Paragraph paragraph1 = new Paragraph("The Paragraph is No.1.", baseFont);document.add(paragraph1);//此处的50,为该Paragraph与上一行的间距Paragraph paragraph2 = new Paragraph(50,"The Paragraph is No.2.", baseFont);document.add(paragraph2);Paragraph paragraph3 = new Paragraph("The Paragraph is No.3.", baseFont);document.add(paragraph3);Paragraph paragraph4 = new Paragraph(50,"The Paragraph is No.4.", baseFont);document.add(paragraph4);// 5,关闭文档[写完收工]document.close();// 6,关闭书写器[放下笔]pdfWriter.close();} catch (Exception e) {e.printStackTrace();}}
3.3.2,段落其他属性设置
3.3.2.1,设置段落之间的间距
Paragraph paragraph5 = new Paragraph("The Paragraph is No.5.");//设置段落的上下间距paragraph5.setSpacingBefore(20);paragraph5.setSpacingAfter(20);document.add(paragraph5);
3.3.2.2,设置段落左右缩进
Paragraph paragraph6 = new Paragraph("The Paragraph is No.6.");//设置段落的上下间距paragraph6.setIndentationLeft(30);paragraph6.setIndentationRight(30);//对指定段落的进一步缩进paragraph6.setFirstLineIndent(50);document.add(paragraph6);
3.3.2.2,设置段落的对齐方式
//居左paragraph.setAlignment(Element.ALIGN_LEFT);//居中paragraph.setAlignment(Element.ALIGN_CENTER);//居右paragraph.setAlignment(Element.ALIGN_RIGHT);
3.4,Chapter【章节】
参考文章:http://www.itkeyword.com/doc/7243119081081445191/chapter-itext-pdfsection
3.4.1,章节示例
public static void main(String[] args) {BaseFont bfChinese = null;Font baseFont = null;Font buleBoldFont = null;Document document = new Document();PdfWriter pdfWriter = null;try {// ***解决无法给PDF文件添加中文问题***bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);// 默认字体baseFont = new Font(bfChinese, 15, Font.NORMAL);buleBoldFont = new Font(bfChinese, 11, Font.BOLD, BaseColor.BLUE);// 创建 PdfWriter 对象 第一个参数是对文档对象的引用,第二个参数是文件的实际名称,在该名称中还会给出其输出路径。pdfWriter = PdfWriter.getInstance(document, new FileOutputStream("E:/PDFDemo/demo/pdfBase11.pdf"));// 3,打开文档[打开作文本]document.open();// 4,写入内容[写字]// 定义段落对象Paragraph paragraph1 = new Paragraph("The Paragraph is No.1.", baseFont);// 定义章节对象,1 表示级别Chapter chapter1 = new Chapter(paragraph1, 1);// 定义章节内容,//写法1chapter1.addSection("This is a section 1.");//写法2Section section2 = chapter1.addSection("This is a section 2.");//写法3,此处的2表示级别,其他的自测chapter1.addSection("This is a section 3.", 2);document.add(chapter1);// 5,关闭文档[写完收工]document.close();// 6,关闭书写器[放下笔]pdfWriter.close();} catch (Exception e) {e.printStackTrace();}}
3.4.2,多个章节示例
文档添加俩个章节时,会形成新的章节,即相当于写作文时,这面写完,换面写。
public static void main(String[] args) {BaseFont bfChinese = null;Font baseFont = null;Font buleBoldFont = null;Document document = new Document();PdfWriter pdfWriter = null;try {// ***解决无法给PDF文件添加中文问题***bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);// 默认字体baseFont = new Font(bfChinese, 15, Font.NORMAL);buleBoldFont = new Font(bfChinese, 11, Font.BOLD, BaseColor.BLUE);// 创建 PdfWriter 对象 第一个参数是对文档对象的引用,第二个参数是文件的实际名称,在该名称中还会给出其输出路径。pdfWriter = PdfWriter.getInstance(document, new FileOutputStream("E:/PDFDemo/demo/pdfBase12.pdf"));// 3,打开文档[打开作文本]document.open();// 4,写入内容[写字]// 定义段落对象Paragraph paragraph1 = new Paragraph("The Paragraph is No.1.", baseFont);// 定义章节对象,1 表示级别Chapter chapter1 = new Chapter(paragraph1, 1);// 定义章节内容,//写法1chapter1.addSection("This is a section 1.");//写法2chapter1.addSection("This is a section 2.");//把章节添加到文档中document.add(chapter1);// 定义段落对象Paragraph paragraph2 = new Paragraph("The Paragraph is No.2.", baseFont);// 定义章节对象,1 表示级别Chapter chapter2 = new Chapter(paragraph2, 1);// 定义章节内容,//写法1chapter2.addSection("This is a section 1.");//写法2chapter2.addSection("This is a section 2.");//把章节添加到文档中document.add(chapter2);// 5,关闭文档[写完收工]document.close();// 6,关闭书写器[放下笔]pdfWriter.close();} catch (Exception e) {e.printStackTrace();}}
3.5,Font【字体】
3.5.1,字体示例
public static void main(String[] args) {BaseFont bfChinese = null;// Font baseFont = null;// Font buleBoldFont = null;Document document = new Document();PdfWriter pdfWriter = null;try {// ***解决无法给PDF文件添加中文问题***bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);// // 默认字体// baseFont = new Font(bfChinese, 15, Font.NORMAL);// //蓝色加粗字体样式// buleBoldFont = new Font(bfChinese, 15, Font.BOLD, BaseColor.BLUE);// 创建 PdfWriter 对象 第一个参数是对文档对象的引用,第二个参数是文件的实际名称,在该名称中还会给出其输出路径。pdfWriter = PdfWriter.getInstance(document, new FileOutputStream("E:/PDFDemo/demo/pdfBase14.pdf"));// 3,打开文档[打开作文本]document.open();// 4,写入内容[写字]// Font 字体[常用]// 默认字体[bfChinese:基本/外部字体,15:字体大小size,Font.NORMAL:字体样式]Font baseFont = new Font(bfChinese, 15, Font.NORMAL);Paragraph paragraph1 = new Paragraph("默认字体", baseFont);document.add(paragraph1);// 下划线字体Font underlineFont = new Font(bfChinese, 15, Font.UNDERLINE);Paragraph paragraph2 = new Paragraph("下划线字体", underlineFont);document.add(paragraph2);// 加粗字体Font boldFont = new Font(bfChinese, 15, Font.BOLD);Paragraph paragraph3 = new Paragraph("加粗字体", boldFont);document.add(paragraph3);// 字体加颜色Font colorFont = new Font(bfChinese, 15, Font.NORMAL, BaseColor.BLUE);Paragraph paragraph4 = new Paragraph("加了颜色的字体", colorFont);document.add(paragraph4);// 字体加粗,加颜色Font colorFont2 = new Font(bfChinese, 15, Font.BOLD, BaseColor.RED);Paragraph paragraph7 = new Paragraph("加了颜色,加粗的字体", colorFont2);document.add(paragraph7);// 5,关闭文档[写完收工]document.close();// 6,关闭书写器[放下笔]pdfWriter.close();} catch (Exception e) {e.printStackTrace();}}
3.6,Anchor【超链接】
3.6.1,跳转到外部站点
3.6.1,跳转到文档的特定位置
示例代码:
public static void main(String[] args) {BaseFont bfChinese = null;Font baseFont = null;// Font buleBoldFont = null;Document document = new Document();PdfWriter pdfWriter = null;try {// ***解决无法给PDF文件添加中文问题***bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);// 默认字体baseFont = new Font(bfChinese, 15, Font.NORMAL);// //蓝色加粗字体样式// buleBoldFont = new Font(bfChinese, 15, Font.BOLD, BaseColor.BLUE);// 创建 PdfWriter 对象 第一个参数是对文档对象的引用,第二个参数是文件的实际名称,在该名称中还会给出其输出路径。pdfWriter = PdfWriter.getInstance(document, new FileOutputStream("E:/PDFDemo/demo/pdfBase15.pdf"));// 3,打开文档[打开作文本]document.open();// 4,写入内容[写字]// 定义Anchor对象// 1,跳转到外部站点,只需要设置Reference属性即可Anchor anchor1 = new Anchor("跳转到百度页。\n", baseFont);anchor1.setReference("https://www.baidu.com");document.add(anchor1);// 2,跳转到文档的特定位置,先创建Anchor对象,并给属性name赋值,Anchor anchor2 = new Anchor("About Us!!!");// 这个是点击后跳转到的位置anchor2.setName("aboutUs");document.add(anchor2);// 循环新增段落for (int i = 0; i < 100; i++) {document.add(new Paragraph("This is " + i + " line."));}// 设置需要触发点击的位置,点击后跳转到文档指定位置Anchor anchor3 = new Anchor("goTop!!!");anchor3.setReference("#aboutUs");document.add(anchor3);// 5,关闭文档[写完收工]document.close();// 6,关闭书写器[放下笔]pdfWriter.close();} catch (Exception e) {e.printStackTrace();}}
4,小结
该文章内容为本人所作,之前在做PDF生成这块时,发现很多资料都比较零散,于是我汇集了一些其他文章的内容加上自己的理解,尽量写得很详细,方便大家学习。如有不足之处,还望指出!
