文档章节

SpringMVC使用PDF模板生成PDF文件

胡桃同学
 胡桃同学
发布于 2016/12/12 10:08
字数 759
阅读 71
收藏 1
点赞 0
评论 0

搬家:http://ojeta.iteye.com/blog/2111727


本文先叙述,如何操作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会自动猜测表单字段位置,如图
    输入图片说明
  6. 一般生成的表单字段都不符合我们的要求,选中删除即可。建议删除自动生成的表单域,不然可能会出现无法显示(中文)内容等问题。
  7. 点击右键选择文本框,拖动到适当的位置,设置好域名称,字号,字体等。
    输入图片说明
  8. 保存模板文件。(template.pdf)
    3. 使用itext操作PDF模板,填充数据,生成PDF文件
  9. 需要jar包:itext.jar、itextAsian.jar
  10. 核心代码:
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;  
    }  
}
  1. 打开contract.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);  
        }  
    }  
  
}
  1. 在SpringMVC的配置文件中配置视图
<!-- 按照BeanName解析视图 -->  
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">  
    <property name="order" value="1" /> <!-- 优先使用此视图解析,避免先被解析为JSP -->  
</bean>  
      
<!-- 定义Pdf模版视图 -->  
<bean id="contract" class="personal.hutao.view.PdfStamperView">  
    <property name="url" value="/WEB-INF/template/template.pdf" />  
</bean>  
  1. 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;  
  
@RequestMapping("/contract")  
@Controller  
public class TestController {  
  
    @RequestMapping("/export/pdf")  
    public String exportPdf(Model model) {  
        model.addAttribute(DATA, data());  
        model.addAttribute(FILENAME, "XXX贷款合同");  
        return "contract"; // 与personal.hutao.view.PdfStamperView的bean id匹配  
    }  
      
    private Map<String, String> data() {  
        Map<String, String> data = new HashMap<String, String>();  
        data.put("borrower", "胡桃同学");  
        return data;  
    }  
}

OK,这样就可以通过SpringMVC加载PDF模板来导出PDF文件了。赶快试试吧~

© 著作权归作者所有

共有 人打赏支持
胡桃同学
粉丝 2
博文 8
码字总数 41989
作品 0
朝阳
技术主管

暂无相关文章

从 Confluence 5.3 及其早期版本中恢复空间

如果你需要从 Confluence 5.3 及其早期版本中的导出文件恢复到晚于 Confluence 5.3 的 Confluence 中的话。你可以使用临时的 Confluence 空间安装,然后将这个 Confluence 安装实例升级到你现...

honeymose ⋅ 18分钟前 ⋅ 0

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 今天 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 今天 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 今天 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 今天 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

Spring boot 项目打包及引入本地jar包

Spring Boot 项目打包以及引入本地Jar包 [TOC] 上篇文章提到 Maven 项目添加本地jar包的三种方式 ,本篇文章记录下在实际项目中的应用。 spring boot 打包方式 我们知道,传统应用可以将程序...

Os_yxguang ⋅ 昨天 ⋅ 0

常见数据结构(二)-树(二叉树,红黑树,B树)

本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides 相关命题的证明可参考《算法(第...

浮躁的码农 ⋅ 昨天 ⋅ 0

android -------- 混淆打包报错 (warning - InnerClass ...)

最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations are missing corresponding EnclosingMember annotation......

切切歆语 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部