目录

  • 一、概述
  • 二、插件对比
  • 三、集成
  • 四、参考

一、概述

观前提示:集成步骤在第三小节(并非完整版,需自行修改)
springMVC项目集成打印插件(对springBoot应该也适用,因为并不涉及框架,只需正确返回数据用于展示即可),旧项目用的是iReprort插件,新项目是采用新的框架,新框架因为没有集成打印插件,所以需要选择打印插件,在V2EX上看到,常用的打印插件有lodop,httpPrinter。

二、插件对比

  1. lodop
    优点:打印功能齐全,调用简单,JS直接调用,内容也是在js设置(水平问题,只在js设置过,如果有别的方式,当我没说过)
    缺点:收费(且有众多版本,各个版本的收费还不一样,因为公司项目只有小项目,收费的基本不考虑),免费版本和破解版本是打印会有水印
  2. HttpPrinter
    优点:仅源码收费,使用无限制,打印无水印;打印功能齐全,调用简单;可以自己建模板,有完整的模板管理;集成了一些其他的功能,比如身份证信息读取、base64文件转码解码等
    缺点:模板功能不是十分齐全(貌似不能插入2张以上列表,也是由于这个原因,最后停止了继续集成,所以第三节的代码并不是即取即用,有些地方是直接写死的,需要自己写活)

三、集成

  1. 插件下载
    自行下载后解压即可:https://httpprinter.lanzous.com/b0z4x6wf(我用的是2.0.0.11版本)
  2. 运行插件

  3. 模板制作
    在图中的文件夹下新建一个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的过程相关推荐

  1. 记一次网站无法访问解决过程,服务器80端口问题解决过程

    记一次网站无法访问解决过程,服务器80端口问题解决过程 参考文章: (1)记一次网站无法访问解决过程,服务器80端口问题解决过程 (2)https://www.cnblogs.com/slyzly/a ...

  2. 记一次打包源码的过程

    记一次打包源码的过程  黑客攻防  Panni_007  2013-06-28  401浏览  0评论 http://panni007.com/2013/06/28/1228.html 0×01 起因 ...

  3. 记一次ES整合logstash所遇的坑

    记一次ES整合logstash所遇的坑 安装与ES版本的相同的logstash,例:ES版本为6.2.1,那么logstash的版本需保持一致. ​ 下载网址:https://www.elastic. ...

  4. 产品设计体会(4014)记一次产品整合预研

    我怎么又起了个小学生作文的题目--事情是这样的:7月份,集团下我所在的子公司A组织结构变动,我在的事业部被划分到另外一家子公司B.于是,我做的产品就需要考虑这么一件事:新情况下,这个产品如何与B现有产 ...

  5. 记一次SOFA内存泄漏排查过程

    记一次内存泄漏排查过程 起因 某天中午大家还在安静的午休,睡得正香的时候突然被一阵手机滴-滴滴直响短信惊醒.一看是应用的服务器告警并且对应服务的所有机器都在告警"健康检查失败,自动拉下线&q ...

  6. 记一次查找投稿期刊的过程

    本文仅用于记录自己最近投稿时,查找期刊的过程.讲道理本该是很早就应该掌握的能力,过程中也发现了自己科研的不足. 1. SCI分区 SCI是Science Citation Index的缩写,基于这个数 ...

  7. kafka实现异步发送_Kafka 异步消息也会阻塞?记一次 Dubbo 频繁超时排查过程

    线上某服务 A 调用服务 B 接口完成一次交易,一次晚上的生产变更之后,系统监控发现服务 B 接口频繁超时,后续甚至返回线程池耗尽错误 Thread pool is EXHAUSTED.因为服务 B ...

  8. 记一个网络传输功能的实现过程

    写在前面的话:功能是基于C/S模型的网络传输实现,要求是服务器端可以在局域网中任何机子上运行,客户端启动后自动寻找服务器端进行连接,之后,服务器端向已经连接的客户端发送命令,客户端根据命令执行相应的操 ...

  9. 记一次MongoDB故障排查的过程

    数据技术嘉年华等你来 预告:11.16-17日,北京市东三环中路61号富力万丽酒店,相聚数据技术嘉年华,(99元票务)免费购票倒计时,点击查看大会详情. 张甦老师带来主题"双剑合璧带你走进M ...

  10. arcgis select by attributes一次选多个_优化体系--记一次生产数据库sql优化过程--组合索引...

    概述 最近比较有空,所以看了一些问题sql,顺便优化一下,做个简单记录. 问题sql SQL(c212jfrj1m0fg) 在采样期平均单次执行逻辑读为 106205.83, 其最新执行计划涉及 2 ...

最新文章

  1. Momenta获C轮5亿美元融资,上汽、丰田、博世等领投 | 九合系融资新闻
  2. oracle分区属于什么知识,详细讲解Oracle表分区的相关概念及其优点
  3. ios/android代码生成FLASH可用的actionscript代码(*.ane)
  4. Windows 7可以体验IE10了
  5. nodejs,express链式反应
  6. html点击控制盒子左右移动,JS实现鼠标拖拽盒子移动及右键点击盒子消失效果示例...
  7. DBArtist之Oracle入门第1步: 如何安装Oracle 11g
  8. Python Matplotlib
  9. python可以用vs编辑吗_在VS2017中编写Python程序
  10. js排序的时间复杂度_各种排序算法时间复杂度
  11. CAD看图软件的快速搜索功能怎么用?
  12. SQL Server 2008 远程过程调用失败的问题解决方法
  13. (二)硕博生常用的外文文献检索方式推荐
  14. 支付宝新农合缴费显示服务器,支付宝新农合缴费怎么交
  15. python批量检索文献pubmed_如何使用PubMed高效检索文献
  16. linux test1
  17. 解读 “中国品牌全球信任指数”发布,中国品牌出海迎来大好时机
  18. Verilog 6位数码管LG3661BH 的动态显示
  19. 最新病毒预警--Prometei 蠕虫病毒
  20. java.awt中文乱码_Java AWT窗体中文乱码问题解决-百度经验

热门文章

  1. Vb股票实时交易数据采集源码
  2. visio 如何画光学器件
  3. Unity3D 去色Shader实现
  4. java8的下载与安装(网上教程的安装方法)
  5. Java8下载安装详细教程,环境配置,Java、jre下载安装教程,此电脑图标位置,电脑处理器版本查询查询
  6. 使用fiddler4进行微信小程序抓包
  7. 华为交换机S3700基本配置
  8. 锐捷客户端了解网络架构
  9. 腾讯云+宝塔+tomcat / nginx部署前端代码
  10. AXURE 9 # 汉化教程