ITextPDF

  • POM
  1. <dependency>
  2. <groupId>com.itextpdf</groupId>
  3. <artifactId>itextpdf</artifactId>
  4. <version>5.5.10</version>
  5. </dependency>
  6. <!-- 输出中文 -->
  7. <dependency>
  8. <groupId>com.itextpdf</groupId>
  9. <artifactId>itext-asian</artifactId>
  10. <version>5.2.0</version>
  11. </dependency>
  12. <!-- pdf文件密码 -->
  13. <dependency>
  14. <groupId>org.bouncycastle</groupId>
  15. <artifactId>bcprov-jdk15on</artifactId>
  16. <version>1.64</version>
  17. </dependency>

0、Springboot

  1. @GetMapping("/pdf/{name}")
  2. public void getPdf(HttpServletResponse response, @PathVariable("name") String name) throws FileNotFoundException {
  3. // 模板路径
  4. String templatePath = ResourceUtils.getURL("classpath:").getPath() + "template.pdf";
  5. // pdf 输出流
  6. ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
  7. FileOutputStream fileOutputStream = null;
  8. ServletOutputStream outputStream = null ;
  9. try {
  10. // 读取 pdf 模板文件
  11. PdfReader pdfReader = new PdfReader(templatePath);
  12. //修改器
  13. PdfStamper pdfStamper = new PdfStamper(pdfReader,byteArrayOutputStream);
  14. //中文字体,解决中文不能显示问题
  15. BaseFont bfChinese = BaseFont.createFont("STSong-Light","UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
  16. AcroFields acroFields = pdfStamper.getAcroFields();
  17. acroFields.setField("name",name);
  18. acroFields.setField("xuehao","123456789");
  19. acroFields.setField("pname","设岗研究项目名称设岗研究项目名称");
  20. // 解决字体缺少的问题
  21. acroFields.addSubstitutionFont(bfChinese);
  22. // true代表生成的 PDF 文件不可编辑
  23. pdfStamper.setFormFlattening(true);
  24. pdfStamper.close();
  25. pdfReader.close();
  26. // 输出文件路径
  27. String outFile = System.getProperty("user.dir")+"\\report\\"+System.currentTimeMillis()+".pdf";
  28. System.out.println(outFile);
  29. // 保存到文件
  30. File dateDir = new File(outFile);
  31. File parentFile = dateDir.getParentFile();
  32. if(!parentFile.exists()){
  33. parentFile.mkdirs();
  34. }
  35. dateDir.createNewFile();
  36. // 保存把数据保存到文件中
  37. fileOutputStream = new FileOutputStream(dateDir);
  38. fileOutputStream.write(byteArrayOutputStream.toByteArray());
  39. // 写给前端
  40. outputStream = response.getOutputStream();
  41. outputStream.write(byteArrayOutputStream.toByteArray());
  42. } catch (IOException | DocumentException e) {
  43. e.printStackTrace();
  44. } finally {
  45. try {
  46. if(fileOutputStream != null){
  47. fileOutputStream.flush();
  48. fileOutputStream.close();
  49. }
  50. if(outputStream != null){
  51. outputStream.flush();
  52. outputStream.close();
  53. }
  54. } catch (IOException e) {
  55. e.printStackTrace();
  56. }
  57. }
  58. }

1、根据模板填充 pdf 文件

  1. // 模板路径
  2. String templatePath = "E:\\pdftest\\template.pdf";
  3. // 输出文件路径
  4. String outFile = "E:\\pdftest\\temp.pdf";
  5. // 读取 模板文件
  6. PdfReader pdfReader = new PdfReader(templatePath);
  7. //修改器
  8. PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(outFile));
  9. // acroFields 里面的 key 就是 pdf 的键, value 就是往里面要放的值
  10. //中文字体,解决中文不能显示问题
  11. BaseFont bfChinese = BaseFont.createFont("STSong-Light","UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
  12. AcroFields acroFields = pdfStamper.getAcroFields();
  13. acroFields.setField("name","这是一个名字");
  14. acroFields.setField("xuehao","123456789");
  15. // 解决字体缺少的问题
  16. acroFields.addSubstitutionFont(bfChinese);
  17. //true代表生成的PDF文件不可编辑
  18. pdfStamper.setFormFlattening(true);
  19. pdfStamper.close();

2、写入字符串

  1. // 1.新建document对象
  2. Document document = new Document(PageSize.A4);
  3. try {
  4. // 2.建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中。
  5. // 创建 PdfWriter 对象 第一个参数是对文档对象的引用,第二个参数是文件的实际名称,在该名称中还会给出其输出路径。
  6. PdfWriter.getInstance(document, new FileOutputStream(filename));
  7. // 3.打开文档
  8. document.open();
  9. // 4.添加一个内容段落
  10. document.addTitle("example of PDF");
  11. document.addHeader("hander","this is a header");
  12. document.addAuthor("au");
  13. document.add(new Paragraph("Hello World!"));
  14. } catch (FileNotFoundException | DocumentException e) {
  15. e.printStackTrace();
  16. } finally {
  17. // 5.关闭文档
  18. document.close();
  19. }

3、表格

  1. //创建文件
  2. Document document = new Document();
  3. //建立一个书写器
  4. PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));
  5. //打开文件
  6. document.open();
  7. //添加内容
  8. document.add(new Paragraph("HD content here"));
  9. // 3列的表.
  10. PdfPTable table = new PdfPTable(3);
  11. table.setWidthPercentage(100); // 宽度100%填充
  12. table.setSpacingBefore(10f); // 前间距
  13. table.setSpacingAfter(10f); // 后间距
  14. List<PdfPRow> listRow = table.getRows();
  15. //设置列宽
  16. float[] columnWidths = { 1f, 2f, 3f };
  17. table.setWidths(columnWidths);
  18. //行1
  19. PdfPCell[] cells1 = new PdfPCell[3];
  20. PdfPRow row1 = new PdfPRow(cells1);
  21. //单元格
  22. cells1[0] = new PdfPCell(new Paragraph("111"));//单元格内容
  23. cells1[0].setBorderColor(BaseColor.BLUE);//边框验证
  24. cells1[0].setPaddingLeft(20);//左填充20
  25. cells1[0].setHorizontalAlignment(Element.ALIGN_CENTER);//水平居中
  26. cells1[0].setVerticalAlignment(Element.ALIGN_MIDDLE);//垂直居中
  27. cells1[1] = new PdfPCell(new Paragraph("222"));
  28. cells1[2] = new PdfPCell(new Paragraph("333"));
  29. //行2
  30. PdfPCell[] cells2 = new PdfPCell[3];
  31. PdfPRow row2 = new PdfPRow(cells2);
  32. cells2[0] = new PdfPCell(new Paragraph("444"));
  33. //把第一行添加到集合
  34. listRow.add(row1);
  35. listRow.add(row2);
  36. //把表格添加到文件中
  37. document.add(table);
  38. //关闭文档
  39. document.close();
  40. //关闭书写器
  41. writer.close();

4、图片

  1. //创建文件
  2. Document document = new Document();
  3. //建立一个书写器
  4. PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(fileName));
  5. //打开文件
  6. document.open();
  7. //添加内容
  8. document.add(new Paragraph("HD content here"));
  9. //图片1
  10. Image image1 = Image.getInstance(img1);
  11. //设置图片位置的x轴和y轴
  12. image1.setAbsolutePosition(100f, 550f);
  13. //设置图片的宽度和高度
  14. image1.scaleAbsolute(500, 500);
  15. //将图片1添加到pdf文件中
  16. document.add(image1);
  17. // 图片2
  18. // Image image2 = Image.getInstance(new URL(""));
  19. Image image2 = Image.getInstance(img1);
  20. //将图片2添加到pdf文件中
  21. document.add(image2);
  22. //关闭文档
  23. document.close();
  24. //关闭书写器
  25. writer.close();

5、列表

  1. //创建文件
  2. Document document = new Document();
  3. //建立一个书写器
  4. PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(fileName));
  5. //打开文件
  6. document.open();
  7. //添加内容
  8. document.add(new Paragraph("HD content here"));
  9. //添加有序列表
  10. com.itextpdf.text.List orderedList = new com.itextpdf.text.List(com.itextpdf.text.List.ORDERED);
  11. orderedList.add(new ListItem("Item one"));
  12. orderedList.add(new ListItem("Item two"));
  13. orderedList.add(new ListItem("Item three"));
  14. document.add(orderedList);
  15. //关闭文档
  16. document.close();
  17. //关闭书写器
  18. writer.close();

6、设置字体样式

  1. //创建文件
  2. Document document = new Document();
  3. //建立一个书写器
  4. PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(fileName));
  5. //打开文件
  6. document.open();
  7. //中文字体,解决中文不能显示问题
  8. BaseFont bfChinese = BaseFont.createFont("STSong-Light","UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
  9. //蓝色字体
  10. Font blueFont = new Font(bfChinese);
  11. blueFont.setColor(BaseColor.BLUE);
  12. //段落文本
  13. Paragraph paragraphBlue = new Paragraph("paragraphOne blue front", blueFont);
  14. document.add(paragraphBlue);
  15. //绿色字体
  16. Font greenFont = new Font(bfChinese);
  17. greenFont.setColor(BaseColor.GREEN);
  18. //创建章节
  19. Paragraph chapterTitle = new Paragraph("段落标题xxxx", greenFont);
  20. Chapter chapter1 = new Chapter(chapterTitle, 1);
  21. chapter1.setNumberDepth(0);
  22. Paragraph sectionTitle = new Paragraph("部分标题", greenFont);
  23. Section section1 = chapter1.addSection(sectionTitle);
  24. Paragraph sectionContent = new Paragraph("部分内容", blueFont);
  25. section1.add(sectionContent);
  26. //将章节添加到文章中
  27. document.add(chapter1);
  28. //关闭文档
  29. document.close();
  30. //关闭书写器
  31. writer.close();

7、修改文件

  1. //读取pdf文件
  2. PdfReader pdfReader = new PdfReader(sourceFile);
  3. //修改器
  4. PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(outFile));
  5. Image image = Image.getInstance("E:/pdftest/test1.jpg");
  6. image.scaleAbsolute(200, 200);
  7. image.setAbsolutePosition(200, 300);
  8. for(int i=1; i<= pdfReader.getNumberOfPages(); i++) {
  9. PdfContentByte content = pdfStamper.getUnderContent(i);
  10. content.addImage(image);
  11. }
  12. pdfStamper.close();

1、根据模板填充 pdf 文件

  1. // 创建文件
  2. Document document = new Document();
  3. PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(fileName));
  4. //用户密码,打卡文件需要密码
  5. String userPassword = "123456";
  6. //拥有者密码,编辑文件需要密码
  7. String ownerPassword = "123456";
  8. // 只读权限
  9. writer.setEncryption(userPassword.getBytes(), ownerPassword.getBytes(), PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128);
  10. // 打开文件
  11. document.open();
  12. // 添加内容
  13. document.add(new Paragraph("password !!!!"));
  14. // 关闭文档
  15. document.close();
  16. // 关闭书写器
  17. writer.close();