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会自动猜测表单字段位置,如图



6) 一般生成的表单字段都不符合我们的要求,选中删除即可。建议删除自动生成的表单域,不然可能会出现无法显示(中文)内容等问题。

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


 

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" /> <!-- 优先使用此视图解析,避免先被解析为JSP -->
</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;

@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文件了。赶快试试吧~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值