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 ...
 
随机推荐
- 【IDEA】创建maven项目时,报错[FATAL_ERROR] Cannot start Maven: Cannot find JRE '1.7'
			
在使用IDEA使用maven创建springMVC项目时,出现下面的错误,导致无法创建生成正常的springMVC项目结构,而只有一个pom文件: [FATAL_ERROR] Cannot start ...
 - request接收表单提交数据及其中文参数乱码问题
			
一.request接收表单提交数据: getParameter(String)方法(常用) getParameterValues(String name)方法(常用) getParameterMap( ...
 - .NET Core/Framework 创建委托以大幅度提高反射调用的性能
			
都知道反射伤性能,但不得不反射的时候又怎么办呢?当真的被问题逼迫的时候还是能找到解决办法的. 为反射得到的方法创建一个委托,此后调用此委托将能够提高近乎直接调用方法本身的性能.(当然 Emit 也能够 ...
 - Visual->UIElement->FrameworkElement,带来更多功能的同时也带来了更多的限制
			
在 WPF 或 UWP 中,我们平时开发所遇到的那些 UI 控件或组件,都直接或间接继承自 Framework.例如:Grid.StackPanel.Canvas.Border.Image.Butto ...
 - NET Core2基于RabbitMQ对Web前端实现推送功能
			
NET Core2基于RabbitMQ对Web前端实现推送功能 https://www.cnblogs.com/Andre/p/10012329.html 在我们很多的Web应用中会遇到需要从后端将指 ...
 - Quartz 2D编程指南(5) - 变换(Transforms)
			
Quartz 2D 绘制模型定义了两种独立的坐标空间:用户空间(用于表现文档页)和设备空间(用于表现设备的本地分辨率).用户坐标空间用浮点数表示坐标,与设备空间的像素分辨率没有关系.当我们需要一个点或 ...
 - BZOJ5369 [Pkusc2018]最大前缀和
			
题意 小C是一个算法竞赛爱好者,有一天小C遇到了一个非常难的问题:求一个序列的最大子段和. 但是小C并不会做这个题,于是小C决定把序列随机打乱,然后取序列的最大前缀和作为答案. 小C是一个非常有自知之 ...
 - 在linux安装redis单机和集群后,如何在windows上使用redis客户端或者java代码访问错误的原因很简单,就是没有连接上redis服务,由于redis采用的安全策略,默认会只准许本地访问。需要通过简单配置,完成允许外网访问。
			
这几天在学习在linux上搭建服务器的工作,可谓历经艰辛.可喜最后收获也不少. 这次是在linux上搭建redis服务器后从windows上缺无法访问,连接不上. 仔细回忆以前搭建nginx和ftp的 ...
 - java Annotation的应用
			
一.Annotation 示例 Override Annotation @Override public void onCreate(Bundle savedInstanceState); 二.Ann ...
 - 【转】JMeter 通过 JDBC 访问 Oracle 和 MySQL
			
JMeter 的手册中描述了如何访问 MySQL,但是没有说明如何访问 Oracle.对于没有 Java 应用开发经验和对 Oracle 不是特别熟悉的朋友,可以参考这篇文章来简单.快速的配置好 JM ...