SpringMVC使用PDF模板生成PDF文件
2015-11-16 18:15
106 查看
本文先叙述,如何操作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) 核心代码
3) 打开contract.pdf,如图
至此,就实现了根据PDF模板生成PDF文件。
SpringMVC的视图中已提供了对PDF模板文件的支持:org.springframework.web.servlet.view.document.AbstractPdfStamperView。那么只需要配置好此视图就可以了。具体分为以下步骤:
1) 实现抽象类 AbstractPdfStamperView
2) 在SpringMVC的配置文件中配置视图
3) Controller中的业务逻辑处理
使用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" /></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; } }
相关文章推荐
- Eclipse使用学习指南
- Java中的Volatile 变量
- Java的 transient关键字
- 线程池的应用(缓存的处理思想)
- 使用NetBeans EJB 创建企业应用程序
- Java线程学习笔记(十)CountDownLatch 和CyclicBarrier
- 关于java.lang.UnsatisfiedLinkError: Native method not found: com.ishow.scan.zbar.ZbarManager.decode:([
- myeclipse里为什么把所需的jar包拷到web-inf的lib下,java类里就报错了?
- 框架进阶笔记
- 使用Java代码进行因数分解和求最小公倍数的示例
- Spring声明式事务管理(XML与注解方式)
- NetBeans IDE Java 快速入门教程
- JENKINS里,如何为SLAVE配置多个不同的JAVA环境?
- 分享我的大型Java多用户商城系统开发的心得和困难
- 0602 播客框架分析
- JavaWeb学习总结(一)——JavaWeb开发入门
- Spring依赖注入
- Java中的静态编译和动态编译
- 从”JAVA“而终 25:Servlet讲解
- Java 内存结构备忘录