一、制作模板

    1.下载Adobe Acrobat 9 Pro软件(pdf编辑器),制作模板必须使用该工具。

2.下载itextpdf-5.5.5.jar、itext-asian-5.2.0.jar两个jar包。(说明:itextpdf-5.5.5.jar用于操作pdf;itext-asian-5.2.0.jar用于pdf中文处理)

3.新建word文档,根据项目需求制作模板,然后另存为pdf格式的文件。

4.Adobe Acrobat 9 Pro软件打开pdf模板文件,点击‘‘表单’’--“启动表单向导”--引入pdf模板文件--添加表单域或者在自动识别的表单域设置表单域名称。设置完成后保存pdf模板。

 模板设置如图所示:

最终的模板如下所示:

二、java代码

package test;

import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
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;
/**
* 根据模板导出pdf(多页)
* @author lyc
*
*/
public class TestPdf7 {
// 利用模板生成pdf
public static void fillTemplate() {
// 模板路径
String templatePath = "C:/Users/lyc/Desktop/proposalTemplate8.pdf";
// 生成的新文件路径
String newPDFPath = "C:/Users/lyc/Desktop/ceshi111.pdf";
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);
AcroFields form = stamper.getAcroFields();
/*使用中文字体 */
/*BaseFont bf = BaseFont.createFont(PDFTicket.class.getResource("/") +"org/csun/ns/util/simsun.ttc,1",
BaseFont.IDENTITY_H,BaseFont.EMBEDDED);*/
//BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); BaseFont bf = BaseFont.createFont("C:/Windows/Fonts/simsun.ttc,1",
BaseFont.IDENTITY_H,BaseFont.EMBEDDED);
ArrayList<BaseFont> fontList = new ArrayList<BaseFont>();
fontList.add(bf); form.setSubstitutionFonts(fontList);
//String[] str = { "123456789", "TOP__ONE", "男", "1991-01-01", "130222111133338888", "河北省保定市","nishi" };
//String[] str = { "123456789", "TOP__ONE", "22", "1991-01-01", "130222111133338888", "333","nishi" };
Map<String,Object> map = new HashMap<String,Object>();
init(map);
//int i = 0;
java.util.Iterator<String> it = form.getFields().keySet().iterator();
while (it.hasNext()) {
String name = it.next().toString();
System.out.println(name);
//form.setField(name, map.get(name).toString());
form.setField(name, "aa");
}
stamper.setFormFlattening(true);// 如果为false那么生成的PDF文件还能编辑,一定要设为true
stamper.close(); Document doc = new Document();
PdfCopy copy = new PdfCopy(doc, out);
doc.open();
int pageNum = reader.getNumberOfPages(); //pdf模板总页数
for(int i = 1;i <= pageNum;i++){
PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), i);
copy.addPage(importPage);
} doc.close(); } catch (IOException e) {
e.printStackTrace();
System.out.println(1);
} catch (DocumentException e) {
e.printStackTrace();
System.out.println(2);
} } private static void init(Map<String, Object> map) {
//String[] str = { "123456789", "刘向南", "男", "1991-01-01", "130222111133338888", "河北省保定市","nishi" };
map.put("reversionId", "0009198181");
map.put("proposalNo", "8324735439");
map.put("proposalStatus", "拒保");
map.put("riskName", "尊享人生");
map.put("baozhang", "20年");
map.put("jiaofei", "趸交");
map.put("jine", "100000美元");
map.put("baofei", "3421美元");
map.put("xing1", "张");
map.put("ming1", "三");
map.put("pinyin", "ZHANG SAN");
map.put("sex", "男");
map.put("xing2", "张");
map.put("ming2", "小六");
map.put("xing3", "张");
map.put("ming3", "三");
map.put("company", "仁福香港保险中介有限公司");
map.put("area", "西北财富管理事业部");
map.put("dept", "第一营业部"); } public static void main(String[] args) {
fillTemplate();
} }

导出pdf文件如下所示:

此处是main方法测试,如果应用到web项目中可参考下面的代码(与上面的代码几乎一致,加了响应另存为处理,导出pdf就会出现弹框):

package com.test.www.web.controller;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Map; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping; 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; @RequestMapping("/test1")
@Controller
public class TestPdfController_c {
@RequestMapping("/testpdf")
public void testpdf(
HttpServletRequest request,
HttpServletResponse response,
ModelMap map) throws UnsupportedEncodingException{
// 设置响应头,控制浏览器下载该文件
response.setHeader("content-disposition", "attachment;filename="
+ URLEncoder.encode("投保单详情.pdf", "UTF-8"));
// 模板路径
String templatePath = "C:/Users/lyc/Desktop/proposalTemplate8.pdf";
// 生成的新文件路径
//String newPDFPath = "C:/Users/lyc/Desktop/ceshi5.pdf";
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);
AcroFields form = stamper.getAcroFields();
/*使用中文字体 */
/*BaseFont bf = BaseFont.createFont(PDFTicket.class.getResource("/") +"org/csun/ns/util/simsun.ttc,1",
BaseFont.IDENTITY_H,BaseFont.EMBEDDED);*/
//BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
/*BaseFont bf = BaseFont.createFont("C:/Windows/Fonts/simsun.ttc,1",
BaseFont.IDENTITY_H,BaseFont.EMBEDDED);*/
/**
* PDF Font Name已设为STSong-Light(宋体),在PDF Encoding中已选择GB-UCS2-H(Chinese Simplified);
* 导出pdf中文显示问题
*/
BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
ArrayList<BaseFont> fontList = new ArrayList<BaseFont>();
fontList.add(bf);
form.setSubstitutionFonts(fontList); Map<String,Object> mapInfo = new HashMap<String,Object>();
init(mapInfo);
//int i = 0;
java.util.Iterator<String> it = form.getFields().keySet().iterator();
while (it.hasNext()) {
String name = it.next().toString();
System.out.println(name);
//form.setField(name, "aa"); //mapInfo.get(name).toString()
form.setField(name, mapInfo.get(name).toString()); }
stamper.setFormFlattening(true);// 如果为false那么生成的PDF文件还能编辑,一定要设为true
stamper.close(); // 创建输出流
OutputStream out = response.getOutputStream();
Document doc = new Document();
PdfCopy copy = new PdfCopy(doc, out);
//PdfWriter.getInstance(doc, out); doc.open();
int pageNum = reader.getNumberOfPages(); //pdf模板总页数
for(int i = 1;i <= pageNum;i++){
PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), i); //第i页
copy.addPage(importPage);
}
doc.close(); //byte[] content = bos.toByteArray();
//out.write(content);
//FileInputStream in = content;
/*doc.add(new Paragraph("Hello Kiran"));
doc.add(new Paragraph(new Date().toString()));
byte[] content = bos.toByteArray();*/ } catch (IOException e) {
e.printStackTrace();
System.out.println(1);
} catch (DocumentException e) {
e.printStackTrace();
System.out.println(2);
} } private static void init(Map<String, Object> map) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
//String[] str = { "123456789", "刘向南", "男", "1991-01-01", "130222111133338888", "河北省保定市","nishi" };
map.put("reversionId", "0009198181");
map.put("proposalNo", "8324735439");
map.put("proposalStatus", "拒保");
map.put("riskName", "尊享人生");
map.put("baozhang", "20年");
map.put("jiaofei", "趸交");
map.put("jine", "100000美元");
map.put("baofei", "3421美元");
map.put("xing1", "张");
map.put("ming1", "三");
map.put("pinyin", "ZHANG SAN");
map.put("sex", "男");
map.put("xing2", "张");
map.put("ming2", "小六");
map.put("xing3", "张");
map.put("ming3", "三");
map.put("company", "仁福香港保险中介有限公司");
map.put("area", "西北财富管理事业部");
map.put("dept", "第一营业部");
map.put("date", sdf.format(new Date()));
}
}

java根据模板导出PDF(利用itext)的更多相关文章

  1. java根据模板导出pdf

    在网上看了一些Java生成pdf文件的,写的有点乱,有的不支持写入中文字体,有的不支持模板,有的只是随便把数据放里面生成文件,完全不考虑数据怎样放置的以及以后的维护性,想想还是自己总结一个完全版的导出 ...

  2. java根据模板导出PDF详细教程

    原文:https://blog.csdn.net/pengyufight/article/details/75305128 题记:由于业务的需要,需要根据模板定制pdf文档,经测试根据模板导出word ...

  3. java通过freemarker模板导出pdf

    需求:将网页内容导出为pdf文件,其中包含文字,图片,echarts图 原理:利用freemarker模板与数据渲染所得到的html内容,通过ITextRenderer对象解析html内容生成pdf ...

  4. Java使用IText(VM模版)导出PDF,IText导出word(二)

    ===============action=========================== //退款导出word    public void exportWordTk() throws IOE ...

  5. java模板导出PDF

    本次完善综合特点: 一对一,点对点的给对应的地方写值,比如模板里面放了个name标识,在程序里把“张三”赋给name,那么输出的pdf里面name的地方就变成了张三,准确方便快捷 支持中文,可以使用自 ...

  6. java根据模板生成pdf

    原文链接:https://www.cnblogs.com/wangpeng00700/p/8418594.html 在网上看了一些Java生成pdf文件的,写的有点乱,有的不支持写入中文字体,有的不支 ...

  7. Java按模板导出Excel———基于Aspose实现

    目录 开发环境 先看效果 引入jar包 校验许可证 导出方法 测试结果 占位符 开发环境 jdk 1.8 Maven 3.6 SpringBoot 2.1.4.RELEASE aspose-cells ...

  8. Java无模板导出Excel,Apache-POI插件实现

    开发环境 jdk 1.8 Maven 3.6 Tomcat 8.5 SpringBoot 2.1.4.RELEASE Apache-POI 3.6 Idea 注意: 我是在现有的基于SpringBoo ...

  9. 结合模板导出PDF文件

    @Action("report_exportJasperPdf")    public String exportJasperPdf() throws Exception{     ...

随机推荐

  1. POJ 3664 Election Time 题解

    这道题网上非常多人都会说easy,水题之类的话,只是我看了下说这种话的人的程序,能够说他们的程序都不及格! 为什么呢?由于他们的程序都是使用简单的二次排序水过(大概你能搜索到的多是这种程序).那样自然 ...

  2. iOS知识点汇总

    1.怎样追踪app崩溃率.怎样解决线上闪退 当iOS设备上的App应用闪退时.操作系统会生成一个crash日志.保存在设备上.crash日志上有非常多实用的信息,比方每个正在运行线程的完整堆栈跟踪信息 ...

  3. 修改YOLO使其显示自定义类别

    基本参考自这篇文章(http://blog.csdn.net/ma3252788/article/details/74659230),主要用来记录下自己遇到的问题 根据@赤战约风 的帖子做如下修改可以 ...

  4. bzoj1045: [HAOI2008] 糖果传递(数论)

    1045: [HAOI2008] 糖果传递 题目:传送门(双倍经验3293) 题解: 一开始想着DP贪心一顿乱搞,结果就GG了 十分感谢hzwer大佬写的毒瘤数论题解: 首先,最终每个小朋友的糖果数量 ...

  5. Oracle RAC --安装图解

    规划:所用linux系统以虚拟化方式安装在esx上,配置有内网的yum源,各分配有16G存储,下面为简单拓扑图 一,下载软件1,地址:http://www.oracle.com/technology/ ...

  6. mysql导入数据,涉及到时间转换,乱码问题解决

    表结构: drop table if exists `qi_an_log`;CREATE TABLE `qian_log` (`dt` LONG NOT NULL COMMENT '产生日期,格式yy ...

  7. Chrome浏览器查看SSL证书信息

    1.https使用f12打开,选中security 如果F12打不开,可以通过最右端的自定义及控制chrome菜单,打开"更多工具"-->"开发者工具" ...

  8. <%=%>、<%%>、<%@%>、<%#%>的区别

    1.<%= %> 里面放变量名,获取后台的变量值,直接输入变量到页面上,里面放的变量名,未经过encode eg: 后台: seession["ab"]=ab; 前台: ...

  9. [转]C++ 获取文件夹下的所有文件名

    转自http://www.cnblogs.com/fnlingnzb-learner/p/6424563.html 头文件:#include<io.h> char * filePath = ...

  10. frameset宽屏居中写法

    在写frameset的时候发现页面较小的时候不能在屏幕上居中,记录一下frameset页面居中的写法 <frameset cols="*,1280,*" frameborde ...