java pdf 模板多页数据导出

现在普遍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.模板导出可以留言之后会继续出文章。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值