1,List_列表
1.1,列表基本示例
public static void main(String[] args) {
// 字体
BaseFont bfChinese = null;
Font baseFont = null;
Document document = new Document();
PdfWriter pdfWriter = null;
try {
System.out.println("PDF创建中。。。");
pdfWriter = PdfWriter.getInstance(document, new FileOutputStream("E:/XXX/list_列表01.pdf"));
// ***解决无法给PDF文件添加中文问题***
bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
baseFont = new Font(bfChinese, 15, Font.NORMAL);
document.open();
// 添加内容
// List_列表
document.add(new Paragraph("List_列表 Examples!!!", baseFont));
// 添加有序列表
List orderedList = new List(List.ORDERED);
orderedList.add("Item 1.");
orderedList.add("Item 2.");
orderedList.add("Item 3.");
document.add(orderedList);
// 添加无序列表
List noOrderedList = new List(List.UNORDERED);
noOrderedList.add("Item 1.");
noOrderedList.add("Item 2.");
noOrderedList.add("Item 3.");
document.add(noOrderedList);
// 如果想要更多样式,可以参考此链接 https://www.cnblogs.com/chenpi/p/5534595.html
document.close();
pdfWriter.close();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("已完成PDF创建!!!");
}
2,Table_表格
2.1,简单表格
public static void main(String[] args) {
// 字体
BaseFont bfChinese = null;
Font baseFont = null;
Document document = new Document();
PdfWriter pdfWriter = null;
try {
System.out.println("PDF创建中。。。");
pdfWriter = PdfWriter.getInstance(document, new FileOutputStream("E:/XXX/table_表格02.pdf"));
// ***解决无法给PDF文件添加中文问题***
bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
baseFont = new Font(bfChinese, 15, Font.NORMAL);
document.open();
// 添加内容
// Table_简单表格
PdfPTable table = new PdfPTable(3);
// 注意:iText table表格中一行如果不完整,则不写入文档中[针对这个简单添加单元格来说]
// 注意:PdfPRow,PdfPCell cells[]= new PdfPCell[3]; 可解决一行不完整不计文档问题,参考文章:https://www.cnblogs.com/h--d/p/6150320.html
for (int i = 1; i <= 9; i++) {
table.addCell("cell" + i);
}
// 添加到文档中
document.add(table);
document.close();
pdfWriter.close();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("已完成PDF创建!!!");
}
2.2,单元格样式设置
public static final String IMG_URL = "E:/XXX/iText.png";
public static void main(String[] args) {
// 字体
BaseFont bfChinese = null;
Font baseFont = null;
Document document = new Document();
PdfWriter pdfWriter = null;
try {
System.out.println("PDF创建中。。。");
pdfWriter = PdfWriter.getInstance(document, new FileOutputStream("E:/XXX/table_表格04.pdf"));
// ***解决无法给PDF文件添加中文问题***
bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
baseFont = new Font(bfChinese, 15, Font.NORMAL);
document.open();
// 添加内容
// Table_简单表格
PdfPTable table = new PdfPTable(3);
PdfPCell cell1 = new PdfPCell(commonChunk("单元格1", baseFont));
// 背景色
cell1.setBackgroundColor(BaseColor.YELLOW);
// 占俩行
cell1.setRowspan(2);
// 加粗边框
cell1.setBorderWidth(2f);
// 设置内容高度[会影响Table的高度]
cell1.setFixedHeight(50f);
table.addCell(cell1);
PdfPCell cell2 = new PdfPCell(commonChunk("单元格2", baseFont));
// 上下左右边框颜色
cell2.setBorderColorTop(BaseColor.RED);
cell2.setBorderColorRight(BaseColor.BLUE);
table.addCell(cell2);
PdfPCell cell3 = new PdfPCell(commonChunk("单元格3", baseFont));
// 上下左右边框无边框
cell3.setBorder(Rectangle.NO_BORDER);
table.addCell(cell3);
PdfPCell cell4 = new PdfPCell(commonChunk("单元格4", baseFont));
// 设置内容水平居中
cell4.setHorizontalAlignment(Element.ALIGN_CENTER);
// 设置垂直居中
cell4.setVerticalAlignment(Element.ALIGN_MIDDLE);
table.addCell(cell4);
// 插入图片
Image image = Image.getInstance(IMG_URL);
table.addCell(image);
// 参考文章:https://blog.csdn.net/u010142437/article/details/84303581
// 添加到文档中
document.add(table);
document.close();
pdfWriter.close();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("已完成PDF创建!!!");
}
效果如下:
2.3,多个单元格合并操作
public static void main(String[] args) {
// 字体
BaseFont bfChinese = null;
Font baseFont = null;
Document document = new Document();
PdfWriter pdfWriter = null;
try {
System.out.println("PDF创建中。。。");
pdfWriter = PdfWriter.getInstance(document, new FileOutputStream("E:/XXX/table_表格05.pdf"));
// ***解决无法给PDF文件添加中文问题***
bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
baseFont = new Font(bfChinese, 15, Font.NORMAL);
document.open();
// 添加内容
// Table_简单表格
PdfPTable table = new PdfPTable(5);
PdfPCell cell1 = new PdfPCell(commonChunk("单元格1", baseFont));
// 占俩行
cell1.setRowspan(2);
table.addCell(cell1);
PdfPCell cell2 = new PdfPCell(commonChunk("单元格2", baseFont));
// 占俩列
cell2.setColspan(2);
table.addCell(cell2);
PdfPCell cell3 = new PdfPCell(commonChunk("单元格3", baseFont));
cell3.setColspan(2);
table.addCell(cell3);
PdfPCell cell4 = new PdfPCell(commonChunk("单元格4", baseFont));
table.addCell(cell4);
PdfPCell cell5 = new PdfPCell(commonChunk("单元格5", baseFont));
table.addCell(cell5);
PdfPCell cell6 = new PdfPCell(commonChunk("单元格6", baseFont));
table.addCell(cell6);
PdfPCell cell7 = new PdfPCell(commonChunk("单元格7", baseFont));
table.addCell(cell7);
//=======================================================================
PdfPCell zanCell = null;
for (int i = 0; i < 5; i++) {
zanCell = new PdfPCell(commonChunk("单元格" + (i + 8), baseFont));
table.addCell(zanCell);
}
// 分享文章:https://blog.csdn.net/tanqian351/article/details/51201690
// 添加到文档中
document.add(table);
document.close();
pdfWriter.close();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("已完成PDF创建!!!");
}
效果如下:
3,Image_图片
public static final String IMG_URL = "E:/XXX/iText.png";
public static void main(String[] args) {
// 字体
BaseFont bfChinese = null;
Font baseFont = null;
Document document = new Document();
PdfWriter pdfWriter = null;
try {
System.out.println("PDF创建中。。。");
pdfWriter = PdfWriter.getInstance(document, new FileOutputStream("E:/XXX/table_表格图片.pdf"));
// ***解决无法给PDF文件添加中文问题***
bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
baseFont = new Font(bfChinese, 15, Font.NORMAL);
document.open();
// 添加内容
// Image_图片
// 注:该图片的添加方式,是作用于整篇PDF的,它的位置设置,你可以理解为PDF文件的左下角为 x=0,y=0
Image image1 = Image.getInstance(IMG_URL);
// 设置图片位置的x轴和y轴
image1.setAbsolutePosition(200f, 200f);
// 设置图片的宽度及高度[自定义图片的大小]
image1.scaleAbsolute(280, 60);
// 添加到文档中
document.add(image1);
document.close();
pdfWriter.close();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("已完成PDF创建!!!");
}
效果如下:
4,分页
自定义页眉页脚实体,继承 PdfPageEventHelper 【参考文章】
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfPageEventHelper;
import com.itextpdf.text.pdf.PdfWriter;
import com.zhiyi.springboot.itext.PdfAdvanced;
/**
* @author Zol
* @date 2020-04-21 17:13
* @description 页眉页脚实体
*/
public class HeaderFooter extends PdfPageEventHelper {
@Override
public void onEndPage(PdfWriter writer, Document document) {
Rectangle rect = writer.getBoxSize("art");
// 设置页眉
ColumnText.showTextAligned(writer.getDirectContent(),
Element.ALIGN_LEFT, new Phrase("页眉", PdfAdvanced.baseFont),
(rect.getLeft() + rect.getRight()) / 2, rect.getTop(), 0);
// 页脚内容
String yeWeiStr = String.format("页尾第 %d 页", writer.getPageNumber());
Phrase yeWeiPhrase = new Phrase(yeWeiStr, PdfAdvanced.baseFont);
// 设置页脚
// PdfContentByte,对齐方式,文本短语,X 横坐标,Y 纵坐标,rotation 将以逆时针方向旋转 度数
ColumnText.showTextAligned(writer.getDirectContent(),
Element.ALIGN_CENTER, yeWeiPhrase, (rect.getLeft() + rect.getRight()) / 2, rect.getBottom() - 5, 0);
}
}
具体操作代码如下:
public static void main(String[] args) {
// 设置文档样式,左右上下间距
Document document = new Document(PageSize.A4, 50, 50, 50, 50);
try {
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("E:/PDFDemo/demo/pdf_分页001.pdf"));
Rectangle rect = new Rectangle(36, 54, 559, 788);
rect.setBorderColor(BaseColor.BLACK);
writer.setBoxSize("art", rect);
// 自定义页眉页脚实体
HeaderFooter header = new HeaderFooter();
// 设置页眉页脚
writer.setPageEvent(header);
document.open();
// 新开一页
document.newPage();
// 添加内容
Paragraph par = new Paragraph("first paragraph");
document.add(par);
// 新开一页
document.newPage();
// 添加内容
Paragraph par2 = new Paragraph("second paragraph");
document.add(par2);
document.close();
} catch (Exception e) {
e.printStackTrace();
}
}
5,密码保护
给PDF设置密码保护,需要添加 bcprov-jdk15on 的依赖
<!-- 支持给PDF设置密码 -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.54</version>
</dependency>
public static void main(String[] args) {
// 字体
BaseFont bfChinese = null;
Font baseFont = null;
Document document = new Document();
PdfWriter pdfWriter = null;
try {
System.out.println("PDF创建中。。。");
pdfWriter = PdfWriter.getInstance(document, new FileOutputStream("E:/XXX/pdf_密码保护.pdf"));
// ***解决无法给PDF文件添加中文问题***
bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
baseFont = new Font(bfChinese, 15, Font.NORMAL);
// 密码保护 用户密码
String userPwd = "123456";
// 打开文档的密码
String ownerPwd = "zol";
pdfWriter.setEncryption(userPwd.getBytes(), ownerPwd.getBytes(), PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128);
document.open();
// 添加内容
Paragraph paragraph = new Paragraph("简单的PDF。", baseFont);
// 添加到文档中
document.add(paragraph);
document.close();
pdfWriter.close();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("已完成PDF创建!!!");
}
6,创建具有权限的PDF
不知道怎么测试 /疑问
// 把上面设置密码那句代码改成下面的
// 设置PDF文件只读权限
pdfWriter.setEncryption("".getBytes(), "".getBytes(), PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128);
7,读取和修改已有的PDF文件
// 图片路径
public static final String IMG_URL = "E:/XXX/iText.png";
public static void main(String[] args) throws IOException, DocumentException {
// 已存在的PDF文件
String filePath = "E:/XXX/pdfBase - 副本.pdf";
// 生成后的PDF文件
String savePath = "E:/XXX/pdfBase - 副本_修改.pdf";
// 1,读取PDF文件
PdfReader pdfReader = new PdfReader(new FileInputStream(filePath));
// PdfReader pdfReader = new PdfReader(filePath);
// 2,实例化修改器
PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(savePath));
Image image = Image.getInstance(IMG_URL);
// 设置图片的位置
image.setAbsolutePosition(200f, 200f);
// 设置图片的大小
image.scaleAbsolute(200f, 80f);
// 获取指定页内容,写入要加的内容[注:1:表示第一页]
PdfContentByte underContent1 = pdfStamper.getUnderContent(1);
underContent1.addImage(image);
if (null != pdfStamper) {
pdfStamper.close();
}
}
效果如下:
8,富文本转PDF[动态生成PDF]
以下是属于HTML转PDF的方法,可以实现动态生成PDF文件。
对于需要插入中文,则需要新建PdfFont实体
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;
import java.io.IOException;
public class PdfFont extends XMLWorkerFontProvider {
private String pdfFontPath;
public PdfFont() {
}
public PdfFont(String fontPath) {
this.pdfFontPath = fontPath;
}
@Override
public Font getFont(String fontname, String encoding, boolean embedded, float size, int style, BaseColor color) {
//电脑字体路径[C盘-windows-fonts(字体库)-找到支持中文的字体,右键属性复制链接]
// ,1 加上就行,不用管,服务器上的话,则是,0
String yaHeiFontName = "C:/XXX/SIMSUN.TTC,1";
Font font = null;
try {
font = new Font(BaseFont.createFont(yaHeiFontName, BaseFont.IDENTITY_H, BaseFont.EMBEDDED));
font.setStyle(style);
font.setColor(color);
if (size > 0) {
font.setSize(size);
}
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return font;
}
}
HTML 富文本转PDF文件
public static void main(String[] args) throws DocumentException {
// 文件保存路径
String filePath = "E:/XXX/HTMLToPdf01.pdf";
// 创建一个文档
Document document = new Document();
PdfWriter pdfWriter = null;
try {
pdfWriter = PdfWriter.getInstance(document, new FileOutputStream(filePath));
} catch (DocumentException e) {
e.printStackTrace();
}
document.open();
try {
XMLWorkerHelper.getInstance().parseXHtml(pdfWriter, document,
new ByteArrayInputStream("<h1>Hello World!</h1>".getBytes(StandardCharsets.UTF_8)), Charset.forName("UTF-8"), new PdfFont(""));
} catch (IOException e) {
e.printStackTrace();
}
document.close();
}
9,HTTP响应将PDF写入输出流
具体操作,自行斟酌。
public void createPdfFile(HttpServletResponse response){
response.setContentType("application/pdf");
response.addHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.addHeader("charset", "utf-8");
response.addHeader("Pragma", "no-cache");
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("PDFName001", "UTF-8") + ".pdf");
// 创建一个文档
Document document = new Document();
PdfWriter pdfWriter = null;
try {
pdfWriter = PdfWriter.getInstance(document, response.getOutputStream());
} catch (DocumentException e) {
e.printStackTrace();
}
document.open();
//=====================================================================
try {
XMLWorkerHelper.getInstance().parseXHtml(pdfWriter, document,
new ByteArrayInputStream("<h1>Hello World!</h1>".getBytes(StandardCharsets.UTF_8)), Charset.forName("UTF-8"), new PdfFont(""));
} catch (IOException e) {
e.printStackTrace();
}
document.close();
}
宁静致远,天道酬勤。
书上得来终觉浅,绝知此事要躬行。