接下来让我们学习一下如何用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,写入内容[写字]
// 定义Chunk
Chunk 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,写入内容[写字]
// 定义Chunk
Chunk 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);
// 定义章节内容,
//写法1
chapter1.addSection("This is a section 1.");
//写法2
Section 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);
// 定义章节内容,
//写法1
chapter1.addSection("This is a section 1.");
//写法2
chapter1.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);
// 定义章节内容,
//写法1
chapter2.addSection("This is a section 1.");
//写法2
chapter2.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生成这块时,发现很多资料都比较零散,于是我汇集了一些其他文章的内容加上自己的理解,尽量写得很详细,方便大家学习。如有不足之处,还望指出!