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. 每天一个linux命令:【转载】cd命令

    Linux cd 命令可以说是Linux中最基本的命令语句,其他的命令语句要进行操作,都是建立在使用 cd 命令上的. 所以,学习Linux 常用命令,首先就要学好 cd 命令的使用方法技巧. 1.  ...

  2. Spring配置--Aop配置详情

    首先我们来看一下官方文档所给我们的关于AOP的一些概念性词语的解释: 切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个对象.事务管理是J2EE应用中一个关于横切关注点的很好的例子.在 ...

  3. List集合学习

    Java中常用的List子类主要有:ArrayList.LinkedList.Vector.有序(存储和取出的元素一致),可重复的. 三者比较 1:访问:ArrayList和Vector都实现了Ran ...

  4. Servlet传统配置方式和Servlet3.0使用注解的方式

    一.Servlet的传统配置方式 在JavaWeb开发中, 每次编写一个Servlet都需要在web.xml文件中进行配置,如下所示: <servlet> <servlet-name ...

  5. ubuntu下Python的安装和使用

    版权声明 更新:2017-04-13-上午博主:LuckyAlan联系:liuwenvip163@163.com声明:吃水不忘挖井人,转载请注明出处! 1 文章介绍 本文介绍了Python的开发环境. ...

  6. mysql 随机选取一条记录

    要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1. 1 2 3 4 5 6 7 8 9 1 ...

  7. Buy Tickets(线段树单点更新,逆向思维)

    题目大意:有n个的排队,每一个人都有一个val来对应,每一个后来人都会插入当前队伍的某一个位置pos.要求把队伍最后的状态输出. 个人心得:哈哈,用链表写了下,果不其然超时了,后面转念一想要用静态数组 ...

  8. 记录一些WPF常用样式方便以后复用(二)(Button、CheckBox、输入账号密码框)(转)

    Button (一) <Style x:Key="ButtonSaveStyle" TargetType="{x:Type Button}"> &l ...

  9. 中兴G718C开发者模式开启

    系统设置--关于手机--版本号,连按七次,打开开发者选项 请进入设置——连接到PC——默认连接类型——安装驱动,选择即可.然后将手机和电脑连接,打开“我的电脑”或“计算机”会弹出可移动盘符“USB D ...

  10. npm dose not support Node.js v10.15.3

    事件起因: 楼主在vue-cli官网,尝试使用vue-cli3脚手架+yarn包管理器构建项目时,命令行窗口提示node版本不对.如下图 这个大家都知道该如何去解决,直接去node官网下载符合版本的n ...