iText官网图.png


1,List_列表

1.1,列表基本示例

  1. public static void main(String[] args) {
  2. // 字体
  3. BaseFont bfChinese = null;
  4. Font baseFont = null;
  5. Document document = new Document();
  6. PdfWriter pdfWriter = null;
  7. try {
  8. System.out.println("PDF创建中。。。");
  9. pdfWriter = PdfWriter.getInstance(document, new FileOutputStream("E:/XXX/list_列表01.pdf"));
  10. // ***解决无法给PDF文件添加中文问题***
  11. bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
  12. baseFont = new Font(bfChinese, 15, Font.NORMAL);
  13. document.open();
  14. // 添加内容
  15. // List_列表
  16. document.add(new Paragraph("List_列表 Examples!!!", baseFont));
  17. // 添加有序列表
  18. List orderedList = new List(List.ORDERED);
  19. orderedList.add("Item 1.");
  20. orderedList.add("Item 2.");
  21. orderedList.add("Item 3.");
  22. document.add(orderedList);
  23. // 添加无序列表
  24. List noOrderedList = new List(List.UNORDERED);
  25. noOrderedList.add("Item 1.");
  26. noOrderedList.add("Item 2.");
  27. noOrderedList.add("Item 3.");
  28. document.add(noOrderedList);
  29. // 如果想要更多样式,可以参考此链接 https://www.cnblogs.com/chenpi/p/5534595.html
  30. document.close();
  31. pdfWriter.close();
  32. } catch (Exception e) {
  33. e.printStackTrace();
  34. }
  35. System.out.println("已完成PDF创建!!!");
  36. }

效果如下:
List_列表基本.png

2,Table_表格

2.1,简单表格

  1. public static void main(String[] args) {
  2. // 字体
  3. BaseFont bfChinese = null;
  4. Font baseFont = null;
  5. Document document = new Document();
  6. PdfWriter pdfWriter = null;
  7. try {
  8. System.out.println("PDF创建中。。。");
  9. pdfWriter = PdfWriter.getInstance(document, new FileOutputStream("E:/XXX/table_表格02.pdf"));
  10. // ***解决无法给PDF文件添加中文问题***
  11. bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
  12. baseFont = new Font(bfChinese, 15, Font.NORMAL);
  13. document.open();
  14. // 添加内容
  15. // Table_简单表格
  16. PdfPTable table = new PdfPTable(3);
  17. // 注意:iText table表格中一行如果不完整,则不写入文档中[针对这个简单添加单元格来说]
  18. // 注意:PdfPRow,PdfPCell cells[]= new PdfPCell[3]; 可解决一行不完整不计文档问题,参考文章:https://www.cnblogs.com/h--d/p/6150320.html
  19. for (int i = 1; i <= 9; i++) {
  20. table.addCell("cell" + i);
  21. }
  22. // 添加到文档中
  23. document.add(table);
  24. document.close();
  25. pdfWriter.close();
  26. } catch (Exception e) {
  27. e.printStackTrace();
  28. }
  29. System.out.println("已完成PDF创建!!!");
  30. }

效果如下:
Table_表格基本.png

2.2,单元格样式设置

  1. public static final String IMG_URL = "E:/XXX/iText.png";
  2. public static void main(String[] args) {
  3. // 字体
  4. BaseFont bfChinese = null;
  5. Font baseFont = null;
  6. Document document = new Document();
  7. PdfWriter pdfWriter = null;
  8. try {
  9. System.out.println("PDF创建中。。。");
  10. pdfWriter = PdfWriter.getInstance(document, new FileOutputStream("E:/XXX/table_表格04.pdf"));
  11. // ***解决无法给PDF文件添加中文问题***
  12. bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
  13. baseFont = new Font(bfChinese, 15, Font.NORMAL);
  14. document.open();
  15. // 添加内容
  16. // Table_简单表格
  17. PdfPTable table = new PdfPTable(3);
  18. PdfPCell cell1 = new PdfPCell(commonChunk("单元格1", baseFont));
  19. // 背景色
  20. cell1.setBackgroundColor(BaseColor.YELLOW);
  21. // 占俩行
  22. cell1.setRowspan(2);
  23. // 加粗边框
  24. cell1.setBorderWidth(2f);
  25. // 设置内容高度[会影响Table的高度]
  26. cell1.setFixedHeight(50f);
  27. table.addCell(cell1);
  28. PdfPCell cell2 = new PdfPCell(commonChunk("单元格2", baseFont));
  29. // 上下左右边框颜色
  30. cell2.setBorderColorTop(BaseColor.RED);
  31. cell2.setBorderColorRight(BaseColor.BLUE);
  32. table.addCell(cell2);
  33. PdfPCell cell3 = new PdfPCell(commonChunk("单元格3", baseFont));
  34. // 上下左右边框无边框
  35. cell3.setBorder(Rectangle.NO_BORDER);
  36. table.addCell(cell3);
  37. PdfPCell cell4 = new PdfPCell(commonChunk("单元格4", baseFont));
  38. // 设置内容水平居中
  39. cell4.setHorizontalAlignment(Element.ALIGN_CENTER);
  40. // 设置垂直居中
  41. cell4.setVerticalAlignment(Element.ALIGN_MIDDLE);
  42. table.addCell(cell4);
  43. // 插入图片
  44. Image image = Image.getInstance(IMG_URL);
  45. table.addCell(image);
  46. // 参考文章:https://blog.csdn.net/u010142437/article/details/84303581
  47. // 添加到文档中
  48. document.add(table);
  49. document.close();
  50. pdfWriter.close();
  51. } catch (Exception e) {
  52. e.printStackTrace();
  53. }
  54. System.out.println("已完成PDF创建!!!");
  55. }

效果如下:
Table_表格单元格样式设置.png

2.3,多个单元格合并操作

  1. public static void main(String[] args) {
  2. // 字体
  3. BaseFont bfChinese = null;
  4. Font baseFont = null;
  5. Document document = new Document();
  6. PdfWriter pdfWriter = null;
  7. try {
  8. System.out.println("PDF创建中。。。");
  9. pdfWriter = PdfWriter.getInstance(document, new FileOutputStream("E:/XXX/table_表格05.pdf"));
  10. // ***解决无法给PDF文件添加中文问题***
  11. bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
  12. baseFont = new Font(bfChinese, 15, Font.NORMAL);
  13. document.open();
  14. // 添加内容
  15. // Table_简单表格
  16. PdfPTable table = new PdfPTable(5);
  17. PdfPCell cell1 = new PdfPCell(commonChunk("单元格1", baseFont));
  18. // 占俩行
  19. cell1.setRowspan(2);
  20. table.addCell(cell1);
  21. PdfPCell cell2 = new PdfPCell(commonChunk("单元格2", baseFont));
  22. // 占俩列
  23. cell2.setColspan(2);
  24. table.addCell(cell2);
  25. PdfPCell cell3 = new PdfPCell(commonChunk("单元格3", baseFont));
  26. cell3.setColspan(2);
  27. table.addCell(cell3);
  28. PdfPCell cell4 = new PdfPCell(commonChunk("单元格4", baseFont));
  29. table.addCell(cell4);
  30. PdfPCell cell5 = new PdfPCell(commonChunk("单元格5", baseFont));
  31. table.addCell(cell5);
  32. PdfPCell cell6 = new PdfPCell(commonChunk("单元格6", baseFont));
  33. table.addCell(cell6);
  34. PdfPCell cell7 = new PdfPCell(commonChunk("单元格7", baseFont));
  35. table.addCell(cell7);
  36. //=======================================================================
  37. PdfPCell zanCell = null;
  38. for (int i = 0; i < 5; i++) {
  39. zanCell = new PdfPCell(commonChunk("单元格" + (i + 8), baseFont));
  40. table.addCell(zanCell);
  41. }
  42. // 分享文章:https://blog.csdn.net/tanqian351/article/details/51201690
  43. // 添加到文档中
  44. document.add(table);
  45. document.close();
  46. pdfWriter.close();
  47. } catch (Exception e) {
  48. e.printStackTrace();
  49. }
  50. System.out.println("已完成PDF创建!!!");
  51. }

效果如下:
Table_表格单元格合并操作.png

3,Image_图片

  1. public static final String IMG_URL = "E:/XXX/iText.png";
  2. public static void main(String[] args) {
  3. // 字体
  4. BaseFont bfChinese = null;
  5. Font baseFont = null;
  6. Document document = new Document();
  7. PdfWriter pdfWriter = null;
  8. try {
  9. System.out.println("PDF创建中。。。");
  10. pdfWriter = PdfWriter.getInstance(document, new FileOutputStream("E:/XXX/table_表格图片.pdf"));
  11. // ***解决无法给PDF文件添加中文问题***
  12. bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
  13. baseFont = new Font(bfChinese, 15, Font.NORMAL);
  14. document.open();
  15. // 添加内容
  16. // Image_图片
  17. // 注:该图片的添加方式,是作用于整篇PDF的,它的位置设置,你可以理解为PDF文件的左下角为 x=0,y=0
  18. Image image1 = Image.getInstance(IMG_URL);
  19. // 设置图片位置的x轴和y轴
  20. image1.setAbsolutePosition(200f, 200f);
  21. // 设置图片的宽度及高度[自定义图片的大小]
  22. image1.scaleAbsolute(280, 60);
  23. // 添加到文档中
  24. document.add(image1);
  25. document.close();
  26. pdfWriter.close();
  27. } catch (Exception e) {
  28. e.printStackTrace();
  29. }
  30. System.out.println("已完成PDF创建!!!");
  31. }

效果如下:
Image_图片.png

4,分页

自定义页眉页脚实体,继承 PdfPageEventHelper 【参考文章】

  1. import com.itextpdf.text.*;
  2. import com.itextpdf.text.pdf.ColumnText;
  3. import com.itextpdf.text.pdf.PdfPageEventHelper;
  4. import com.itextpdf.text.pdf.PdfWriter;
  5. import com.zhiyi.springboot.itext.PdfAdvanced;
  6. /**
  7. * @author Zol
  8. * @date 2020-04-21 17:13
  9. * @description 页眉页脚实体
  10. */
  11. public class HeaderFooter extends PdfPageEventHelper {
  12. @Override
  13. public void onEndPage(PdfWriter writer, Document document) {
  14. Rectangle rect = writer.getBoxSize("art");
  15. // 设置页眉
  16. ColumnText.showTextAligned(writer.getDirectContent(),
  17. Element.ALIGN_LEFT, new Phrase("页眉", PdfAdvanced.baseFont),
  18. (rect.getLeft() + rect.getRight()) / 2, rect.getTop(), 0);
  19. // 页脚内容
  20. String yeWeiStr = String.format("页尾第 %d 页", writer.getPageNumber());
  21. Phrase yeWeiPhrase = new Phrase(yeWeiStr, PdfAdvanced.baseFont);
  22. // 设置页脚
  23. // PdfContentByte,对齐方式,文本短语,X 横坐标,Y 纵坐标,rotation 将以逆时针方向旋转 度数
  24. ColumnText.showTextAligned(writer.getDirectContent(),
  25. Element.ALIGN_CENTER, yeWeiPhrase, (rect.getLeft() + rect.getRight()) / 2, rect.getBottom() - 5, 0);
  26. }
  27. }

具体操作代码如下:

  1. public static void main(String[] args) {
  2. // 设置文档样式,左右上下间距
  3. Document document = new Document(PageSize.A4, 50, 50, 50, 50);
  4. try {
  5. PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("E:/PDFDemo/demo/pdf_分页001.pdf"));
  6. Rectangle rect = new Rectangle(36, 54, 559, 788);
  7. rect.setBorderColor(BaseColor.BLACK);
  8. writer.setBoxSize("art", rect);
  9. // 自定义页眉页脚实体
  10. HeaderFooter header = new HeaderFooter();
  11. // 设置页眉页脚
  12. writer.setPageEvent(header);
  13. document.open();
  14. // 新开一页
  15. document.newPage();
  16. // 添加内容
  17. Paragraph par = new Paragraph("first paragraph");
  18. document.add(par);
  19. // 新开一页
  20. document.newPage();
  21. // 添加内容
  22. Paragraph par2 = new Paragraph("second paragraph");
  23. document.add(par2);
  24. document.close();
  25. } catch (Exception e) {
  26. e.printStackTrace();
  27. }
  28. }

效果如下:
PDF_page分页1.png PDF_page分页2.png

5,密码保护

给PDF设置密码保护,需要添加 bcprov-jdk15on 的依赖

  1. <!-- 支持给PDF设置密码 -->
  2. <dependency>
  3. <groupId>org.bouncycastle</groupId>
  4. <artifactId>bcprov-jdk15on</artifactId>
  5. <version>1.54</version>
  6. </dependency>
  1. public static void main(String[] args) {
  2. // 字体
  3. BaseFont bfChinese = null;
  4. Font baseFont = null;
  5. Document document = new Document();
  6. PdfWriter pdfWriter = null;
  7. try {
  8. System.out.println("PDF创建中。。。");
  9. pdfWriter = PdfWriter.getInstance(document, new FileOutputStream("E:/XXX/pdf_密码保护.pdf"));
  10. // ***解决无法给PDF文件添加中文问题***
  11. bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
  12. baseFont = new Font(bfChinese, 15, Font.NORMAL);
  13. // 密码保护 用户密码
  14. String userPwd = "123456";
  15. // 打开文档的密码
  16. String ownerPwd = "zol";
  17. pdfWriter.setEncryption(userPwd.getBytes(), ownerPwd.getBytes(), PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128);
  18. document.open();
  19. // 添加内容
  20. Paragraph paragraph = new Paragraph("简单的PDF。", baseFont);
  21. // 添加到文档中
  22. document.add(paragraph);
  23. document.close();
  24. pdfWriter.close();
  25. } catch (Exception e) {
  26. e.printStackTrace();
  27. }
  28. System.out.println("已完成PDF创建!!!");
  29. }

PDF_密码保护.png

6,创建具有权限的PDF

不知道怎么测试 /疑问

  1. // 把上面设置密码那句代码改成下面的
  2. // 设置PDF文件只读权限
  3. pdfWriter.setEncryption("".getBytes(), "".getBytes(), PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128);

7,读取和修改已有的PDF文件

  1. // 图片路径
  2. public static final String IMG_URL = "E:/XXX/iText.png";
  3. public static void main(String[] args) throws IOException, DocumentException {
  4. // 已存在的PDF文件
  5. String filePath = "E:/XXX/pdfBase - 副本.pdf";
  6. // 生成后的PDF文件
  7. String savePath = "E:/XXX/pdfBase - 副本_修改.pdf";
  8. // 1,读取PDF文件
  9. PdfReader pdfReader = new PdfReader(new FileInputStream(filePath));
  10. // PdfReader pdfReader = new PdfReader(filePath);
  11. // 2,实例化修改器
  12. PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(savePath));
  13. Image image = Image.getInstance(IMG_URL);
  14. // 设置图片的位置
  15. image.setAbsolutePosition(200f, 200f);
  16. // 设置图片的大小
  17. image.scaleAbsolute(200f, 80f);
  18. // 获取指定页内容,写入要加的内容[注:1:表示第一页]
  19. PdfContentByte underContent1 = pdfStamper.getUnderContent(1);
  20. underContent1.addImage(image);
  21. if (null != pdfStamper) {
  22. pdfStamper.close();
  23. }
  24. }

效果如下:
hello_读取PDF1.png hello_修改PDF2.png

8,富文本转PDF[动态生成PDF]

以下是属于HTML转PDF的方法,可以实现动态生成PDF文件。
对于需要插入中文,则需要新建PdfFont实体

  1. import com.itextpdf.text.BaseColor;
  2. import com.itextpdf.text.DocumentException;
  3. import com.itextpdf.text.Font;
  4. import com.itextpdf.text.pdf.BaseFont;
  5. import com.itextpdf.tool.xml.XMLWorkerFontProvider;
  6. import java.io.IOException;
  7. public class PdfFont extends XMLWorkerFontProvider {
  8. private String pdfFontPath;
  9. public PdfFont() {
  10. }
  11. public PdfFont(String fontPath) {
  12. this.pdfFontPath = fontPath;
  13. }
  14. @Override
  15. public Font getFont(String fontname, String encoding, boolean embedded, float size, int style, BaseColor color) {
  16. //电脑字体路径[C盘-windows-fonts(字体库)-找到支持中文的字体,右键属性复制链接]
  17. // ,1 加上就行,不用管,服务器上的话,则是,0
  18. String yaHeiFontName = "C:/XXX/SIMSUN.TTC,1";
  19. Font font = null;
  20. try {
  21. font = new Font(BaseFont.createFont(yaHeiFontName, BaseFont.IDENTITY_H, BaseFont.EMBEDDED));
  22. font.setStyle(style);
  23. font.setColor(color);
  24. if (size > 0) {
  25. font.setSize(size);
  26. }
  27. } catch (DocumentException e) {
  28. e.printStackTrace();
  29. } catch (IOException e) {
  30. e.printStackTrace();
  31. }
  32. return font;
  33. }
  34. }

HTML 富文本转PDF文件

  1. public static void main(String[] args) throws DocumentException {
  2. // 文件保存路径
  3. String filePath = "E:/XXX/HTMLToPdf01.pdf";
  4. // 创建一个文档
  5. Document document = new Document();
  6. PdfWriter pdfWriter = null;
  7. try {
  8. pdfWriter = PdfWriter.getInstance(document, new FileOutputStream(filePath));
  9. } catch (DocumentException e) {
  10. e.printStackTrace();
  11. }
  12. document.open();
  13. try {
  14. XMLWorkerHelper.getInstance().parseXHtml(pdfWriter, document,
  15. new ByteArrayInputStream("<h1>Hello World!</h1>".getBytes(StandardCharsets.UTF_8)), Charset.forName("UTF-8"), new PdfFont(""));
  16. } catch (IOException e) {
  17. e.printStackTrace();
  18. }
  19. document.close();
  20. }

9,HTTP响应将PDF写入输出流

具体操作,自行斟酌。

  1. public void createPdfFile(HttpServletResponse response){
  2. response.setContentType("application/pdf");
  3. response.addHeader("Cache-Control", "no-cache, no-store, must-revalidate");
  4. response.addHeader("charset", "utf-8");
  5. response.addHeader("Pragma", "no-cache");
  6. response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("PDFName001", "UTF-8") + ".pdf");
  7. // 创建一个文档
  8. Document document = new Document();
  9. PdfWriter pdfWriter = null;
  10. try {
  11. pdfWriter = PdfWriter.getInstance(document, response.getOutputStream());
  12. } catch (DocumentException e) {
  13. e.printStackTrace();
  14. }
  15. document.open();
  16. //=====================================================================
  17. try {
  18. XMLWorkerHelper.getInstance().parseXHtml(pdfWriter, document,
  19. new ByteArrayInputStream("<h1>Hello World!</h1>".getBytes(StandardCharsets.UTF_8)), Charset.forName("UTF-8"), new PdfFont(""));
  20. } catch (IOException e) {
  21. e.printStackTrace();
  22. }
  23. document.close();
  24. }

宁静致远,天道酬勤。
书上得来终觉浅,绝知此事要躬行。