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模板文件渲染数据后创建新文件的更多相关文章

  1. 读取word模板,填充数据后导出

    一.需求说明 定期生成word报告,报告中含有文本.表格.图表等元素,依次获取进行替换,保留原有样式,生成新的word文档 二.引入依赖 <dependency> <groupId& ...

  2. 新知识:Java 利用itext填写pdf模板并导出(昨天奋战到深夜四点,知道今天两点终于弄懂)

    废话少说,不懂itext干啥用的直接去百度吧. ***************制作模板******************* 1.先用word做出界面 2.再转换成pdf格式 3.用Adobe Acr ...

  3. InputStream读取文件到string后OutputStream到文件,按String和Bytes拷贝

    http://www.iteye.com/problems/72150 写了一段代码 大体是 InputStream读取文件到string后OutputStream到文件 遇到的问题为TXT文件大小格 ...

  4. python 压缩文件为zip后删除原文件

    压缩.log 文件为zip后删除原文件 需要注意:本人作为小白,该脚本需要和.log在一起,后面有时间需要改正. #!/usr/local/python/bin/python #-*-coding=u ...

  5. inode引起的Linux无法创建新文件,磁盘空间不足

    df -h,判断硬盘空间是否已经满了,占用率达100% ,就可以断定该分区满了. df -ia,占用率达100%,也会导致无法创建新文件.一般都是存在大量小文件引起的. inode包含文件的元信息,具 ...

  6. sublime text 3创建新文件插件-AdvanceNewFile

    这里要记录sublime text 3 在创建新文件时安装的插件–AdvanceNewFile ST本来自带的创建新文件的快捷键是ctrl+n.但是用户需要保存时才可修改名称以及文件路径.但是安装完A ...

  7. POI3.10读取Excel模板填充数据后生成新的Excel文件

    private final DecimalFormat df = new DecimalFormat("#0.00"); public void test(){ String fi ...

  8. Android iText向pdf模板插入数据和图片

    一.需求 这些日志在写App程序,有这么一个需求,就是需要生成格式统一的一个pdf文件,并向固定表格中填充数据,并且再在pdf中追加两页图片. 二.方案 手工设计一个pdf模板,这个具体步骤就不再赘述 ...

  9. nodejs操作 mongoose(mongodb)和Sequelize(mysql)查询数据后添加新属性未生效

    最近在着手koa时候,发现mongoose(mongodb)查询数据库后添加新属性,前端拿不到新属性问题, 然后测试了一下Sequelize(mysql),发现也有同样的问题存在.此时着手干! 1.1 ...

随机推荐

  1. hessian 协议 版本 兼容

    环境 : 服务端:  hessian 4.0.38 , spring 4.3.6 ; spring文档指出spring4.0以上的版本只能使用hessian 4.0以上的版本 客户端: hessian ...

  2. 搭建简单Samba服务器

    本文主要实现搭建简单的Samba服务器,使得Windows能访问Linux下的共享目录,为了简单,已经关闭iptables和selinux. 1.安装samba服务器 #yum list all sa ...

  3. 白话machine learning之Loss Function

    转载自:http://eletva.com/tower/?p=186 有关Loss Function(LF),只想说,终于写了 一.Loss Function 什么是Loss Function?wik ...

  4. windows中的oracle12SE后启动的系统服务的列表

    下图是我安装在windows 10下安装好oracle12.10SE之后的启动的系统服务的列表. 通常,我是将其全部修改为手动启动.当需要用oracle服务的时候,只需要启动对应的实例的服务和tnsl ...

  5. Ubuntu和win双系统删除ubuntu开机出错

    Ubuntu和win双系统删除ubuntu开机出错问题. 报错error:unknown filesystem. grub rescue>_ 很简单: 进入pe 打开diskgenius 选择你 ...

  6. bzoj 4573 大森林

    bzoj 4573 大森林 由于树上路径是唯一的,查询合法的两个点间路径长度显然与其他加点操作无关,所以可以离线处理,将所有的查询放在加点后. 这样我们可以对每棵树都在上颗树的基础上处理好形态后,处理 ...

  7. c# datetime 格式化大全与使用总结

    //C# datetime 格式化 DateTime dt = DateTime.Now; Label1.Text = dt.ToString();//2005-11-5 13:21:25 Label ...

  8. cannot find lstdc++

    centos下编译grpc-java时遇到的问题,google了一下 : sudo yum install libstdc++-static

  9. SpringMVC传递数据的流线图

    流程含义解释:(1)HTTP请求到达web服务器,web服务器将其封装成一个httpServletRequest对象(2)springMVC框架截获这个httpServletRequest对象(3)s ...

  10. maven创建多模块项目

    在eclipse下构建maven项目,该项目由多个子模块组成. 1.创建一个父项目 NEW -->project-->maven-->maven Project,点击下一步,进入ne ...