java导出PDF(利用itext)

时间:2021-08-03 22:20:29

基于ssm框架中使用itext动态导出pdf文件:

1.引入两个jar包:itextpdf-5.5.5.jar、itext-asian-5.2.0.jar

2.页面点击导出pdf并弹出保存提示框。

jsp:

<!DOCTYPE html>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%
String ctxPath = request.getContextPath();

request.setAttribute(
"ctxpath", ctxPath);//项目根路径
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>首页</title>
<script type="text/javascript">

</script>
</head>
<body>
<form action="${ctxpath}/test/testpdf.html" method="post">
<input id="test" name="test" type="submit" value="导出pdf"/>
</form>
</body>
</html>

 

controller:

package com.test.www.web.controller;

import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Chapter;
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.Section;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.CMYKColor;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import com.test.www.web.security.PermissionSign;

@RequestMapping(
"/test")
@Controller
public class TestPdfController {
@RequestMapping(
"/testpdf")
@RequiresPermissions(value
=PermissionSign.PUB_TRAININGTYPE)
public void testpdf(
HttpServletRequest request,
HttpServletResponse response,
ModelMap map)
throws UnsupportedEncodingException{
// 设置响应头,控制浏览器下载该文件
response.setHeader("content-disposition", "attachment;filename="
+ URLEncoder.encode("投保单详情.pdf", "UTF-8"));
//常用的有paragraph段落、phrase语句块、chunk最小单位块
try {

BaseFont bfChinese
= BaseFont.createFont("STSong-Light",
"UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font fontChinese
= new Font(bfChinese, 12, Font.NORMAL);


Map
<String,Object> mapInfo = new HashMap<String,Object>();
init(mapInfo);

// 创建输出流
OutputStream out = response.getOutputStream();
//Rectangle pageSize = new Rectangle(144, 720);
//pageSize.BackgroundColor = new Color(0xFF, 0xFF, 0xDE);
//pageSize.setBorderColor(new BaseColor(0xFF, 0xFF, 0xDE));

Document doc
= new Document();
PdfWriter writer
= PdfWriter.getInstance(doc, out);

doc.open();
/*Anchor anchorTarget = new Anchor("aaaa你谁");
anchorTarget.setName("aa你好");
Paragraph paragraph1 = new Paragraph();
paragraph1.setSpacingBefore(50);
paragraph1.add(anchorTarget);
*/

//-------------------第一行----------------------
//段落文本
Paragraph paragraphBlue = new Paragraph("", fontChinese);
paragraphBlue.setLeading(20f);
// 行间距
paragraphBlue.setAlignment(Element.ALIGN_CENTER);
Font font1
= new Font(bfChinese, 12, Font.BOLD);

Chunk chunk1
= new Chunk("预约单号: "+"0009198181"+" ");
Chunk chunk2
= new Chunk("投保单号: "+"8324735439"+" ");
Chunk chunk3
= new Chunk("投保单状态: "+"拒保"+" ");
chunk1.setFont(font1);
chunk2.setFont(font1);
chunk3.setFont(font1);

paragraphBlue.add(chunk1);
paragraphBlue.add(chunk2);
paragraphBlue.add(chunk3);
doc.add(paragraphBlue);

//-------------------投保方案----------------------
Font font2 = new Font(bfChinese, 16, Font.BOLD);
Paragraph paragraphBlue1
= new Paragraph("", font2);
Chunk titleChunk1
= new Chunk("投保方案",font2);
//BaseColor.LIGHT_GRAY
titleChunk1.setBackground(BaseColor.LIGHT_GRAY, 10, 10, 470, 10);
paragraphBlue1.add(titleChunk1);
paragraphBlue1.setSpacingBefore(
20);
doc.add(paragraphBlue1);

Paragraph paragraphBlue2
= new Paragraph("尊享天下", font2);
paragraphBlue2.setAlignment(Element.ALIGN_CENTER);
paragraphBlue2.setSpacingBefore(
20);
doc.add(paragraphBlue2);

//创建表格
//PdfPTable table = new PdfPTable(6);
PdfPTable table = new PdfPTable(5);
table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER);
//水平居中
table.getDefaultCell().setVerticalAlignment(Element.ALIGN_MIDDLE);
table.getDefaultCell().setFixedHeight(
30);
table.getDefaultCell().setBorderWidth(
1);// 边框宽度

// 添加表头元素
table.addCell(new Paragraph("险种名称", fontChinese));
table.addCell(
new Paragraph("保障期限", fontChinese));
table.addCell(
new Paragraph("缴费期限", fontChinese));
table.addCell(
new Paragraph("保险金额", fontChinese));
table.addCell(
new Paragraph("年缴保费", fontChinese));

// 添加表格的内容
table.addCell(new Paragraph("尊享人生", fontChinese));
table.addCell(
new Paragraph("20年", fontChinese));
table.addCell(
new Paragraph("趸交", fontChinese));
table.addCell(
new Paragraph("100000美元", fontChinese));
table.addCell(
new Paragraph("3421美元", fontChinese));

table.setSpacingBefore(10f);
// 设置表格上面空白宽度
doc.add(table);

//-------------------投保信息-------------------------
Paragraph paragraphBlue3 = new Paragraph("", font2);
Chunk titleChunk2
= new Chunk("投保信息",font2);
//BaseColor.LIGHT_GRAY
titleChunk2.setBackground(BaseColor.LIGHT_GRAY, 10, 10, 470, 10);
paragraphBlue3.add(titleChunk2);
paragraphBlue3.setSpacingBefore(
20);
doc.add(paragraphBlue3);

//--------------------申请人--------------------------
Font font3 = new Font(bfChinese, 14, Font.BOLD); //加粗14
Paragraph paragraphBlue4 = new Paragraph("申请人", font3);
paragraphBlue4.setSpacingBefore(
20);
doc.add(paragraphBlue4);
Paragraph paragraphBlue6
= new Paragraph("", fontChinese);
paragraphBlue6.setIndentationLeft(
30); //左缩进
paragraphBlue6.setLeading(30);// 行间距
//paragraphBlue6.setAlignment(Element.ALIGN_CENTER);
String str = " ";
Chunk applyChunk1
= new Chunk("*姓: "+"张"+" "+"*名: "+"三"+"\n");
//applyChunk1.setHorizontalScaling(50);
Chunk applyChunk2 = new Chunk("*姓名拼音:"+"ZHANG SAN"+str+"*性别:"+"男"+"\n");
Chunk applyChunk3
= new Chunk("*出生日期:"+"1985年7月20日"+str+"*年龄:"+"32周岁"+"\n");
Chunk applyChunk4
= new Chunk("*身份证号码:"+"110022198507202012"+str+"*通行证号码:"+"C17646643"+"\n");
Chunk applyChunk5
= new Chunk("*婚姻状况:"+"未婚"+str+"*吸烟习惯:"+"吸烟"+"\n");
Chunk applyChunk6
= new Chunk("*身高:"+"181 cm"+str+"*体重:"+"76 kg"+"\n");
Chunk applyChunk7
= new Chunk("*身份证地址:"+"山东省济南市天桥区惠元里06号306"+"\n");
Chunk applyChunk8
= new Chunk("*通讯地址:"+"山东省济南市天桥区惠元里06号306"+"\n");
Chunk applyChunk9
= new Chunk("住宅电话:"+"13566358894"+str+"*手机号码:"+"185*******7261"+"\n");
Chunk applyChunk10
= new Chunk("*E-mail:"+"12646@qq.com"+"\n");

Chunk applyChunk11
= new Chunk("职业资料"+"\n");
Chunk applyChunk12
= new Chunk("*公司名称:"+"山东蓝翔技工学校"+"\n");
Chunk applyChunk13
= new Chunk("*业务性质:"+"教育培训"+str+"*工作职位:"+"教学组长"+"\n");
Chunk applyChunk14
= new Chunk("*公司地址:"+"山东省济南市天桥区蓝翔中路06号"+"\n");

Chunk applyChunk15
= new Chunk("收入来源(过去12个月总收入)"+"\n");
Chunk applyChunk16
= new Chunk("*工资:"+"1000000港元"+str+"*奖金:"+"600000港元"+"\n");
Chunk applyChunk17
= new Chunk("*自保件:"+"否"+"\n");
Chunk applyChunk18
= new Chunk("*是受保人的:"+"父亲"+"\n");

//样式
applyChunk11.setFont(font3);
applyChunk15.setFont(font3);

paragraphBlue6.add(applyChunk1);
paragraphBlue6.add(applyChunk2);
paragraphBlue6.add(applyChunk3);
paragraphBlue6.add(applyChunk4);
paragraphBlue6.add(applyChunk5);
paragraphBlue6.add(applyChunk6);
paragraphBlue6.add(applyChunk7);
paragraphBlue6.add(applyChunk8);
paragraphBlue6.add(applyChunk9);
paragraphBlue6.add(applyChunk10);
paragraphBlue6.add(applyChunk11);
paragraphBlue6.add(applyChunk12);
paragraphBlue6.add(applyChunk13);
paragraphBlue6.add(applyChunk14);
paragraphBlue6.add(applyChunk15);
paragraphBlue6.add(applyChunk16);
paragraphBlue6.add(applyChunk17);
paragraphBlue6.add(applyChunk18);
doc.add(paragraphBlue6);

//---------------受保人--------------
Paragraph paragraphBlue5 = new Paragraph("受保人", font3);
doc.add(paragraphBlue5);
Paragraph paragraphBlue7
= new Paragraph("", fontChinese);
paragraphBlue7.setIndentationLeft(
30); //左缩进
paragraphBlue7.setLeading(30); //行间距

Chunk insuredChunk1
= new Chunk("*姓:"+"张"+str+"*名:"+"三"+"\n");
Chunk insuredChunk2
= new Chunk("*姓名拼音:"+"ZHANG SAN"+str+"*性别:"+"男"+"\n");
Chunk insuredChunk3
= new Chunk("*出生日期:"+"1985年7月20日"+str+"*身份证号码:"+"110022200807202012"+"\n");
Chunk insuredChunk4
= new Chunk("*与申请人关系:"+"父女"+str+"*吸烟习惯:"+"非吸烟"+"\n");
Chunk insuredChunk5
= new Chunk("*身份证地址:"+"山东省济南市天桥区惠元里06号306"+"\n");
Chunk insuredChunk6
= new Chunk("*通讯地址:"+"山东省济南市天桥区惠元里06号306"+"\n");
Chunk insuredChunk7
= new Chunk("职业及收入资料(如受保人非申请人本人,且满18周岁以上,请如实填写)"+"\n");
Chunk insuredChunk8
= new Chunk("公司名称:"+""+"\n");
Chunk insuredChunk9
= new Chunk("业务性质:"+""+str+"工作职位:"+""+"\n");
Chunk insuredChunk10
= new Chunk("公司地址:"+""+"\n");
Chunk insuredChunk11
= new Chunk("年收入:"+""+"\n");
//样式
insuredChunk7.setFont(font3);
paragraphBlue7.add(insuredChunk1);
paragraphBlue7.add(insuredChunk2);
paragraphBlue7.add(insuredChunk3);
paragraphBlue7.add(insuredChunk4);
paragraphBlue7.add(insuredChunk5);
paragraphBlue7.add(insuredChunk6);
paragraphBlue7.add(insuredChunk7);
paragraphBlue7.add(insuredChunk8);
paragraphBlue7.add(insuredChunk9);
paragraphBlue7.add(insuredChunk10);
paragraphBlue7.add(insuredChunk11);
doc.add(paragraphBlue7);

//-----------受益人------------
Paragraph paragraphBlue8 = new Paragraph("受益人", font3);
doc.add(paragraphBlue8);
Paragraph paragraphBlue9
= new Paragraph("", fontChinese);
paragraphBlue9.setIndentationLeft(
30); //左缩进
paragraphBlue9.setLeading(30); //行间距
for(int i=0;i<3;i++){
Chunk benefitChunk1
= new Chunk("*姓:"+"张"+str+"*名:"+"三"+"\n");
Chunk benefitChunk2
= new Chunk("*与受保人关系:"+"父女"+str+"*身份证号码:"+"110022198507202012"+"\n");
Chunk benefitChunk3
= new Chunk("*受益比例:"+"100%"+"\n");

paragraphBlue9.add(benefitChunk1);
paragraphBlue9.add(benefitChunk2);
paragraphBlue9.add(benefitChunk3);
}
doc.add(paragraphBlue9);

//------------已投保之保险公司保单(如有则必须提供)--------------
Paragraph paragraphBlue10 = new Paragraph("已投保之保险公司保单(如有则必须提供)", font3);
doc.add(paragraphBlue10);
Paragraph paragraphBlue11
= new Paragraph("", fontChinese);
paragraphBlue11.setIndentationLeft(
30); //左缩进
paragraphBlue11.setLeading(30); //行间距

Chunk policyChunk1
= new Chunk("保险公司:"+"仁福香港保险中介有限公司"+str+"产品:"+"尊享太平"+"\n");
Chunk policyChunk2
= new Chunk("年缴保费:"+"100000港元"+str+"申请日期:"+"2017年2月20日"+"\n");

paragraphBlue11.add(policyChunk1);
paragraphBlue11.add(policyChunk2);
doc.add(paragraphBlue11);

//-----------预约签单信息------------
Paragraph paragraphBlue12 = new Paragraph("", font2);
Chunk titleChunk3
= new Chunk("预约签单信息",font2);
//BaseColor.LIGHT_GRAY
titleChunk3.setBackground(BaseColor.LIGHT_GRAY, 10, 10, 440, 10);
paragraphBlue12.add(titleChunk3);
paragraphBlue12.setSpacingBefore(
20);
doc.add(paragraphBlue12);

Paragraph paragraphBlue13
= new Paragraph("", fontChinese);
paragraphBlue13.setSpacingBefore(
20);
paragraphBlue13.setIndentationLeft(
30); //左缩进
paragraphBlue13.setLeading(30); //行间距

Chunk reserveChunk1
= new Chunk("*大区:"+"西北财富管理事业部"+str+"*营业部:"+"第一营业部"+"\n");
Chunk reserveChunk2
= new Chunk("*理顾工号:"+"H011116"+str+"*理顾姓名:"+"王朝"+"\n");
Chunk reserveChunk3
= new Chunk("*IS工号:"+"H017563"+str+"*IS姓名:"+"张三丰"+"\n");
Chunk reserveChunk4
= new Chunk("*预约签单时间:"+"2017年10月20日"+"\n");
Chunk reserveChunk5
= new Chunk("提交日期:"+"2017年10月18日"+"\n");
Chunk reserveChunk6
= new Chunk("投保日期:"+"2017年10月22日"+"\n");
Chunk reserveChunk7
= new Chunk("拒保日期:"+"2017年10月25日"+"\n");

paragraphBlue13.add(reserveChunk1);
paragraphBlue13.add(reserveChunk2);
paragraphBlue13.add(reserveChunk3);
paragraphBlue13.add(reserveChunk4);
paragraphBlue13.add(reserveChunk5);
paragraphBlue13.add(reserveChunk6);
paragraphBlue13.add(reserveChunk7);
doc.add(paragraphBlue13);

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) {
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()));
}
}