在springmvc中使用itext生成pdf文件

感谢此文SpringMVC使用PDF模板生成PDF文件

本文内容多多参考了胡桃的文章

1. 使用Microsoft Office Word画好模板

2. 使用Adobe Acrobat将Word文件转换为带表单字段的PDF模板文件(使用准备表单工具)

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

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

时序图


1)pom文件

<dependency>
	<groupId>com.lowagie</groupId>
	<artifactId>itext</artifactId>
	<version>2.1.7</version>
</dependency>
<dependency>
	<groupId>com.lowagie</groupId>
	<artifactId>itextasian</artifactId>
	<version>1.5.2</version>
	<scope>system</scope>
	<systemPath>F:/jar_package/itextasian-1.5.2.jar</systemPath>
</dependency>

要说明一点,AbstractPdfStamperView使用的是com.lowagie.itext,比较陈旧的版本,由于要使用中文,需要itextasian包,但是在maven仓库中是下载不到com.lowagie.itext,只有com.itextpdf包。所以要使用maven私服将其加入,否则会报错:Font 'STSongStd-Light' with 'UniGB-UCS2-H' is not recognized

2)TestController

@RequestMapping("/contract")
@Controller
public class TestController {

    @RequestMapping("/export/pdf")
    public String exportPdf(Model model){
        model.addAttribute(DATA,data());
        model.addAttribute(FILENAME,"contract");
        return "pdfStamperView";
    }

    //准备数据
    private Map<String,String> data(){
        Map<String,String> data = new HashMap<>();
        data.put("borrower","小明");
        return data;
    }
}

由于springmvc使用了auto-annotation,最好将返回值写成"pdfStamperView",否则可能会报错

app\view\PdfStamperView.class]:Invocation of init method failed; nested exception is java.lang.IllegalArgumentException:Property 'url' is required

3)springmvc xml配置文件

<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
        <property name="order" value="1"></property>
</bean>

<bean id="pdfStamperView" class="com.hfi.itextDemoSpringmvc.view.PdfStamperView">
	<property name="url" value="/WEB-INF/template/template.pdf"></property>
</bean>

<!--<!– jsp视图视图解析器 –>-->
<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
	<property name="prefix" value="/WEB-INF/jsp/"/>
	<property name="suffix" value=".jsp"/>
</bean>
4)PdfStamperView
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(); 
        //在这个地方可以使用itext api设置填充单元格文本的格式

        //填充pdf模板
        fillData(fields, (Map<String, String>) model.get(DATA));  
        stamper.setFormFlattening(true);  
stamper.close();
    }  
  
    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);  
        }  
    }  
  
}

查看AbstractPdfStamperView的代码,可以看到其内部已经使用了PdfReader读取了xml配置文件中的pdf模板。

 

通过以上步骤就实现了通过SpringMVC加载PDF模板来导出PDF文件的需求

总结:

注意两点:

1. itextasian包的使用

2. 由于springmvc使用了auto-annotation,最好将返回值写成"pdfStamperView",否则可能会报错

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值