ITextPDF
<dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.10</version></dependency><!-- 输出中文 --><dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-asian</artifactId> <version>5.2.0</version></dependency><!-- pdf文件密码 --><dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.64</version></dependency>
0、Springboot
@GetMapping("/pdf/{name}")public void getPdf(HttpServletResponse response, @PathVariable("name") String name) throws FileNotFoundException { // 模板路径 String templatePath = ResourceUtils.getURL("classpath:").getPath() + "template.pdf"; // pdf 输出流 ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); FileOutputStream fileOutputStream = null; ServletOutputStream outputStream = null ; try { // 读取 pdf 模板文件 PdfReader pdfReader = new PdfReader(templatePath); //修改器 PdfStamper pdfStamper = new PdfStamper(pdfReader,byteArrayOutputStream); //中文字体,解决中文不能显示问题 BaseFont bfChinese = BaseFont.createFont("STSong-Light","UniGB-UCS2-H",BaseFont.NOT_EMBEDDED); AcroFields acroFields = pdfStamper.getAcroFields(); acroFields.setField("name",name); acroFields.setField("xuehao","123456789"); acroFields.setField("pname","设岗研究项目名称设岗研究项目名称"); // 解决字体缺少的问题 acroFields.addSubstitutionFont(bfChinese); // true代表生成的 PDF 文件不可编辑 pdfStamper.setFormFlattening(true); pdfStamper.close(); pdfReader.close(); // 输出文件路径 String outFile = System.getProperty("user.dir")+"\\report\\"+System.currentTimeMillis()+".pdf"; System.out.println(outFile); // 保存到文件 File dateDir = new File(outFile); File parentFile = dateDir.getParentFile(); if(!parentFile.exists()){ parentFile.mkdirs(); } dateDir.createNewFile(); // 保存把数据保存到文件中 fileOutputStream = new FileOutputStream(dateDir); fileOutputStream.write(byteArrayOutputStream.toByteArray()); // 写给前端 outputStream = response.getOutputStream(); outputStream.write(byteArrayOutputStream.toByteArray()); } catch (IOException | DocumentException e) { e.printStackTrace(); } finally { try { if(fileOutputStream != null){ fileOutputStream.flush(); fileOutputStream.close(); } if(outputStream != null){ outputStream.flush(); outputStream.close(); } } catch (IOException e) { e.printStackTrace(); } }}
1、根据模板填充 pdf 文件
// 模板路径String templatePath = "E:\\pdftest\\template.pdf";// 输出文件路径String outFile = "E:\\pdftest\\temp.pdf";// 读取 模板文件PdfReader pdfReader = new PdfReader(templatePath);//修改器PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(outFile));// acroFields 里面的 key 就是 pdf 的键, value 就是往里面要放的值//中文字体,解决中文不能显示问题BaseFont bfChinese = BaseFont.createFont("STSong-Light","UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);AcroFields acroFields = pdfStamper.getAcroFields();acroFields.setField("name","这是一个名字");acroFields.setField("xuehao","123456789");// 解决字体缺少的问题acroFields.addSubstitutionFont(bfChinese);//true代表生成的PDF文件不可编辑pdfStamper.setFormFlattening(true);pdfStamper.close();
2、写入字符串
// 1.新建document对象Document document = new Document(PageSize.A4);try { // 2.建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中。 // 创建 PdfWriter 对象 第一个参数是对文档对象的引用,第二个参数是文件的实际名称,在该名称中还会给出其输出路径。 PdfWriter.getInstance(document, new FileOutputStream(filename)); // 3.打开文档 document.open(); // 4.添加一个内容段落 document.addTitle("example of PDF"); document.addHeader("hander","this is a header"); document.addAuthor("au"); document.add(new Paragraph("Hello World!"));} catch (FileNotFoundException | DocumentException e) { e.printStackTrace();} finally { // 5.关闭文档 document.close();}
3、表格
//创建文件Document document = new Document();//建立一个书写器PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));//打开文件document.open();//添加内容document.add(new Paragraph("HD content here"));// 3列的表.PdfPTable table = new PdfPTable(3);table.setWidthPercentage(100); // 宽度100%填充table.setSpacingBefore(10f); // 前间距table.setSpacingAfter(10f); // 后间距List<PdfPRow> listRow = table.getRows();//设置列宽float[] columnWidths = { 1f, 2f, 3f };table.setWidths(columnWidths);//行1PdfPCell[] cells1 = new PdfPCell[3];PdfPRow row1 = new PdfPRow(cells1);//单元格cells1[0] = new PdfPCell(new Paragraph("111"));//单元格内容cells1[0].setBorderColor(BaseColor.BLUE);//边框验证cells1[0].setPaddingLeft(20);//左填充20cells1[0].setHorizontalAlignment(Element.ALIGN_CENTER);//水平居中cells1[0].setVerticalAlignment(Element.ALIGN_MIDDLE);//垂直居中cells1[1] = new PdfPCell(new Paragraph("222"));cells1[2] = new PdfPCell(new Paragraph("333"));//行2PdfPCell[] cells2 = new PdfPCell[3];PdfPRow row2 = new PdfPRow(cells2);cells2[0] = new PdfPCell(new Paragraph("444"));//把第一行添加到集合listRow.add(row1);listRow.add(row2);//把表格添加到文件中document.add(table);//关闭文档document.close();//关闭书写器writer.close();
4、图片
//创建文件Document document = new Document();//建立一个书写器PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(fileName));//打开文件document.open();//添加内容document.add(new Paragraph("HD content here"));//图片1Image image1 = Image.getInstance(img1);//设置图片位置的x轴和y轴image1.setAbsolutePosition(100f, 550f);//设置图片的宽度和高度image1.scaleAbsolute(500, 500);//将图片1添加到pdf文件中document.add(image1);// 图片2// Image image2 = Image.getInstance(new URL(""));Image image2 = Image.getInstance(img1);//将图片2添加到pdf文件中document.add(image2);//关闭文档document.close();//关闭书写器writer.close();
5、列表
//创建文件Document document = new Document();//建立一个书写器PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(fileName));//打开文件document.open();//添加内容document.add(new Paragraph("HD content here"));//添加有序列表com.itextpdf.text.List orderedList = new com.itextpdf.text.List(com.itextpdf.text.List.ORDERED);orderedList.add(new ListItem("Item one"));orderedList.add(new ListItem("Item two"));orderedList.add(new ListItem("Item three"));document.add(orderedList);//关闭文档document.close();//关闭书写器writer.close();
6、设置字体样式
//创建文件Document document = new Document();//建立一个书写器PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(fileName));//打开文件document.open();//中文字体,解决中文不能显示问题BaseFont bfChinese = BaseFont.createFont("STSong-Light","UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);//蓝色字体Font blueFont = new Font(bfChinese);blueFont.setColor(BaseColor.BLUE);//段落文本Paragraph paragraphBlue = new Paragraph("paragraphOne blue front", blueFont);document.add(paragraphBlue);//绿色字体Font greenFont = new Font(bfChinese);greenFont.setColor(BaseColor.GREEN);//创建章节Paragraph chapterTitle = new Paragraph("段落标题xxxx", greenFont);Chapter chapter1 = new Chapter(chapterTitle, 1);chapter1.setNumberDepth(0);Paragraph sectionTitle = new Paragraph("部分标题", greenFont);Section section1 = chapter1.addSection(sectionTitle);Paragraph sectionContent = new Paragraph("部分内容", blueFont);section1.add(sectionContent);//将章节添加到文章中document.add(chapter1);//关闭文档document.close();//关闭书写器writer.close();
7、修改文件
//读取pdf文件PdfReader pdfReader = new PdfReader(sourceFile);//修改器PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(outFile));Image image = Image.getInstance("E:/pdftest/test1.jpg");image.scaleAbsolute(200, 200);image.setAbsolutePosition(200, 300);for(int i=1; i<= pdfReader.getNumberOfPages(); i++) { PdfContentByte content = pdfStamper.getUnderContent(i); content.addImage(image);}pdfStamper.close();
1、根据模板填充 pdf 文件
// 创建文件Document document = new Document();PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(fileName));//用户密码,打卡文件需要密码String userPassword = "123456";//拥有者密码,编辑文件需要密码String ownerPassword = "123456";// 只读权限writer.setEncryption(userPassword.getBytes(), ownerPassword.getBytes(), PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128);// 打开文件document.open();// 添加内容document.add(new Paragraph("password !!!!"));// 关闭文档document.close();// 关闭书写器writer.close();