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.htmldocument.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.htmlfor (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=0Image 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 {@Overridepublic 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;}@Overridepublic Font getFont(String fontname, String encoding, boolean embedded, float size, int style, BaseColor color) {//电脑字体路径[C盘-windows-fonts(字体库)-找到支持中文的字体,右键属性复制链接]// ,1 加上就行,不用管,服务器上的话,则是,0String 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();}
宁静致远,天道酬勤。
书上得来终觉浅,绝知此事要躬行。

