Freemarker+thymeleaf应用实现打印银行小票

news2024/11/25 12:50:03

背景:最近项目里有个需求,需要动态配置一个模板,来打印各种不同银行或者其他行业的小票,下面小小记录一下实现过程。

关键词:Springboot, thymeleaf, Freemarker,html2image

一,引入依赖

<dependency>
	    <groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

<dependency>
	<groupId>org.xhtmlrenderer</groupId>
	<artifactId>core-renderer</artifactId>
	<version>R8</version>
</dependency>
<dependency>
	<groupId>com.github.xuwei-k</groupId>
	<artifactId>html2image</artifactId>
	<version>0.1.0</version>
</dependency>
<!-- freemarker模板引擎-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

二,准备数据

1,动态配置的字段

2,组装成需要的数据结构

 

三,配置动态模板 

这里是关键,需要遍历数据,并判断数据中属性

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/html">
<head>
    <meta charset="utf-8"/>
    <style>
        table {
font-family: "Times New Roman", serif;
}
    </style>
    <title>FreeMarker</title>
</head>

<body>
    <table border="0" width="300">
        <#if data??>
            <#list data as item>
                <#if item.showTitle>
                    <#if item.newLine>
                        <tr>
                            <td colspan="3" style="text-align: left; font-size: ${item.titleFontSize};">${item.fieldName}:</td>
                        </tr>
                        <tr>
                            <td colspan="3" style="text-align: ${item.position}; font-weight: ${item.fontStyle}; font-size:${item.fontSize};">${item.fieldValue}</td>
                        </tr>
                    <#else>
                        <#if item.mergeToTitle>
                            <tr>
                                <td colspan="3" style="text-align: ${item.position}; font-weight: ${item.fontStyle};font-size: ${item.fontSize};">${item.fieldName}: ${item.fieldValue}</td>
                            </tr>
                        <#else>
                            <tr>
                                <td style="text-align: left; font-weight: ${item.fontStyle};font-size: ${item.titleFontSize};">${item.fieldName}:</td>
                                <td colspan="2" style="text-align: ${item.position}; font-weight: ${item.fontStyle}; font-size: ${item.fontSize};">${item.fieldValue}</td>
                            </tr>
                        </#if>
                    </#if>
                <#else>
                    <#if item.fieldCode=='amountTitleLine'>
                        <tr>
                            <td style="text-align: left; font-size: 12px; width: 20%">TYPE</td>
                            <td style="text-align: center; font-size: 12px; width: 60%">SUM</td>
                            <td style="text-align: right; font-size: 12px; width: 20%">AMOUNT</td>
                        </tr>
                    <#elseif item.fieldCode=='creditCard'>
                        <tr>
                            <td colspan="3" style="text-align: left; font-size: ${item.fontSize}; width: 20%">${item.fieldName}</td>
                        </tr>
                        <tr>
                            <td style="text-align: left; font-size: ${item.fontSize}; width: 20%">SALE</td>
                            <td style="text-align: center; font-size: ${item.fontSize}; width: 60%">${creditCard.creditSaleCount}</td>
                            <td style="text-align: right; font-size: ${item.fontSize}; width: 20%">${creditCard.creditSaleAmount}</td>
                        </tr>
                        <tr>
                            <td style="text-align: left; font-size: ${item.fontSize}; width: 20%">VOID</td>
                            <td style="text-align: center; font-size: ${item.fontSize}; width: 60%">${creditCard.creditVoidCount}</td>
                            <td style="text-align: right; font-size: ${item.fontSize}; width: 20%">${creditCard.creditVoidAmount}</td>
                        </tr>
                    <#elseif item.fieldCode=='debitCard'>
                        <tr>
                            <td colspan="3" style="text-align: left; font-size: ${item.fontSize}; width: 20%">${item.fieldName}</td>
                        </tr>
                        <tr>
                            <td style="text-align: left; font-size: ${item.fontSize}; width: 20%">SALE</td>
                            <td style="text-align: center; font-size: ${item.fontSize}; width: 60%">${debitCard.debitSaleCount}</td>
                            <td style="text-align: right; font-size: ${item.fontSize}; width: 20%">${debitCard.debitSaleAmount}</td>
                        </tr>
                        <tr>
                            <td style="text-align: left; font-size: ${item.fontSize}; width: 20%">REFUND</td>
                            <td style="text-align: center; font-size: ${item.fontSize}; width: 60%">${debitCard.debitRefundCount}</td>
                            <td style="text-align: right; font-size: ${item.fontSize}; width: 20%">${debitCard.debitRefundAmount}</td>
                        </tr>
                        <tr>
                            <td style="text-align: left; font-size: ${item.fontSize}; width: 20%">CASHBACK</td>
                            <td style="text-align: center; font-size: ${item.fontSize}; width: 60%">${debitCard.debitCashbackCount}</td>
                            <td style="text-align: right; font-size: ${item.fontSize}; width: 20%">${debitCard.debitCashbackAmount}</td>
                        </tr>
                    <#elseif item.fieldCode=='allCards'>
                        <tr>
                            <td colspan="3" style="text-align: left; font-size: ${item.fontSize}; width: 20%">${item.fieldName}</td>
                        </tr>
                        <tr>
                            <td style="text-align: left; font-size: ${item.fontSize}; width: 20%">SALE</td>
                            <td style="text-align: center; font-size: ${item.fontSize}; width: 60%">${allCards.totalSaleCount}</td>
                            <td style="text-align: right; font-size: ${item.fontSize}; width: 20%">${allCards.totalSaleAmount}</td>
                        </tr>
                        <tr>
                            <td style="text-align: left; font-size: ${item.fontSize}; width: 20%">REFUND</td>
                            <td style="text-align: center; font-size: ${item.fontSize}; width: 60%">${allCards.totalRefundCount}</td>
                            <td style="text-align: right; font-size: ${item.fontSize}; width: 20%">${allCards.totalRefundAmount}</td>
                        </tr>
                    <#elseif item.fieldCode=='totalAmoutEnd'>
                        <tr>
                            <td style="text-align: left; font-size: ${item.fontSize}; width: 20%">${item.fieldName}</td>
                            <td style="text-align: center; font-size: ${item.fontSize}; width: 60%">${totalAmoutEnd.totalCount}</td>
                            <td style="text-align: right; font-size: ${item.fontSize}; width: 20%">${totalAmoutEnd.totalAmount}</td>
                        </tr>
                    <#else>
                        <#if item.fieldCode=='bankLogo'>
                            <tr>
                                <td colspan="3" style="text-align: ${item.position};">
                                    <img src="${item.fieldValue}" width="250" height="100" alt="BankLogo"/>
                                </td>
                            </tr>
                        <#elseif item.fieldCode='emptyLine'>
                            <tr>
                                <td colspan="3" style="height:15px;">
                                </td>
                            </tr>
                        <#elseif item.fieldCode='grayLine'>
                            <tr>
                                <td colspan="3">
                                    <hr style="border: none; border-bottom:1px solid black"/>
                                </td>
                            </tr>
                        <#else>
                            <tr>
                                <td colspan="3" style="text-align: ${item.position}; font-weight: ${item.fontStyle}; font-size: ${item.fontSize};">${item.fieldValue}</td>
                            </tr>
                        </#if>
                    </#if>
                </#if>
            </#list>
        <#else>
        </#if>
    </table>
</body>

</html>

四,结果展示

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/876418.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

汉诺塔:传说中的智慧游戏

文章目录 前言规则概述数学原理核心Java代码实现结语 前言 汉诺塔&#xff08;Hanoi Tower&#xff09;&#xff0c;又称汉诺塔游戏&#xff0c;是源自印度古老传说的经典智力游戏。这个谜题的起源被认为与印度的寺庙有关&#xff0c;是由僧侣们传承的智慧游戏。汉诺塔塔座包含…

【Java】Web应用的文件上传下载

&#x1f384;欢迎来到边境矢梦的csdn博文&#x1f384; &#x1f384;本文主要梳理Web应用的文件上传下载&#x1f384; &#x1f308;我是边境矢梦&#xff0c;一个正在为秋招和算法竞赛做准备的学生&#x1f308; &#x1f386;喜欢的朋友可以关注一下&#x1faf0;&#x1…

日撸java三百行day84-87

文章目录 说明1. 网络结构与参数1.1 单层1.2 多层管理 2. CNN网络构建2.1 构建CNN网络建构2.2 初始化卷积神经网络FullCnn对象2.3 获取数据集2.4 训练数据2.4.1 前向传播函数forward2.4.1.1 CONVOLUTION卷积层2.4.1.2 SAMPLING 池化层2.4.1.3 OUTPUT 输出层 2.4.2 反向传播函数…

【华为Datacom 综合拓扑案例—分享篇】

拓扑图 题目要求 实验要求&#xff1a; 1、PC1\PC2\PC3\PC4采用DHCP自动获取IP地址&#xff0c;SW5作为服务器&#xff0c;SW3和SW4作为中继 创建地址池ip pool huawei1和ip pool huawei2&#xff0c;租期都为2天 2、SW3与SW4做链路聚合&#xff0c;采用LACP模式。SW3作为主…

tauri-react:快速开发跨平台软件的架子,支持自定义头部和窗口阴影效果

tauri-react 一个使用 taurireacttsantd 开发跨平台软件的模板&#xff0c;支持窗口头部自定义和窗口阴影&#xff0c;不用再自己做适配了&#xff0c;拿来即用&#xff0c;非常 nice。 开原地址&#xff1a;GitHub - Sjj1024/tauri-react: 一个最基础的使用tauri和react开发…

web测试与app测试的区别

web测试与app测试的区别 首先从系统架构来看的话&#xff1a; web项目&#xff0c;一般都是b/s架构&#xff0c;基于浏览器的&#xff0c;而app则是c/s的&#xff0c;必须要有客户端。那么在系统测试测试的时候就会产生区别了。 web测试只要更新了服务器端&#xff0c;客户端…

黑客利用 Facebook 漏洞,发起网络钓鱼攻击

Bleeping Computer 网站披露&#xff0c;网络攻击者利用 Salesforce 电子邮件服务和 SMTP 服务器中的漏洞&#xff0c;针对一些特定的 Facebook 账户发起复杂的网络钓鱼活动。 据悉&#xff0c;网络攻击者利用 Salesforce 等具有良好信誉的电子邮件网关分发网络钓鱼电子邮件&am…

YOLO v8目标跟踪详细解读(二)

上一篇&#xff0c;结合代码&#xff0c;我们详细的介绍了YOLOV8目标跟踪的Pipeline。大家应该对跟踪的流程有了大致的了解&#xff0c;下面我们将对跟踪中出现的卡尔曼滤波进行解读。 1.卡尔曼滤波器介绍 卡尔曼滤波&#xff08;kalman Filtering&#xff09;是一种利用线性…

网络安全(白帽黑客)大厂面试题

2023年过去了一大半&#xff0c;马上要到金九银十了 先来灵魂三连问&#xff0c;年初定的目标完成多少了&#xff1f;薪资涨了吗&#xff1f;女朋友找到了吗&#xff1f; ​好了&#xff0c;不扎大家的心了&#xff0c;接下来进入正文。 由于我之前写了不少网络安全技术相关的…

誉天HCIA-DataCom课程简介

总课时48小时&#xff0c;每天6课时&#xff0c;共8天 第一天 数据通信网络基础 1.区分网络通信和数据通信网络的概念 2.描述信息传递过程 3.区分不同网络设备&#xff0c;了解基本作用 4.认识不同网络类型以及拓扑类型 网络参考模型 1.理解数据的定义以及传递过程 2.理解网络…

精益制造的基础

一、相关概念 1、技术价值流 定义&#xff1a;把业务构想转化为向客户交付价值的、由技术驱动的服务所需要的流程 2、度量价值流性能指标 前置时间&#xff1a;工单创建后开始计时&#xff0c;到工作完成时结束 处理时间&#xff1a;从实际开始处理工作&#xff0c;到工作完成 …

智能工单系统是什么?它对企业后勤管理有什么作用?

智能工单系统是一种可以按照高度定制化的可视化流程进行设计和操作的工单系统&#xff0c;是报修、售后系统与工单系统的完美结合。与目前市场上的工单系统相比&#xff0c;的修智能工单系统对传统工单模板的操作方式进行了创新&#xff0c;而简单的工作台却没有失去任何工单功…

【从零学习python 】21.Python中的元组与字典

文章目录 元组一、访问元组二、修改元组三、count, index四、定义只有一个数据的元组五、交换两个变量的值 字典介绍一、列表的缺点二、字典的使用进阶案例 元组 Python的元组与列表类似&#xff0c;不同之处在于元组的元素不能修改。元组使用小括号&#xff0c;列表使用方括号…

亚马逊店铺推新品要注意什么?这些要点要牢记!

众所周知&#xff0c;对于一个亚马逊店铺而言&#xff0c;保持一定速度的产品更新换代是很有必要的&#xff0c;如果说产品不进行更新换代的话&#xff0c;随着消费者的需求发生改变&#xff0c;产品是很难有一个好销量的。 产品不断的更新换代&#xff0c;才能够更好的迎合消…

快速了解steam、csgo游戏搬砖,steam搬砖项目分享

科思创业汇 大家好&#xff0c;这里是科思创业汇&#xff0c;一个轻资产创业孵化平台。赚钱的方式有很多种&#xff0c;我希望在科思创业汇能够给你带来最快乐的那一种&#xff01; 我相信你对移动游戏并不陌生&#xff0c;但有些朋友不应该听说过steam和csgo这个词。steam是…

【javaweb】学习日记Day2 - JavaScript入门

目录 一、引入方式 1、内部脚本 2、外部脚本 二、基础语法 1、输出语句 2、定义变量类型 3、数据类型 4、运算符 &#xff08;1&#xff09;类型转换 5、函数 &#xff08;1&#xff09;方法一 &#xff08;2&#xff09;方法二 三、对象 1、Array数组 &#x…

自学stm32,需要会到什么程度能找到一份工作?

学STM32&#xff0c;想要找到一份工作&#xff0c;需要具备以下基本条件和技能&#xff1a;掌握新建工程和调试工程的基本操作&#xff0c;熟悉使用官方的STM32CubeIDE等开发工具。熟悉C语言编程&#xff0c;理解基本的语法和编程概念&#xff0c;对汇编语言有一定了解。熟悉ST…

国产商业漫画:题材、趋势与作者分析

国产商业漫画分析 本文是关于当前国产商业漫画市场的小研究&#xff0c;分析所用数据都是从漫画网站上直接爬取的。这里我选择的数据来源有两个&#xff0c;一个是当前收录商业化国漫最多的快看漫画&#xff0c;另一个是使用用户最多、以日漫为主的动漫之家。 在这篇分析里&a…

搭建openGauss 5.0 一主一从复制集群

openGauss是一款支持SQL2003标准语法&#xff0c;支持主备部署的高可用关系型国产数据库。 多种存储模式支持复合业务场景&#xff0c;新引入提供原地更新存储引擎。NUMA化数据结构支持高性能。Paxos一致性日志复制协议&#xff0c;主备模式&#xff0c;CRC校验支持高可用。支…

【Altium Designer】AD封装库+3D模型(2.95G)

【Altium Designer】AD封装库3D模型(2.95G) 如何添加3D封装库 https://blog.csdn.net/qq_42057393/article/details/115558858 组成 常用芯片封装 电阻 电容 电感 常用芯片 74系列芯片STC系列芯片ST系列芯片电源芯片通讯系列芯片未分类IC 晶体管 二极管三极管MOS管整流…