Itext读取PDF模板文件渲染数据后创建新文件
Maven导入依赖
<properties>
<itextpdf.version>5.5.0</itextpdf.version>
<itext-asian.version>5.2.0</itext-asian.version>
</properties> <!-- pdf-->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>${itextpdf.version}</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>${itext-asian.version}</version>
</dependency>
Java代码
package net.efton.service.utils; import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map; import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfCopy;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper; public class PDFBuilder {
public static void fillTemplate(Map<String, Object> dataMap) {// 利用模板生成pdf
// 模板路径
String templatePath = dataMap.get("templatePath").toString();
// 生成的新文件路径
String newPDFPath = dataMap.get("newPDFPath").toString();
PdfReader reader;
FileOutputStream out;
ByteArrayOutputStream bos;
PdfStamper stamper;
try {
out = new FileOutputStream(newPDFPath);// 输出流
reader = new PdfReader(templatePath);// 读取pdf模板
bos = new ByteArrayOutputStream();
stamper = new PdfStamper(reader, bos); // 创建字体显示中文
BaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
//查询出模板文件的表单域
AcroFields form = stamper.getAcroFields();
Iterator<String> it = form.getFields().keySet().iterator();
while (it.hasNext()) {
String name = it.next().toString();
if(!"signature_confirm".equals(name)){
form.setFieldProperty("name","textfont",bfChinese,null);
form.setField(name, dataMap.get(name).toString());
}else{ }
}
// 如果为false那么生成的PDF文件还能编辑,一定要设为true
stamper.setFormFlattening(true);
stamper.close();
// 1.创建一个ducument
Document document = new Document(); // 2.建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中
// 创建 PdfWriter 对象 第一个参数是对文档对象的引用,第二个参数是文件的实际名称,在该名称中还会给出其输出路径
/*PdfWriter writer = PdfWriter.getInstance(document, out);
//PDF版本(默认1.4)
writer.setPdfVersion(PdfWriter.PDF_VERSION_1_6);*/ // 3.打开文档-->写入数据之前要打开文档
PdfCopy copy = new PdfCopy(document, out);
document.open();
// 设置属性
// 标题
document.addTitle(dataMap.get("title").toString());
// 作者
document.addAuthor(dataMap.get("author").toString());
// 主题
document.addSubject(dataMap.get("subject").toString());
// 关键字
document.addKeywords(dataMap.get("keywords").toString());
// 创建时间
document.addCreationDate();
// 应用程序
document.addCreator(dataMap.get("creator").toString()); // 4.添加内容段落
//获取pdf页数
int pageNum = reader.getNumberOfPages();
for (int i = 0; i < pageNum; i++) {
PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), i+1);
copy.addPage(importPage);
}
// 5.关闭文档
document.close(); bos.close();
reader.close();
reader.close();
} catch (IOException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
}
} public static void main(String[] args) throws Exception {
Map<String, Object> dataMap = new HashMap<String, Object>();
//模板的地址和新pdf的存储地址
dataMap.put("templatePath", "C:/Users/OnlyMate/Desktop/20161220***个人消费分期支付合同 .pdf");
dataMap.put("newPDFPath", "C:/Users/OnlyMate/Desktop/20161220***个人消费分期支付合同 11.pdf");
//pdf文件属性
dataMap.put("title", "***分期付款");
dataMap.put("author", "*****网络科技有限公司");
dataMap.put("subject", "分期付款");
dataMap.put("keywords", "installment");
dataMap.put("creator", "*****网络科技有限公司");
//分期合同信息
dataMap.put("contract_number", "20170808162930123456");//合同编号
dataMap.put("order_number", "20170808120001520");//订单编号
dataMap.put("payer_name", "袁凌可");//分期支付人
dataMap.put("id_number", "460106198809126392");//身份证号
dataMap.put("contact_number", "18888888888");//联系电话
dataMap.put("merchant_name", "精品商店");//特约商户
dataMap.put("goods_type", "全世界独一无二iphone20");//商品种类
dataMap.put("installment_amount", "24000元");//分期总金额
dataMap.put("installment_number", "12");//分期期数
dataMap.put("installment_first_amount", "2000元");//首期支付金额
dataMap.put("installment_service charge", "1000元");//手续费
dataMap.put("installment_average_amount", "2000元");//剩余每期支付金额
dataMap.put("signature_confirm", true);//同意条款-该值已被忽略
dataMap.put("signature_time_year", "2017");//签名年
dataMap.put("signature_time_month", "8");//签名月
dataMap.put("signature_time_day", "8");//签名日
fillTemplate(dataMap);
}
}
模板文件
建立PDF模板文件的表单域,并配置对应的名字

结果:

Itext读取PDF模板文件渲染数据后创建新文件的更多相关文章
- 读取word模板,填充数据后导出
一.需求说明 定期生成word报告,报告中含有文本.表格.图表等元素,依次获取进行替换,保留原有样式,生成新的word文档 二.引入依赖 <dependency> <groupId& ...
- 新知识:Java 利用itext填写pdf模板并导出(昨天奋战到深夜四点,知道今天两点终于弄懂)
废话少说,不懂itext干啥用的直接去百度吧. ***************制作模板******************* 1.先用word做出界面 2.再转换成pdf格式 3.用Adobe Acr ...
- InputStream读取文件到string后OutputStream到文件,按String和Bytes拷贝
http://www.iteye.com/problems/72150 写了一段代码 大体是 InputStream读取文件到string后OutputStream到文件 遇到的问题为TXT文件大小格 ...
- python 压缩文件为zip后删除原文件
压缩.log 文件为zip后删除原文件 需要注意:本人作为小白,该脚本需要和.log在一起,后面有时间需要改正. #!/usr/local/python/bin/python #-*-coding=u ...
- inode引起的Linux无法创建新文件,磁盘空间不足
df -h,判断硬盘空间是否已经满了,占用率达100% ,就可以断定该分区满了. df -ia,占用率达100%,也会导致无法创建新文件.一般都是存在大量小文件引起的. inode包含文件的元信息,具 ...
- sublime text 3创建新文件插件-AdvanceNewFile
这里要记录sublime text 3 在创建新文件时安装的插件–AdvanceNewFile ST本来自带的创建新文件的快捷键是ctrl+n.但是用户需要保存时才可修改名称以及文件路径.但是安装完A ...
- POI3.10读取Excel模板填充数据后生成新的Excel文件
private final DecimalFormat df = new DecimalFormat("#0.00"); public void test(){ String fi ...
- Android iText向pdf模板插入数据和图片
一.需求 这些日志在写App程序,有这么一个需求,就是需要生成格式统一的一个pdf文件,并向固定表格中填充数据,并且再在pdf中追加两页图片. 二.方案 手工设计一个pdf模板,这个具体步骤就不再赘述 ...
- nodejs操作 mongoose(mongodb)和Sequelize(mysql)查询数据后添加新属性未生效
最近在着手koa时候,发现mongoose(mongodb)查询数据库后添加新属性,前端拿不到新属性问题, 然后测试了一下Sequelize(mysql),发现也有同样的问题存在.此时着手干! 1.1 ...
随机推荐
- BZOJ5194: [Usaco2018 Feb]Snow Boots(排序&set)(可线段树优化)
5194: [Usaco2018 Feb]Snow Boots Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 102 Solved: 79[Subm ...
- 向requestAnimationFrame的回调函数中传递参数
其实跟setTimeout类似,我们知道传参传的是一个函数,那么我们是不是可以用一个匿名函数来包裹这个函数的执行呢function fn(fc){ console.log('fc:',fc) fc++ ...
- 监听器(Listener)学习(二)
一.监听域对象中属性的变更的监听器 域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信 ...
- 强大的Core Image(教你做自己的美图秀秀))
iOS5新特性:强大的Core Image(教你做自己的美图秀秀)) iOS5给我们带来了很多很好很强大的功能和API.Core Image就是其中之一,它使我们很容易就能处理图片的各种效 ...
- Python学习-str与byte类型以及编码
Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分.文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示.Python 3不会以任意隐式的方式混用str和b ...
- window10 下 php7.0 添加Sqlserver扩展
第一步.7.0.x 7.0.x的扩展下载地址: Microsoft Drivers for PHP for SQL Server https://www.microsoft.com/en-us/do ...
- MySQL优化之表结构优化的5大建议
很多人都将 数据库设计范式 作为数据库表结构设计“圣经”,认为只要按照这个范式需求设计,就能让设计出来的表结构足够优化,既能保证性能优异同时还能满足扩展性要求殊不知,在N年前被奉为“圣经”的数据库设计 ...
- LeetCode Word Abbreviation
原题链接在这里:https://leetcode.com/problems/word-abbreviation/description/ 题目: Given an array of n distinc ...
- FastAdmin env.sample 的用法
FastAdmin env.sample 的用法 在 FastAdmin 的 1.0.0.20180513 中我提交了一个 PR,增加 env.sample 内容如下: [app] debug = f ...
- pandas之Dataframe转成dict+过滤+index去重
转成字典a = ['key1', 'key2', 'key3']b = ['1', '2', '3']data = pd.DataFrame(zip(a, b), columns=['project' ...