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. BZOJ1183 Croatian2008 Umnozak 【数位DP】*

    BZOJ1183 Croatian2008 Umnozak Description 定义一个数的digit-product是它的各个位上的数字的乘积,定义一个数的self-product是它本身乘以它 ...

  2. You're Given a String...

    You're given a string of lower-case Latin letters. Your task is to find the length of its longest su ...

  3. 细说VS MSBuild 和 Framework 的区别

    如今已经是 VS2017 横行的时代,而据我所知,大部分人还停留在使用 VS2015 VS2013 或更低的版本,主要是因为他们参与的项目基本使用这几个VS的版本开发的.眼红VS2017却不敢升级,主 ...

  4. Apache Tez 了解

    你可能听说过Apache Tez,它是一个针对Hadoop数据处理应用程序的新分布式执行框架.但是它到底是什么呢?它的工作原理是什么?哪些人应该使用它,为什么?如果你有这些疑问,那么可以看一下Bika ...

  5. cocostudio ui编辑器 使用心得

    1 c++包含路径 2九宫格设置 cocostudio ui编辑器设置九宫格x,y,w,h是从图片左上角开始测量,然后调整尺寸就行了. 2.  如果点了自适应  panel会在加载json的时候被设置 ...

  6. centos7下安装Anaconda3

    下载anaconda3: wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-4.2.0-Linux-x86_64 ...

  7. js中去掉字符串中的某个指定字符

    假设一个data里面的数据是[tian,12],现在去掉[],代码如下 data=data.replace("[",""); data=data.replace ...

  8. erlang异常处理备忘

    捕获所有异常得用_:_,看例子 try aa:bb() of Value -> Value catch _:_ -> "" end 如果单表达式不需要有返回值,直接异常 ...

  9. JVM内存管理之GC算法精解(五分钟教你终极算法---分代搜集算法)

    引言 何为终极算法? 其实就是现在的JVM采用的算法,并非真正的终极.说不定若干年以后,还会有新的终极算法,而且几乎是一定会有,因为LZ相信高人们的能力. 那么分代搜集算法是怎么处理GC的呢? 对象分 ...

  10. eclipse安装freemarker插件【转】

    今天在Eclipse上安装Freemarker的插件,一开始装官方网站上的推荐插件,装上后发现除了Freemarker代码高亮显示其他什么效果都没有,郁闷.在javaeye论坛上请教了下,据说官网上的 ...