现在普遍java PDF 导出就是2种形式
1.模板导出
提前在windows下编辑好模板,并且配好表单(因为不是重点这部分自行百度)
2.在java中编写pdf
在使用java代码编写模板和灌数据,样式等都需要自己维护需要相当的技术
1.简单但是不能多页,2.复杂但是可以多页
现在想结合2者的优点,大概的原理是使用2方法创建空白的一页DOC在基础上写入方法1完成好的文件流,第二页,第三页同理
直接贴代码(注意基础要会“1.模板导出”才能更好的理解)
BaseFont bf = BaseFont.createFont( "D:\\project11\\sf_jgpt\\src\\main\\resources\\static\\simsun.ttc"+ ",1", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); List<PdfReader> list = new ArrayList<PdfReader>(); //模拟数据 Map<String,List<PdfField>> map = new HashMap<>(); List<PdfField> listField1 = new ArrayList<PdfField>(); listField1.add(new PdfField("area_org_name", "demo1", "txt")); listField1.add(new PdfField("title", "demo1一号", "txt")); List<PdfField> listField2 = new ArrayList<PdfField>(); listField2.add(new PdfField("area_org_name", "demo2", "txt")); listField2.add(new PdfField("title", "demo2一号", "txt")); map.put("01",listField1); map.put("02",listField2); //绑定数据 for(Map.Entry<String,List<PdfField>> entry:map.entrySet()) { List<PdfField> listField = entry.getValue(); // 读取pdf模板 String path = GetResource.class.getClassLoader().getResource("/static/templates/demo1.pdf").getPath(); PdfReader reader = new PdfReader(path); ByteArrayOutputStream bos = new ByteArrayOutputStream(); PdfStamper stamper = new PdfStamper(reader, bos); AcroFields form = stamper.getAcroFields(); // 添加所创建的字体 form.addSubstitutionFont(bf); for (int i = 0; i < listField.size(); i++) { if(listField.get(i).getType().equals("txt")){ form.setField(listField.get(i).getKey(),listField.get(i).getValue()); } if(listField.get(i).getType().equals("qrcode")){ form.setField(listField.get(i).getKey(),listField.get(i).getValue()); //获取位置(左上右下) AcroFields.FieldPosition fieldPosition = form.getFieldPositions(listField.get(i).getKey()).get(0); //绘制二维码 float width = fieldPosition.position.getRight() - fieldPosition.position.getLeft(); BarcodeQRCode pdf417 = new BarcodeQRCode(listField.get(i).getValue(), (int) width, (int) width, null); //生成二维码图像 Image image128 = pdf417.getImage(); image128.scaleAbsolute(fieldPosition.position.getWidth(), fieldPosition.position.getHeight()); //绘制在第一页 PdfContentByte cb = stamper.getOverContent(1); //左边距(居中处理) float marginLeft = (fieldPosition.position.getRight() - fieldPosition.position.getLeft() - image128.getWidth()) / 2; //条码位置 image128.setAbsolutePosition(fieldPosition.position.getLeft() + marginLeft, fieldPosition.position.getBottom()); //加入条码 cb.addImage(image128); } if(listField.get(i).getType().equals("barcode")){ //获取位置(左上右下) AcroFields.FieldPosition fieldPosition = form.getFieldPositions(listField.get(i).getKey()).get(0); //绘制条码 Barcode128 barcode128 = new Barcode128(); //字号 barcode128.setSize(10); //条码高度 barcode128.setBarHeight(35); //条码与数字间距 barcode128.setBaseline(10); //条码值 barcode128.setCode(listField.get(i).getValue()); barcode128.setStartStopText(false); barcode128.setExtended(true); //绘制在第一页 PdfContentByte cb = stamper.getOverContent(1); //生成条码图片 Image image128 = barcode128.createImageWithBarcode(cb, null, null); //左边距(居中处理) float marginLeft = (fieldPosition.position.getRight() - fieldPosition.position.getLeft() - image128.getWidth()) / 2; //条码位置 image128.setAbsolutePosition(fieldPosition.position.getLeft() + marginLeft, fieldPosition.position.getBottom()); //加入条码 cb.addImage(image128); } if(listField.get(i).getType().equals("image")){ int pageNo = form.getFieldPositions(listField.get(i).getKey()).get(0).page; Rectangle signRect = form.getFieldPositions(listField.get(i).getKey()).get(0).position; float x = signRect.getLeft(); float y = signRect.getBottom(); File file = new File(listField.get(i).getValue()); //根据路径读取图片 if (file.exists()) { Image image = Image.getInstance(listField.get(i).getValue()); //获取图片页面 PdfContentByte under = stamper.getOverContent(pageNo); //图片大小自适应 image.scaleToFit(signRect.getWidth(), signRect.getHeight()); //添加图片 image.setAbsolutePosition(x, y); under.addImage(image); } } if(listField.get(i).getType().equals("bool")){ form.setField(listField.get(i).getKey(), listField.get(i).getValue(), "Yes".equals(listField.get(i).getValue())); } } stamper.setFormFlattening(true); stamper.close(); PdfReader pdfReader = new PdfReader(bos.toByteArray()); list.add(pdfReader); } Document document = new Document(); PdfCopy copy = new PdfCopy(document, response.getOutputStream()); document.open(); for (int i = 0; i < list.size(); i++) { copy.addDocument(list.get(i)); } copy.close();
代码段返回的是response输出流,可以直接在Controller使用,也可以自己进行封装,不会1.模板导出可以留言之后会继续出文章。