java根据模板导出PDF(利用itext)
一、制作模板
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)的更多相关文章
- java根据模板导出pdf
在网上看了一些Java生成pdf文件的,写的有点乱,有的不支持写入中文字体,有的不支持模板,有的只是随便把数据放里面生成文件,完全不考虑数据怎样放置的以及以后的维护性,想想还是自己总结一个完全版的导出 ...
- java根据模板导出PDF详细教程
原文:https://blog.csdn.net/pengyufight/article/details/75305128 题记:由于业务的需要,需要根据模板定制pdf文档,经测试根据模板导出word ...
- java通过freemarker模板导出pdf
需求:将网页内容导出为pdf文件,其中包含文字,图片,echarts图 原理:利用freemarker模板与数据渲染所得到的html内容,通过ITextRenderer对象解析html内容生成pdf ...
- Java使用IText(VM模版)导出PDF,IText导出word(二)
===============action=========================== //退款导出word public void exportWordTk() throws IOE ...
- java模板导出PDF
本次完善综合特点: 一对一,点对点的给对应的地方写值,比如模板里面放了个name标识,在程序里把“张三”赋给name,那么输出的pdf里面name的地方就变成了张三,准确方便快捷 支持中文,可以使用自 ...
- java根据模板生成pdf
原文链接:https://www.cnblogs.com/wangpeng00700/p/8418594.html 在网上看了一些Java生成pdf文件的,写的有点乱,有的不支持写入中文字体,有的不支 ...
- Java按模板导出Excel———基于Aspose实现
目录 开发环境 先看效果 引入jar包 校验许可证 导出方法 测试结果 占位符 开发环境 jdk 1.8 Maven 3.6 SpringBoot 2.1.4.RELEASE aspose-cells ...
- Java无模板导出Excel,Apache-POI插件实现
开发环境 jdk 1.8 Maven 3.6 Tomcat 8.5 SpringBoot 2.1.4.RELEASE Apache-POI 3.6 Idea 注意: 我是在现有的基于SpringBoo ...
- 结合模板导出PDF文件
@Action("report_exportJasperPdf") public String exportJasperPdf() throws Exception{ ...
随机推荐
- MySQL事件调度器Event Scheduler
我们都知道windows的计划任务和linux的crontab都是用来实现一些周期性的任务和固定时间须要运行的任务. 在mysql5.1之前我们完毕数据库的周期性操作都必须借助这些操作系统实现. 在m ...
- 对象不支持“abigimage”属性或方法
在一个网页中用了一个js插件, js文件引用的没有错,代码也和demo差点儿相同, 可是执行时ie的调试工具报了一个错: 解决方式: jquery文件冲突,发现原来自己引过一个 <script ...
- Android LaunchMode案例篇
首先感谢小伙伴的关注.然后祝愿广大的情侣们节日快乐! 在开发中有时会遇到这种场景,用户点击注冊.第一步,第二步,完毕注冊跳转到登录界面,不须要用户一步一步的返回到登录界面.这是怎么实现的呢? 案例:有 ...
- java中StringBuilder、StringBuffer、String类之间的关系
今天在CSDN的高校俱乐部里看到了"Java基础水平測试(英文)".感觉自己学了java这么久,想看下自己的java水平究竟是个什么样.測试结果就不说了,反正是慘不忍睹. 看了一下 ...
- Linux网络编程(附1)——封装read、write
原打算实践简单的模型的时候,主要专注于基本的模型,先用UNIX I/O糊弄下,可是未封装的read和write用起来实在心累,还是直接用前辈们已经实现好的高级版本号read.write. UNIX I ...
- 37、ifconfig命令
很多windows很熟悉ipconfig命令行工具.它被用来获取网络接口配置信息并对此进行改动.Linux系统拥有一个类似的工具,也就是ifconfig(interfaces config). 通常须 ...
- CxImage动态加载图片(判断图片文件类型)
1.打开一张图可以通过创建一个新的CxImage对象来完成,通过构造函数来打开一张图CxImage::CxImage(const char * filename, DWORD imagetype)其中 ...
- [JZOJ 5911] [NOIP2018模拟10.18] Travel 解题报告 (期望+树形DP)
题目链接: http://172.16.0.132/senior/#contest/show/2530/1 题目: EZ同学家里非常富有,但又极其的谦虚,说话又好听,是个不可多得的人才. ...
- java算法数据结构
原文地址:github.com/kdn251/interviews 译文出自:掘金翻译计划 译者:王下邀月熊 校对者:PhxNirvana.根号三 这个 链接 用来查看本翻译与英文版是否有差别(如果你 ...
- python 3.x 学习笔记15(多线程)
1.线程进程进程:程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程,不具备执行感念,只是程序各种资源集合 线程:线程是操作系统能够进行运算调度的最小单 ...