SpringMVC使用PDF模板生成PDF文件

本文先叙述,如何操作PDF模板生成PDF文件,再说明在SpringMVC中如何根据PDF模板生成PDF文件。

使用PDF模板生成PDF文件需要以下几个步骤:

下面按步骤说明:

1. 使用Microsoft Office Word画好模板

此步骤就不详述了,就是一个普通的Word文件(template.docx)。给个示例截图:

2. 使用Adobe Acrobat X Pro将Word文件转换为带表单字段的PDF模板文件

1) 打开Adobe Acrobat X Pro

2) 选择“创建PDF表单”

3) 选择源:(PDF、Word、Excel或其它文件类型),下一步

4) 定位Word文件路径,下一步

5) Adobe Acrobat X Pro会自动猜测表单字段位置,如图

16181541_R76W.png


6) 一般生成的表单字段都不符合我们的要求,选中删除即可。

7) 点击右键选择文本框,拖动到适当的位置,设置好域名称,字号,字体等。

16181541_wGFg.png

8) 保存模板文件。(template.pdf)

3. 使用itext操作PDF模板,填充数据,生成PDF文件

1) 需要jar包:itext.jar、itextAsian.jar

2) 核心代码

package personal.hutao.test;import java.io.ByteArrayOutputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.util.HashMap;import java.util.Map;import org.junit.Test;import com.lowagie.text.DocumentException;import com.lowagie.text.pdf.AcroFields;import com.lowagie.text.pdf.PdfReader;import com.lowagie.text.pdf.PdfStamper;public class TestPdf {  @Test  public void test() throws IOException, DocumentException {    String fileName = "D:/template.pdf"; // pdf模板    PdfReader reader = new PdfReader(fileName);    ByteArrayOutputStream bos = new ByteArrayOutputStream();    PdfStamper ps = new PdfStamper(reader, bos);    AcroFields fields = ps.getAcroFields();    fillData(fields, data());    ps.setFormFlattening(true);    ps.close();    OutputStream fos = new FileOutputStream("D:/contract.pdf");    fos.write(bos.toByteArray());
}  public void fillData(AcroFields fields, Map<String, String> data) throws IOException, DocumentException {    for (String key : data.keySet()) {      String value = data.get(key);      fields.setField(key, value);    }  }  public Map<String, String> data() {    Map<String, String> data = new HashMap<String, String>();    data.put("borrower", "胡桃同学");    return data;  }
}

3) 打开contract.pdf,如图

至此,就实现了根据PDF模板生成PDF文件。

SpringMVC的视图中已提供了对PDF模板文件的支持:org.springframework.web.servlet.view.document.AbstractPdfStamperView。那么只需要配置好此视图就可以了。具体分为以下步骤:

1) 实现抽象类 AbstractPdfStamperView

package personal.hutao.view;import java.io.IOException;import java.util.Map;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.view.document.AbstractPdfStamperView;import com.lowagie.text.DocumentException;import com.lowagie.text.pdf.AcroFields;import com.lowagie.text.pdf.PdfStamper;public class PdfStamperView extends AbstractPdfStamperView {  public static final String DATA = "data";  public static final String FILENAME = "mergePdfFileName";  @SuppressWarnings("unchecked")  @Override  protected void mergePdfDocument(Map<String, Object> model,      PdfStamper stamper, HttpServletRequest request,      HttpServletResponse response) throws Exception {    response.setHeader("Content-Disposition", "attachment;filename=" + new String(model.get(FILENAME).toString().getBytes(), "ISO8859-1"));    AcroFields fields = stamper.getAcroFields();    fillData(fields, (Map<String, String>) model.get(DATA));    stamper.setFormFlattening(true);  }  private void fillData(AcroFields fields, Map<String, String> data)      throws IOException, DocumentException {    for (String key : data.keySet()) {      String value = data.get(key);      fields.setField(key, value);    }  }

}

2) 在SpringMVC的配置文件中配置视图

<!-- 按照BeanName解析视图 --><bean class="org.springframework.web.servlet.view.BeanNameViewResolver">  <property name="order" value="1" /></bean>  <!-- 定义Pdf模版视图 --><bean id="contract" class="personal.hutao.view.PdfStamperView">  <property name="url" value="/WEB-INF/template/template.pdf" /></bean>

3) Controller中的业务逻辑处理

package personal.hutao.controller;import static personal.hutao.view.PdfStamperView.DATA;import static personal.hutao.view.PdfStamperView.FILENAME;import java.util.HashMap;import java.util.Map;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;import com.coamctech.sample.commons.controller.BaseController;@RequestMapping("/contract")@Controllerpublic class TestController {  @RequestMapping("/export/pdf")  public String exportPersonalCreaditLoanContract(Model model) {    model.addAttribute(DATA, data());    model.addAttribute(FILENAME, "XXX贷款合同");    return "contract";  }    private Map<String, String> data() {    Map<String, String> data = new HashMap<String, String>();    data.put("borrower", "胡桃同学");    return data;  }
}


转载于:https://my.oschina.net/houwanming/blog/531044

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值