java实现在pdf文档上填充内容

news/2024/7/3 17:45:01

需求:

在合同附件模板上填充内容,生成一个新的合同附件,并可以查看合同附件

思路:

首先在模板文档上设置文本域,根据文本域填充内容,使用itextpdf在pdf上填充内容

1.在pom.xml中加入以下依赖:

<dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.1</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>

2.在application.properties中配置文件模板路径和文件保存路径

conf.uploadContractAttachTemplatePath=D:\\wkgbErp\\upload\\ContractTemplatePath\\\u9644\u4EF6\u4E00 \u623F\u5C4B\u53CA\u79DF\u8D41\u4FE1\u606F\u8868.pdf
conf.saveUploadContractAttachPath=D:\\wkgbErp\\upload\\ContractTemplatePath\\contractAttach\\

3.创建一个service接口:

/**
   * 生成合同附件
   */
  @Override
  public ErrorObject generateContractAttach(String contractId) {
    ErrorObject error = new ErrorObject();
    PdfReader reader;
    FileOutputStream out;
    ByteArrayOutputStream bos;
    PdfStamper stamper;
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    if (StringUtils.isNotBlank(contractId)) {
      TblContractPre entity = tblContractPreRepository.findByDeedsn(contractId);
      TblIdentify identify = identifyService.findByUid(entity.getUid());
      String fileName = contractId + ".pdf";
      String newPDFPath = saveUploadContractAttachPath + fileName;
      try {
        out = new FileOutputStream(newPDFPath);
        reader = new PdfReader(uploadContractAttachTemplatePath);// 读取pdf模板
        bos = new ByteArrayOutputStream();
        stamper = new PdfStamper(reader, bos);
        AcroFields form = stamper.getAcroFields();
        // java.util.Iterator<String> it = form.getFields().keySet().iterator();
        // while (it.hasNext()) {
        // String name = it.next().toString();
        // // 填写内容部分
        // form.setField(name, identify.getName());
        // }
        // BaseFont.createFont("STSongStd-Light", "UTF-8", false);
        form.setField("liveName", identify.getName());// 租客姓名
        if (entity.getDeedsnStart() != null) {
          form.setField("deedsnStart", dateFormat.format(entity.getDeedsnStart()));// 合同开始时间
        }
        if (entity.getDeedsnEnd() != null) {
          form.setField("deedsnEnd", dateFormat.format(entity.getDeedsnEnd()));// 合同结束时间
        }
        if (entity.getMonthNum() != null) {// 支付方式
          if (entity.getMonthNum() == 1) {
            form.setField("monthNum", "押二     月付");
          }
          if (entity.getMonthNum() == 3) {
            form.setField("monthNum", "押二     季付");
          }
          if (entity.getMonthNum() == 6) {
            form.setField("monthNum", "押二     半年付");
          }
          if (entity.getMonthNum() == 12) {
            form.setField("monthNum", "押二     年付");
          }
        }
        form.setField("roomsn", entity.getRoomsn());// 房源编号
        if (entity.getRental() != null) {
          form.setField("rental", entity.getRental().toString());// 租金
          BigDecimal rental = entity.getRental();
          BigDecimal deposit = rental.multiply(new BigDecimal(2));// 押金=租金*2
          BigDecimal total = rental.multiply(new BigDecimal(12));// 总计
          form.setField("total", total + "元");// 总计
          form.setField("deposit", deposit.toString()); // 押金
        }
        form.setField("houseAddress", entity.getHouseName().replace(";", ""));// 产权地址
        if (entity.getBuildArea() != null) {
          form.setField("buildArea", entity.getBuildArea() + "平米");// 面积
        }

        // 填充租金支付明细
        if (entity.getDeedsnStart() != null) {
          Calendar calendar = Calendar.getInstance();
          calendar.setTime(entity.getDeedsnStart());
          calendar.add(Calendar.DATE, -1);
          Date date = calendar.getTime();
          form.setField("deedsnStart1", dateFormat.format(entity.getDeedsnStart()));
          form.setField("deedsnTime1", dateFormat.format(entity.getDeedsnStart()) + " / " + DateUtil.AddMonth(date, 1));

          form.setField("deedsnStart2", DateUtil.AddMonth(entity.getDeedsnStart(), 1));
          form.setField("deedsnTime2",
              DateUtil.AddMonth(entity.getDeedsnStart(), 1) + " /  " + DateUtil.AddMonth(date, 2));

          form.setField("deedsnStart3", DateUtil.AddMonth(entity.getDeedsnStart(), 2));
          form.setField("deedsnTime3",
              DateUtil.AddMonth(entity.getDeedsnStart(), 2) + " / " + DateUtil.AddMonth(date, 3));

          form.setField("deedsnStart4", DateUtil.AddMonth(entity.getDeedsnStart(), 3));
          form.setField("deedsnTime4",
              DateUtil.AddMonth(entity.getDeedsnStart(), 3) + " / " + DateUtil.AddMonth(date, 4));

          form.setField("deedsnStart5", DateUtil.AddMonth(entity.getDeedsnStart(), 4));
          form.setField("deedsnTime5",
              DateUtil.AddMonth(entity.getDeedsnStart(), 4) + " / " + DateUtil.AddMonth(date, 5));

          form.setField("deedsnStart6", DateUtil.AddMonth(entity.getDeedsnStart(), 5));
          form.setField("deedsnTime6",
              DateUtil.AddMonth(entity.getDeedsnStart(), 5) + " / " + DateUtil.AddMonth(date, 6));

          form.setField("deedsnStart7", DateUtil.AddMonth(entity.getDeedsnStart(), 6));
          form.setField("deedsnTime7",
              DateUtil.AddMonth(entity.getDeedsnStart(), 6) + " / " + DateUtil.AddMonth(date, 7));

          form.setField("deedsnStart8", DateUtil.AddMonth(entity.getDeedsnStart(), 7));
          form.setField("deedsnTime8",
              DateUtil.AddMonth(entity.getDeedsnStart(), 7) + " / " + DateUtil.AddMonth(date, 8));

          form.setField("deedsnStart9", DateUtil.AddMonth(entity.getDeedsnStart(), 8));
          form.setField("deedsnTime9",
              DateUtil.AddMonth(entity.getDeedsnStart(), 8) + " / " + DateUtil.AddMonth(date, 9));

          form.setField("deedsnStart10", DateUtil.AddMonth(entity.getDeedsnStart(), 9));
          form.setField("deedsnTime10",
              DateUtil.AddMonth(entity.getDeedsnStart(), 9) + " / " + DateUtil.AddMonth(date, 10));

          form.setField("deedsnStart11", DateUtil.AddMonth(entity.getDeedsnStart(), 10));
          form.setField("deedsnTime11",
              DateUtil.AddMonth(entity.getDeedsnStart(), 10) + " / " + DateUtil.AddMonth(date, 11));

          form.setField("deedsnStart12", DateUtil.AddMonth(entity.getDeedsnStart(), 11));
          form.setField("deedsnTime12",
              DateUtil.AddMonth(entity.getDeedsnStart(), 11) + " / " + DateUtil.AddMonth(date, 12));
        }

        if (entity.getSignType() != null) {
          if (entity.getSignType() == 0) {
            form.setField("signType1", "true");// 首次签约复选框选中
          }
          if (entity.getSignType() == 1) {
            form.setField("signType2", "true");
          }
        }
        if (entity.getDepositeType() != null) {
          if (entity.getDepositeType() == 0) {
            form.setField("d1", "true");// 首次签约押金复选框选中
          }
          if (entity.getDepositeType() == 1) {
            form.setField("d2", "true");// 首次签约押金复选框选中
          }
        }
        form.setField("c1", "true");// 身份证复选框选中

        if (identify.getSex() != null) {
          if (identify.getSex() == 0) {// 性别
            form.setField("sex", "女");
          }
          if (identify.getSex() == 1) {
            form.setField("sex", "男");
          }
        }
        if (identify.getAge() != null) {
          form.setField("age", identify.getAge().toString());// 年龄
        }
        form.setField("phone", identify.getPhoneNum());// 联系电话
        form.setField("email", entity.getEmail());
        if (StringUtils.isNotBlank(entity.getEmergencyName())) {// 紧急联系人
          form.setField("emergencyName", entity.getEmergencyName());
        }
        if (StringUtils.isNotBlank(entity.getEmergencyPhone())) {// 紧急联系人电话
          form.setField("emergencyPhone", entity.getEmergencyPhone());
        }
        form.setField("certificateNum", identify.getCertificateNum());// 身份证号码
        if (StringUtils.isNotBlank(entity.getCompanyAddr())) {
          form.setField("companyAddr", entity.getCompanyAddr());// 租客通讯地址
        }
        stamper.setFormFlattening(true);// 如果为false那么生成的PDF文件还能编辑,一定要设为true
        stamper.close();
        // Document doc = new Document();
        // PdfCopy copy = new PdfCopy(doc, out);
        // doc.open();
        // PdfImportedPage importPage = copy.getImportedPage(new
        // PdfReader(bos.toByteArray()), 1);
        // copy.addPage(importPage);
        // doc.close();
        out.write(bos.toByteArray());
        out.flush();
        out.close();
        bos.close();
      } catch (FileNotFoundException e1) {
        log.error("{}", e1);
      } catch (IOException e2) {
        log.error("{}", e2);
      } catch (DocumentException e3) {
        log.error("{}", e3);
      }
      // 保存附件文件名
      entity.setFileName(fileName);
      // tblContractPreRepository.save(entity);
      save(entity);
    }
    return error;
  }

4.单元测试

package com.szwoku.gbwk.web.service;

import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import cn.wkgb.AppConfiguration;
import cn.wkgb.api.service.TblContractPreService;
import cn.wkgb.common.framework.dto.ErrorObject;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest(classes = AppConfiguration.class)
public class TblContractPreServiceTest {

  @Resource
  private TblContractPreService tblContractPreService;

  @Test
  public void testGenerateContractAttach() {
    ErrorObject error = tblContractPreService.generateContractAttach("PRE-HA180900079");
    log.warn("error= {}", error);
  }
}

5.查看合同接口

/**
   * 查看合同附件
   * 
   * @param fileName
   * @param request
   * @param response
   * @throws Exception
   */
  @RequestMapping(value = { "/viewPdf/{fileName:.+}" })
  public ErrorObject viewPdf(@PathVariable String fileName, final HttpServletResponse request,
      final HttpServletResponse response) throws Exception {
    ErrorObject error = new ErrorObject();
    String ext = StringUtils.substringAfterLast(fileName, ".");
    String path = saveUploadContractAttachPath + fileName;
    logger.debug(path);
    File file = new File(path);
    if (!file.exists()) {
      return error;
    }
    response.reset(); // 非常重要
    if ("pdf".equalsIgnoreCase(ext)) {
      response.setContentType(PDF);
    }
    OutputStream out = response.getOutputStream();
    IOUtils.write(FileUtils.readFileToByteArray(file), out);
    return error;
  }

6.页面

<input type="hidden" value="PRE-HA180900079.pdf" id="contract-btn-attach">
                <a οnclick="sing_view_attach()" class="btn btn-warning radius ml-20 mr-20">查看合同附件</a>

function sing_view_attach(){
    var href=$("#contract-btn-attach").val();
      console.log(href);
      var url= '/api/upload/viewPdf/'+href;
      console.log(url);
      if(href ==''|| href == null){
          alert2('该在线合同附件链接不存在');
      }else{
          var index = layer.open({
                type : 2,
                title : '合同附件查看',
                content : url,
                area : ['90%', '90%'],
                shadeClose : false,
                shade : 0.8,
                cancel : function() {

                }
              });
      }
      
}

难点:

在让复选框选中的时候,既要设置文本域的name相同,还要让它的值为true

 


http://lihuaxi.xjx100.cn/news/244648.html

相关文章

QTP连接oracle

2019独角兽企业重金招聘Python工程师标准>>> 首先&#xff0c;因为群里很多朋友说QTP连接oracle有点麻烦&#xff0c;我针对于连接oracle做一个完整的教程&#xff0c;希望需要学习的朋友都可以来看一下&#xff1b;具体方法如下&#xff1a; 1、无论是什么语言&am…

Python中is同一性运算符和==相等运算符区别

2019独角兽企业重金招聘Python工程师标准>>> 在区分is和这两种运算符区别之前&#xff0c;需要知道Python中对象包含的三个基本要素&#xff0c;分别是&#xff1a;id(身份标识)、type(数据类型)和value(值)。 比较对象的value(值) 是python标准操作符中的比较操作符…

一个好用 的API 管理工具

大家好&#xff0c;我是磊哥 今天发现了一款国产化的接口测试工具&#xff0c;看它官网中的中文页面&#xff0c;倍感心切&#xff0c;很干净&#xff0c;深度解决了postman 和 swagger 的95%痛点。 这个国产软件就是Eolink&#xff0c;结合了 API 设计、文档管理、自动化测试…

CSS3 @keyframes animate

2019独角兽企业重金招聘Python工程师标准>>> 1.keyframes定义和用法 通过 keyframes 规则&#xff0c;您能够创建动画。 创建动画的原理是&#xff0c;将一套 CSS 样式逐渐变化为另一套样式。 在动画过程中&#xff0c;您能够多次改变这套 CSS 样式。 以百分比来…

页面日期格式化

1.引用<script type"text/javascript" src"/js/xdate.js?version0.001"></script> 2.在页面加载的时候格式化 Date.prototype.Format function (fmt) { var o { "M": this.getMonth() 1, //月份 …

GDB 调试 Mysql 实战(二)GDB 调试打印

背景 在 https://mengkang.net/1328.html 实验中&#xff0c;我们通过optimizer_trace发现group by会使用intermediate_tmp_table&#xff0c;而且里面的的row_length是20&#xff0c;抱着"打破砂锅问到底"的求学精神&#xff0c;所以想通过 gdb 调试源码的方式看这个…

联调这夜,我把同事打了...

体验地址&#xff1a; https://www.eolink.com/?utm\_sourcew2507

在列表显示某个内容,但数据表没有这个字段

1.需求&#xff1a;在出房合同编辑页面添加业务类型内容显示 思路&#xff1a;根据房源编号查询公司房源信息表&#xff0c;获取业务类型&#xff0c;再设置进去 查询性能比较&#xff1a; 1&#xff09; for (HbContractOut entity : page.getContent()) { // 根据房源编号…