记一次spirngMVC整合HttpPrinter的过程
目录
- 一、概述
- 二、插件对比
- 三、集成
- 四、参考
一、概述
观前提示:集成步骤在第三小节(并非完整版,需自行修改)
springMVC项目集成打印插件(对springBoot应该也适用,因为并不涉及框架,只需正确返回数据用于展示即可),旧项目用的是iReprort插件,新项目是采用新的框架,新框架因为没有集成打印插件,所以需要选择打印插件,在V2EX上看到,常用的打印插件有lodop,httpPrinter。
二、插件对比
- lodop
优点:打印功能齐全,调用简单,JS直接调用,内容也是在js设置(水平问题,只在js设置过,如果有别的方式,当我没说过)
缺点:收费(且有众多版本,各个版本的收费还不一样,因为公司项目只有小项目,收费的基本不考虑),免费版本和破解版本是打印会有水印 - HttpPrinter
优点:仅源码收费,使用无限制,打印无水印;打印功能齐全,调用简单;可以自己建模板,有完整的模板管理;集成了一些其他的功能,比如身份证信息读取、base64文件转码解码等
缺点:模板功能不是十分齐全(貌似不能插入2张以上列表,也是由于这个原因,最后停止了继续集成,所以第三节的代码并不是即取即用,有些地方是直接写死的,需要自己写活)
三、集成
- 插件下载
自行下载后解压即可:https://httpprinter.lanzous.com/b0z4x6wf(我用的是2.0.0.11版本) - 运行插件
- 模板制作
在图中的文件夹下新建一个grf模板文件来制作模板,该目录下有已经准备好的demo,可以根据需要进行参考。
4.代码集成
代码中各层所继承或实现的类或接口都是所使用框架集成的,如果你的框架没有这些东西,可以删除这部分代码
Controller层:
@Controller
@RequestMapping(value = "${adminPath}/sys/user")
public class UserController extends BaseController {@Autowiredprivate SystemService systemService;@ResponseBody@RequestMapping("testPrint")public List<User> getAllUser() {List<User> allUser = systemService.getAllUser();return allUser;}
}
Service层:
@Service
@Transactional(readOnly = true)
public class SystemService extends BaseService implements InitializingBean {@Autowiredprivate UserDao userDao;public List<User> getAllUser() {return userDao.getAllUser();}
}
Dao层:
@MyBatisDao
public interface UserDao extends CrudDao<User> {/*** 查询所有用户* @return*/public List<User> getAllUser();
}
Mapper:
<select id="getAllUser" resultType="User">selecta.name,a.mobile,a.login_name,a.email,a.no,a.del_flagfrom sys_user a
</select>
页面:
<script type="text/javascript">$(function () {$("#btnPrint").click(function () {$.ajax({url: "/demo/sys/user/testPrint",dataType: 'json',success: function (result) {if (result) {mysendprint(result);}},error: function () {Alert("系统异常,请稍后重试!");}})});function mysendprint(input) {var ip="127.0.0.1";var port="12345";var strJson1 ='${inventoryResultStr}';var formatData = JSON.stringify(input);$.post("http://"+ip+":"+port+"/printreport",{"ReportType": encodeURIComponent("gridreport"), /*报表类型 gridreport fastreport 为空 将默认为gridreport */"ReportName": encodeURIComponent("testUser.grf"), /*报表文件名 testUser */"ReportVersion": 1, /*可选。报表版本, 为空则默认1 如果本地报表的版本过低 将从 ReportUrl 地址进行下载更新*///"ReportUrl": encodeURIComponent("http://111.67.202.157:9099/report/PosTicket.grf"), /*可选。为空 将不更新本地报表 , 如果本地报表不存在可以从该地址自动下载*/"ReportUrl": encodeURIComponent(""), /*可选。为空 将不更新本地报表 , 如果本地报表不存在可以从该地址自动下载*/"Copies": 1, /*可选。打印份数,支持指定打印份数。默认1份,如果为零,不打印,只返回报表生成的pdf,jpg等文件*/"PrinterName": encodeURIComponent($("#PrinterS option:selected").text()), /*可选。指定打印机,为空的话 使用默认打印机, 请在 控制面板 -> 设备和打印机 中查看您的打印机的名称 */"PrintOffsetX": 0, /*可选。打印右偏移,单位厘米。报表的水平方向上的偏移量,向右为正,向左为负。*/"PrintOffsetY": 0, /*可选。打印下偏移,单位厘米。 报表的垂直方向上的偏移量,向下为正,向上为负。*///"token": encodeURIComponent("aa"), /*可选。只要token值在列表中 方可打印*/"taskId": encodeURIComponent("1234567"), /*可选。多个打印任务同时打印时,根据该id确定返回的是哪个打印任务。 *///"Parameter": encodeURIComponent(input.parameter),"Field": encodeURIComponent('[' ///*字段, type ftBlob (base64格式) ,ftString ftInteger ftBoolean, ftFloat, ftCurrency,ftDateTime, size (ftString 设置为实际长度,其他的设置为0,例如 ftInteger ftBlob 等设置为0 )+'{"type": "ftString", "name": "name","size": 255,"required": false},'+'{"type": "ftString", "name": "email","size": 255,"required": false},'+'{"type": "ftString", "name": "mobile","size": 255,"required": false},'+'{"type": "ftString", "name": "loginName","size": 255,"required": false},'+'{"type": "ftString", "name": "no","size": 255,"required": false},'+']'),"Data": encodeURIComponent(formatData),},function(data){data = decodeURIComponent(data);if(data==""){alert("连接HttpPrinter失败");}else{//alert(data);var obj = JSON.parse(data);//alert(obj.status);if(obj.status=="ok"){alert("打印成功");}else{alert("打印失败:"+obj.data);}var result=JSON.parse(data);console.log(data);//alert(result.data);window.open(result.data,'_blank');}});}})
</script>
- 因为只是初步集成,后台的业务只是很简单的数据返回,需要注意的一点是,前台在接收返回的json数据的时候,每一个bean的字段正确或者字段多了都是可以正常运行的,但是如果框架设置了字段为null不返回json的话,在打印的时候会报错。可以使用@JsonSerialize注解进行配置
- 代码里只是返回了一个装着User的List对象,这个是我测试偷懒的方式,正确的返回方式应该写一个Entity类来装Parameter、Field、Data字段(参考里的文章就是用的这种方式,但可惜没有源码),然后返回给前台进行配置。我的代码里没有用到Parameter,而Field是直接写死的,只有Data是从后台获取的。另外后台获取的Data是在前台是一个对象,需要先用JSON.stringify(input)方法转换成json字符串。
四、参考
1.打印组件-HttpPrinter(内含模板制作的教学视频) 作者:leagueandlegends(已失效)
记一次spirngMVC整合HttpPrinter的过程相关推荐
- 记一次网站无法访问解决过程,服务器80端口问题解决过程
记一次网站无法访问解决过程,服务器80端口问题解决过程 参考文章: (1)记一次网站无法访问解决过程,服务器80端口问题解决过程 (2)https://www.cnblogs.com/slyzly/a ...
- 记一次打包源码的过程
记一次打包源码的过程 黑客攻防 Panni_007 2013-06-28 401浏览 0评论 http://panni007.com/2013/06/28/1228.html 0×01 起因 ...
- 记一次ES整合logstash所遇的坑
记一次ES整合logstash所遇的坑 安装与ES版本的相同的logstash,例:ES版本为6.2.1,那么logstash的版本需保持一致. 下载网址:https://www.elastic. ...
- 产品设计体会(4014)记一次产品整合预研
我怎么又起了个小学生作文的题目--事情是这样的:7月份,集团下我所在的子公司A组织结构变动,我在的事业部被划分到另外一家子公司B.于是,我做的产品就需要考虑这么一件事:新情况下,这个产品如何与B现有产 ...
- 记一次SOFA内存泄漏排查过程
记一次内存泄漏排查过程 起因 某天中午大家还在安静的午休,睡得正香的时候突然被一阵手机滴-滴滴直响短信惊醒.一看是应用的服务器告警并且对应服务的所有机器都在告警"健康检查失败,自动拉下线&q ...
- 记一次查找投稿期刊的过程
本文仅用于记录自己最近投稿时,查找期刊的过程.讲道理本该是很早就应该掌握的能力,过程中也发现了自己科研的不足. 1. SCI分区 SCI是Science Citation Index的缩写,基于这个数 ...
- kafka实现异步发送_Kafka 异步消息也会阻塞?记一次 Dubbo 频繁超时排查过程
线上某服务 A 调用服务 B 接口完成一次交易,一次晚上的生产变更之后,系统监控发现服务 B 接口频繁超时,后续甚至返回线程池耗尽错误 Thread pool is EXHAUSTED.因为服务 B ...
- 记一个网络传输功能的实现过程
写在前面的话:功能是基于C/S模型的网络传输实现,要求是服务器端可以在局域网中任何机子上运行,客户端启动后自动寻找服务器端进行连接,之后,服务器端向已经连接的客户端发送命令,客户端根据命令执行相应的操 ...
- 记一次MongoDB故障排查的过程
数据技术嘉年华等你来 预告:11.16-17日,北京市东三环中路61号富力万丽酒店,相聚数据技术嘉年华,(99元票务)免费购票倒计时,点击查看大会详情. 张甦老师带来主题"双剑合璧带你走进M ...
- arcgis select by attributes一次选多个_优化体系--记一次生产数据库sql优化过程--组合索引...
概述 最近比较有空,所以看了一些问题sql,顺便优化一下,做个简单记录. 问题sql SQL(c212jfrj1m0fg) 在采样期平均单次执行逻辑读为 106205.83, 其最新执行计划涉及 2 ...
最新文章
- Momenta获C轮5亿美元融资,上汽、丰田、博世等领投 | 九合系融资新闻
- oracle分区属于什么知识,详细讲解Oracle表分区的相关概念及其优点
- ios/android代码生成FLASH可用的actionscript代码(*.ane)
- Windows 7可以体验IE10了
- nodejs,express链式反应
- html点击控制盒子左右移动,JS实现鼠标拖拽盒子移动及右键点击盒子消失效果示例...
- DBArtist之Oracle入门第1步: 如何安装Oracle 11g
- Python Matplotlib
- python可以用vs编辑吗_在VS2017中编写Python程序
- js排序的时间复杂度_各种排序算法时间复杂度
- CAD看图软件的快速搜索功能怎么用?
- SQL Server 2008 远程过程调用失败的问题解决方法
- (二)硕博生常用的外文文献检索方式推荐
- 支付宝新农合缴费显示服务器,支付宝新农合缴费怎么交
- python批量检索文献pubmed_如何使用PubMed高效检索文献
- linux test1
- 解读 “中国品牌全球信任指数”发布,中国品牌出海迎来大好时机
- Verilog 6位数码管LG3661BH 的动态显示
- 最新病毒预警--Prometei 蠕虫病毒
- java.awt中文乱码_Java AWT窗体中文乱码问题解决-百度经验