freemarker 文件

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
<title></title>
<style type="text/css">
body {
font-family: SimSun;
font-size: 12px;
} table {
border-collapse: collapse;
border-spacing: 0;
} td { } .table {
margin-top: 0;
margin-right: auto;
margin-bottom: 80;
margin-left: auto;
} .table td {
border: 1px solid #333333;
border-collapse: collapse;
padding: 7px;
} .table1 {
margin-top: 0;
margin-right: auto;
margin-left: auto;
} .table1 td {
border: 0px solid #333333;
border-collapse: collapse;
padding: 7px;
} .odct_zhangpic {
width: 160px;
height: 160px;
position: absolute;
margin-top: -110px;
clear: both;
float: none;
margin-left: 400px;
}
</style>
</head> <body>
<table width="96%" border="0" align="center" cellspacing="0">
<tr>
<td align="right">
<img src="http://www.10000show.com/static/index/images/logo.png" width="124" height="62"></img>
</td>
</tr>
<tr>
<td height="90" align="center"><h2>订单详情</h2></td>
</tr>
</table>
<table width="96%" border="0" align="center" cellspacing="0" cellpadding="0" class="table">
<h2><strong>参展企业信息</strong></h2>
<tr>
<td>公司名称</td>
<td>联系地址</td>
<td>公司电话</td>
<td>所属行业</td>
<td>公司网址</td>
<td>公司传真</td>
</tr>
<tr>
<td>${order.company?if_exists }</td>
<td>${order.com_addr?if_exists }</td>
<td>${order.telephone?if_exists }</td>
<td>${hangYe?if_exists}</td>
<td>${order.net_add?if_exists }</td>
<td> ${order.post_fax?if_exists }</td>
</tr>
</table>
<table width="96%" border="0" align="center" cellspacing="0" cellpadding="0" class="table">
<h2><strong>联系人信息</strong></h2> <tr>
<td>姓名</td>
<td>性别</td>
<td>手机</td>
<td>邮箱</td>
<td>职位</td>
<td>QQ</td>
</tr>
<tr>
<td>${order.contact_name?if_exists }</td>
<td>${sex?if_exists}</td>
<td>${order.contact_phone?if_exists }</td>
<td>${order.mail?if_exists }</td>
<td>${order.job?if_exists }</td>
<td>${order.qq?if_exists }</td>
</tr>
</table>
<table width="96%" border="0" align="center" cellspacing="0" cellpadding="0" class="table">
<h2><strong>参展展品</strong></h2>
<p>${exhiProduct?if_exists }</p>
</table> <table width="96%" border="0" align="center" cellspacing="0" cellpadding="0" class="table">
<h2><strong>展位信息</strong></h2>
<#if order.exhi_type ??>
<tr>
<td>展位类型</td>
<td>展位购买数量</td>
<td>展位信息</td>
<td>展位配置</td>
<td>展位意向</td>
</tr>
<tr>
<td>${order.exhi_type?if_exists }</td>
<td>
<#if order.exhi_num==0>
<span>1</span>
<#else>
<span>${order.exhi_num?if_exists }</span>
</#if>
</td>
<td>
<#if zhanweis??>
<#list zhanweis as zhanwei> <span>展位编号:</span>
<span>${zhanwei.bianHao?if_exists }</span>
<span>展位面积:</span>
<span>${zhanwei.mianJi?if_exists }</span>
<span>开口类型:</span>
<span>${kaiKou?if_exists}</span> </#list> <#else> <span>展位面积:</span>
<span>${order.zhan_wei_total_area?if_exists }</span>
<span>开口类型:</span>
<span>${kaiKouType?if_exists}</span> </#if>
</td>
<td>${zhanWeiPeiZhi?if_exists }</td>
<td>${order.exhi_yi_xiang?if_exists }</td>
</tr>
<#else>
<span>无</span>
</#if>
</table> <#if order.bill_money ??>
<#else>
<table width="96%" border="0" align="center" cellspacing="0" cellpadding="0" class="table">
<h2><strong>发票信息</strong></h2>
<p>发票类型: 不开发票</p>
</table>
</#if>
<#if order.bill_title ??>
<table width="96%" border="0" align="center" cellspacing="0" cellpadding="0" class="table">
<h2><strong>发票信息</strong></h2>
<tr>
<td>发票金额</td>
<td>发票明细</td>
<td>发票抬头</td>
<td>收件人</td>
<td>邮寄地址</td>
<td>邮政编码</td>
<td>手机</td>
<td>固定电话</td>
</tr>
<tr>
<td>${order.bill_money?if_exists }元</td>
<td>${order.bill_detail?if_exists }</td>
<td>${order.bill_title?if_exists }</td>
<td>${order.post_man?if_exists }</td>
<td>${order.province?if_exists}${order.city?if_exists}${order.post_address?if_exists }</td>
<td>${order.post_code?if_exists }</td>
<td>${order.phone?if_exists }</td>
<td>${order.fixed_phone?if_exists }</td>
</tr>
</table>
</#if> <table width="96%" border="0" align="center" cellspacing="0" cellpadding="0" class="table">
<h2><strong>支付方式</strong></h2>
<p>${tradeType?if_exists }</p>
</table> <table width="96%" border="0" align="center" cellspacing="0" cellpadding="0" class="table">
<h2><strong>支付额度</strong></h2>
<p>${payEdu?if_exists}</p>
</table> <table width="96%" border="0" align="center" cellspacing="0" cellpadding="0" class="table">
<h2><strong>积分</strong></h2>
<span>使用积分:</span>
<span>
<#if order.ji_fen ??>
<span>${order.ji_fen?if_exists }</span>
<#else>
<span>0</span>
</#if>
</span> <span>已抵扣金额</span>
<span>
<#if newJiFen ??>
<span>${newJiFen?if_exists }</span>
<#else>
<span>0</span>
</#if>
</span>
</table> <table width="96%" border="0" align="center" cellspacing="0" cellpadding="0" class="table">
<h2><strong>首单优惠金额</strong></h2>
<p>${order.shou_dan_mian?if_exists }</p>
</table> <table width="96%" border="0" align="center" cellspacing="0" cellpadding="0" class="table">
<h2><strong>参展人员信息</strong></h2>
<#if linkMans ??>
<tr>
<td>姓名</td>
<td>性别</td>
<td>手机</td>
<td>职位</td>
<td>邮箱</td>
<td>护照</td>
<td>护照有效期</td>
<td>随团</td>
</tr>
<#list linkMans as linkMan>
<tr>
<td>${linkMan.name }</td>
<td>
<#if linkMan.sex ??>
<#if linkMan.sex=='1'>
<span>男</span>
<#else>
<span>女</span>
</#if>
<#else>
</#if>
</td>
<td>${linkMan.mobile?if_exists }</td>
<td>${linkMan.position?if_exists }</td>
<td>${linkMan.email?if_exists}</td>
<td>${linkMan.passportNo?if_exists }</td>
<td>
<#if linkMan.passportExpiry ??>
${linkMan.passportExpiry?string("yyyy-MM-dd")}
<#else> </#if>
</td>
<td>随团</td>
</tr>
</#list>
<#else>
<span>无</span>
</#if> </table> <table width="96%" border="0" align="center" cellspacing="0" cellpadding="0" class="table">
<h2><strong>商品信息</strong></h2>
<tr>
<td>编号</td>
<td>名称</td>
<td>类型</td>
<td>时间</td>
<td>地点</td>
<td>展馆</td>
</tr>
<tr>
<td>${order.bian_hao?if_exists }</td>
<td>
<p>${order.ti_mu?if_exists }</p>
</td>
<td>
${productType?if_exists }
</td>
<td>
<#if order.ju_ban_time ??>
${order.ju_ban_time?string("yyyy-MM-dd")}
<#else> </#if>
</td>
<td>${order.address?if_exists }</td>
<td>
${order.ming_cheng?if_exists }
</td>
</tr>
</table>
<table width="96%" border="0" align="center" cellspacing="0" cellpadding="0" class="table">
<h2><strong>费用结算信息</strong></h2>
<tr>
<td width="14%">名称</td>
<td width="43%">单价</td>
<td width="9%">数量</td>
<td width="12%">小计</td>
</tr>
<tr>
<td>参展费</td>
<td>${order.exhi_fee?if_exists }元</td>
<td>1</td>
<td>${order.exhi_fee?if_exists }</td>
</tr>
<tr>
<td>注册费</td>
<td>
<#if order.zhu_ce_fee ??>
<span>¥</span>${order.zhu_ce_fee?if_exists } /企业
<#else>
<span>¥0 /企业</span>
</#if>
</td>
<td>1</td>
<td>
<#if order.zhu_ce_fee ??>
<span>¥</span>${order.zhu_ce_fee?if_exists }
<#else>
<span>¥0</span>
</#if>
</td>
</tr>
<tr>
<td>服务费</td>
<td>
<#if order.fu_wu_fei ??>
<span>¥</span>${order.fu_wu_fei?if_exists } /企业
<#else>
<span>¥0 /企业</span>
</#if>
</td>
<td>1</td>
<td>
<#if order.fu_wu_fei ??>
<span>¥</span>${order.fu_wu_fei?if_exists }
<#else>
<span>¥0</span>
</#if>
</td>
</tr> <tr>
<td>开口费</td>
<td>
${order.kai_kou_fee?if_exists }/企业
</td>
<td>1</td>
<td>
${order.kai_kou_fee?if_exists }
</td>
</tr> <#if order.dan_jian_cha_count gt 0>
<tr>
<td>单间差费 </td>
<td>${order.dan_jian_cha?if_exists }/人</td>
<td>${order.dan_jian_cha_count?if_exists }</td>
<td >${order.single_room_fee?if_exists }</td>
</tr>
</#if> <#if peopleCount gt 0>
<tr>
<td>参展人员费</td>
<td>
<span>¥</span>${order.zhan_wei_ren_yuan_fei?if_exists }/人
</td>
<td>${order.people_count?if_exists}</td>
<td>${order.people_fee?if_exists }</td>
</tr>
</#if> <#if order.visa_fee !=0 >
<#list visaInfo.visaInfos as v>
<#if v.type=='shangWu'>
<tr>
<td>商务签证 </td>
<td><span>¥</span>${v.price?if_exists }/人</td>
<td>${v.num?if_exists }</td>
<td>${v.price}</td>
</tr>
</#if> <#if v.type=='lvYou'>
<tr>
<td>旅游签证 </td>
<td><span>¥</span>${v.price?if_exists }/人</td>
<td>${v.num ?if_exists}</td>
<td>${v.price}</td>
</tr>
</#if>
</#list>
</#if> </table>
</body>
</html>

后台java 代码

@RequestMapping("/createOrderPdf")
public void createOrderPdf(String orderId, Model model, HttpServletResponse response, HttpServletRequest request) {
String fileName = null;
try {
Template template = null;
Configuration freeMarkerConfig = null;
Map<String, Object> map = new HashMap<String, Object>();
freeMarkerConfig = new Configuration();
freeMarkerConfig.setDirectoryForTemplateLoading(new File(SendMailUtil.getFilePath())); // 获取模板
template = freeMarkerConfig.getTemplate(SendMailUtil.getFileName("mailtemplate/orderPdf.ftl"), new Locale("Zh_cn"), "UTF-8");
OrderMain orderMain = orderMainService.get(orderId);
Map<String, Object> orderDetails = orderMainService.getOrderCanZhanDetails(orderMain);
if (orderDetails != null) {
for (String key : orderDetails.keySet()) {// 遍历获取行业
System.out.println("key" + key + "value" + orderDetails.get(key));
if ("hang_ye".equals(key)) {
String hangYe = DictUtils.getDictLabel(orderDetails.get(key).toString(), "hang_ye", "");
map.put("hangYe", hangYe);// 所属行业
} else if ("sex".equals(key)) {
String sex = DictUtils.getDictLabelss(orderDetails.get(key).toString(), "sex", "");
map.put("sex", sex);// 性别
} else if ("exhi_product".equals(key)) {
String exhiProduct = orderDetails.get(key).toString();
exhiProduct = PDFUtil.getData(exhiProduct, 50);
map.put("exhiProduct", exhiProduct);// 参展展品
} else if ("kai_kou_type".equals(key)) {
String kaiKouType = DictUtils.getDictLabelss(orderDetails.get(key).toString(), "kaikoutype", "");
map.put("kaiKouType", kaiKouType);// 开口类型
} else if ("zhan_wei_pei_zhi".equals(key)) {
String zhanWeiPeiZhi = orderDetails.get(key).toString();
zhanWeiPeiZhi = PDFUtil.getData(zhanWeiPeiZhi, 18);
map.put("zhanWeiPeiZhi", zhanWeiPeiZhi);// 展览配置
} else if ("trade_type".equals(key)) {
String tradeType = DictUtils.getDictLabelss(orderDetails.get(key).toString(), "trade_type", "");// 支付方式
map.put("tradeType", tradeType);
} else if ("pay_edu".equals(key)) {
String payEdu = DictUtils.getDictLabelss(orderDetails.get(key).toString(), "pay_edu", "");// 支付额度
map.put("payEdu", payEdu);
} else if ("ji_fen".equals(key)) {// 用户积分
String jiFen = orderDetails.get(key).toString();
if (jiFen != null && !"".equals(jiFen)) {
int newJiFen = Integer.parseInt(jiFen);
if (newJiFen > 0) {
newJiFen = newJiFen / 100;
map.put("newJiFen", newJiFen);
} else {
map.put("newJiFen", null);
}
} else {
map.put("newJiFen", null);
}
} else if ("product_type".equals(key)) {
String productType = DictUtils.getDictLabelss(orderDetails.get(key).toString(), "product_type", "");// 类型
map.put("productType", productType);
} else if ("people_count".equals(key)) {// 参展人员
String peopleCount = orderDetails.get(key).toString();
map.put("peopleCount", Integer.parseInt(peopleCount)); } }
}
String ids = (String) orderDetails.get("wx_linkman_ids");
if (StringUtils.isNotBlank(ids)) {
List<LinkMan> linkMans = linkManService.findByIds(ids);// 参展人员信息
map.put("linkMans", linkMans);
}
// 获取展位编号
ExhiMain exhiMain = new ExhiMain();
String exhiNum = (String) orderDetails.get("zhan_wei_bian_hao"); // 获取展位编号
if (StringUtils.isNotBlank(exhiNum)) {
ZhanWeis zhanWeis = GsonUtils.getGson().fromJson(exhiNum, ZhanWeis.class);
exhiMain.setZhanWeis(zhanWeis);
}
String visaString = (String) orderDetails.get("visa_info");
VisitOrder visitOrder = new VisitOrder();
if (StringUtils.isNotBlank(visaString) && !"0".equals(visaString)) {
VisaInfos visaInfo = GsonUtils.getGson().fromJson(visaString, VisaInfos.class);
visitOrder.setVisaInfos(visaInfo);
map.put("visaInfo", visaInfo);
}
map.put("order", orderDetails);
map.put("exhiMain", exhiMain); ZhanWeis newZhanWeis = exhiMain.getZhanWeis();
if (newZhanWeis != null) {
List<ZhanWei> zhanweis = newZhanWeis.getZhanweis();
map.put("zhanweis", zhanweis);
if (zhanweis != null && zhanweis.size() > 0) {// 遍历获取开口费
for (ZhanWei zw : zhanweis) {
String kaiKou = DictUtils.getDictLabel(zw.getKaiKou(), "kaikoutype", "");
map.put("kaiKou", kaiKou);
}
}
} else {
map.put("zhanweis", null);
}
Date date = new Date();
String stringDate = DateUtils.formatDate(date, "yyyy-MM-dd_HH_mm_ss");
fileName = stringDate + ".pdf"; // 生成pdf文件保存路径
// 模板内容转换为string
String htmlStr = FreeMarkerTemplateUtils.processTemplateIntoString(template, map);
response.reset();
response.setContentType("application/octet-stream; charset=utf-8");
response.setHeader("Content-Disposition", "attachment; filename=" + Encodes.urlEncode(fileName));
PdfGenerator.generate(htmlStr, response.getOutputStream());
} catch (Exception e) {
e.printStackTrace();
}

输出到PDF文件方法

/**
* Output a pdf to the specified outputstream
*
* @param htmlStr the htmlstr
* @param out the specified outputstream
* @throws Exception
*/
public static void generate(String htmlStr, OutputStream out)
throws Exception { DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.parse(new ByteArrayInputStream(htmlStr.getBytes("utf-8")));
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(doc, null); //中文问题,同时body里面也要设置,windows环境
String simsunPath=ServletContextFactory.getServletContext().getRealPath("/WEB-INF/classes/fonts/simsun.ttc");
renderer.getFontResolver().addFont(simsunPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
// renderer.getFontResolver().addFont("C:/Windows/Fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); //中文问题,同时body里面也要设置,liunx环境
// renderer.getFontResolver().addFont("/usr/share/fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
// 解决图片的相对路径问题
// renderer.getSharedContext().setBaseURL("file:/D:/index/"); renderer.layout();
renderer.createPDF(out);
out.close();
}

freemarker作为PDF模板实现下载功能的更多相关文章

  1. freemarker 作为 word 模板实现下载功能

    1:新建一个.doc 文档写好自己要导出文字如下图 2:把word 文档另存为xml 格式的文件用编辑器打开如图下,(如果你打开文件里面的标签没换行格式,那么你在myeclipse 新建一个jsp 文 ...

  2. opencart 3添加pdf文档下载功能

    opencart 3适合做外贸商城,如果能在产品页那边添加pdf文档功能是最好的,符合国外用户的使用习惯,增加客户的黏性.其实opencart已经有一个downloadable product可下载产 ...

  3. 不会吧不会吧,还有开发不会Java填充PDF模板数据的,赶紧看看吧

    思路 根据业务需求,获取实际业务数据,借助itext库功能,将业务数据填充入提前制作好的PDF模板中 操作步骤 制作PDF模板:提前下载好Adobe Acrobat Pro DC 效果展示 准备PDF ...

  4. 根据现有PDF模板填充信息(SpringBoot)

    根据现有PDF模板填充信息(SpringBoot+maven) 首先得有一个pdf模板,建立pdf模板需要下载工具 红色框为文本框,filename为域名.java需要根据域名赋值 pom 文件配置 ...

  5. 创建PDF模板,java添加内容、导出下载PDF

    本文主要内容是:用java在pdf模板中加入数据,图片. 废话不多说,举个非常简单的例子: 首先创建word文档,导出PDF. 用 软件adobe acrobat打开,操作步骤如图: 在指定位置添加文 ...

  6. springMVC(3)---利用pdf模板下载

    springMVC(3)---利用pdf模板下载 在实际开发中,很多时候需要通过把数据库中的数据添加到pdf模板中,然后供客户下载,那我们该如何中呢? 本文主要内容是:用java在pdf模板中加入数据 ...

  7. 在js内生成PDF文件并下载的功能实现(不调用后端),以及生成pdf时换行的格式不被渲染,word-break:break-all

    在js内生成PDF文件并下载的功能实现(不调用后端),以及生成pdf时换行的格式不被渲染,word-break:break-all 前天来了个新需求, 有一个授权书的文件要点击下载, 需要在前端生成, ...

  8. 利用PDF.JS插件解决了本地pdf文件在线浏览问题(根据需要隐藏下载功能,只保留打印功能)

    我是在IE11和谷歌上做的测试,都可以显示,把做出的东西记录下来,方便大家还有自己学习! 可以在IIS7服务器上也可以下载Tomcat来做服务器 Tomcat下载地址   http://pan.bai ...

  9. 使用iTextSharp来填充PDF模板文件

    需求简介:     遇到了这样一个需求:某公司需要为所有用户的培训生成一个培训记录,过程如下:     (1)用户在培训完之后会进入到一个填写信息的界面.     (2)用户填写信息.     (3) ...

随机推荐

  1. Ip2Region IP转化地址位置

    Ip2Region有中文和数据结构支持,是一个很好的第三方ip转换工具. java: <dependency> <groupId>org.lionsoul</groupI ...

  2. Linux动态库路径配置

    参考链接:https://blog.csdn.net/blade2001/article/details/32839937 为什么要关注动态库路径配置,是因为工作中遇到动态库依赖其他动态库,而其他动态 ...

  3. POJ - 1845 Sumdiv(分治)

    题意:求$A^{B}$的所有约数之和$mod\ 9901$ 思路:由结论有,一个数$n$进行质因数分解得到$n={p_{1}}^{c_{1}} * {p_{2}}^{c_{2}} *...* {p_{ ...

  4. 【PAT甲级】1082 Read Number in Chinese (25 分)

    题意: 输入一个九位整数,输出它的汉字读法(用拼音表示). trick: 字符串数组""其实会输出一个空格,而不是什么都不输出,导致测试点0和4格式错误. AAAAAccepted ...

  5. 分布式系统(二) --SOA 以及一些网络通信协议TCP/UDP SYN攻击

    SOA(面向服务的架构):Service Oriented Architecture面向服务的架构.也就是把工程拆分成服务层.表现层两个工程.服务层中包含业务逻辑,只需要对外提供服务即可.表现层只需要 ...

  6. python中的分号(“;”)

    在C.Java等语言的语法中规定,必须以分号作为语句结束的标识.Python也支持分号,同样用于一条语句的结束标识.但在Python中分号的作用已经不像C.Java中那么重要了,Python中的分号可 ...

  7. iOS开发之通过Framework建立项目依赖

    https://www.jianshu.com/p/d146db167bf3 项目开发时经常会遇到个别模块想打包成framework的情况,传统的打包方式太繁琐,反复测试时很麻烦,不如一个项目管理来得 ...

  8. js的JSON新方法和历史记录管理

    今天看妙味的视频,一下是一些简单的笔记: 1.JSON的一些新方法: JSON.stringify(); JSON.parse(); 第一个是把js脚本转换成JSON的字符串形式. 而第二个则是吧这种 ...

  9. Linux :ls 命令

    常用命令: ls:列出当前路径下的文件和目录 ls -a:列出当前路径下的所有文件和目录(包括隐藏文件和目录) ls -l:以列表方式显示文件或目录的详细信息 ls -al:可以结合使用 ls xxx ...

  10. Vue 实现全局使用sass, less变量

    首先   运行这行命令 npm install sass-resources-loader --save-dev: 在项目的build/utils.js中,找到 function generateLo ...