Lodopfuncs.js(打印插件)使用小记-springboot

这两天研究这打印的js插件,html上图:

 

下载地址:http://www.lodop.net/download.html

下载好后,里面比较重要的就是这几个文件,因为他需要一些插件的支持,所以exe有必要的情况下最好放在你网页可以下载的地方,然后修改其js的引用路径,这样当客户没有安装exe的时候,可以直接在页面上下载exe来安装,下载后的html估计都是些打印样板,具体不深究,这里只说些用法。

1、项目使用的是sprintboot加上maven管理的,第一步是放置js和其exe文件。

分别新建两个文件夹在static文件夹下,一个叫js文件夹,把Lodopfuncs.js放入这个文件夹,一个叫lodop文件夹,把三个exe放入该文件夹,然后记得在application.properties下写上静态映射:

spring.mvc.static-path-pattern=/static/**

2.首页NewFile-print.html

controller中添加映射

@GetMapping("/indexprint")
    public String indexprint() {
        return "/modelhtml/NewFile-print";
    }

@GetMapping("/testPrint-native")
    public String testPrintNative() {
        return "/modelhtml/purchase-and-sale-contract";
    }

html内容:这里设置了一个保存按钮,因为如果你想要写在input框里的内容能打印的话,需要setAttribute赋值才行,直接写在页面是无法打印你新写的东西的

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head lang="en">
    <meta charset="UTF-8"/>
    <title>
    index page
    </title>
    <link rel="stylesheet" type="text/css" th:href="@{/static/js/bootstrap4/css/bootstrap.min.css}"/>
    <script th:src="@{/static/js/LodopFuncs.js}"></script>
    <object id="LODOP_OB" classid="clsid:2105C259-1E0C-4534-8141-A753534CB4CA" width="0" height="0">
    <embed id="LODOP_EM" type="application/x-print-lodop" width="0" height="0" pluginspage="/static/lodop/install_lodop32.exe">
    </embed>
    </object>
</head>
<body>

<div style = "margin-top: 10px; margin-left:10px; argin-buttom:20px">
<input id = "button" type="button" value="点击保存页面的内容"  onClick = "testPrintSave()"></input>
<br></br>
<br></br>
<input id = "button6" type="button" value="点击测试打印-非浏览器-LodopFuncs.js"  onClick = "print()"></input>
<br></br>
<iframe id ="testIframe" style="text-align:center;margin-left: 10px;margin-top:10px" 
     src = "/testPrint-native" width='900' height='800'></iframe>
</div>
<textarea rows="15"  cols="80" style="display: none;" id="textarea011">
<table border="1" width="360" height="220" style="border-collapse:collapse; border:solid 1px" bordercolor="#000000">
  <tr>
    <td width="100%" height="240">
  
      <font face="隶书" size="5" style="letter-spacing: 10px">郭德强</font>
      <p align="center"><font face="宋体" size="3">科学家</font></p>
      <p align="left"><font face="宋体" size="3"> 地址:中国北京社会科学院附近东大街西胡同</font></p>
      <p align="left"><font face="宋体" size="3"> 电话:010-88811888</font></p>
      <br></br>       
    
    </td>
  </tr>
</table>
</textarea>  
</body>
 <script  type="text/javascript" src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script>
 <script type="text/javascript">
/*<![CDATA[ */
var ctxPath = "";
//存储
function testPrintSave(){
	var htDoc = document.getElementById('testIframe').contentWindow.document;
	var setparam = htDoc.getElementsByClassName("setparam");
	for(var i=0;i<setparam.length;i++){
		setparam[i].setAttribute("value",setparam[i].value);
	}
	alert("保存成功!");
	/* var c = htDoc.documentElement.outerHTML;
	var printer = document.getElementById("testIframe").contentWindow;
	printer.document.body.innerHTML = c;
	printer.print();
	
	setTimeout(function(){
		var htDoc22 = document.getElementById('testIframe').contentWindow.document;
		console.log("点击打印按钮后的延时方法执行 ");
		htDoc22.getElementById('restore-listener').click();
	},500); */
}

var LODOP; //声明为全局变量   
//页面下载打印
function print() {
	var htm =document.getElementById("testIframe").value;
	var url1='/testPrint-native';
	var url= '/testPrint';
    $.ajax({
        url: url,
        data: {id: 1},
        success: function (rsData) {
        	LODOP = getLodop(document.getElementById('LODOP_OB'), document.getElementById('LODOP_EM'));
        	var missionName = "打印任务名111";
        	var htDoc = document.getElementById('testIframe').contentWindow.document;
        	var printinfo = "";
            printinfo = htDoc.documentElement.outerHTML;
        	alert("任务:"+missionName+"-"+printinfo);
        	LODOP.PRINT_INIT(missionName); //首先一个初始化语句 
        	//LODOP.ADD_PRINT_HTM(10,55,"100%","100%",document.getElementById("textarea011").value);
        	LODOP.ADD_PRINT_HTM(0,0,"100%","100%",printinfo);          
        	//LODOP.ADD_PRINT_URL(0,0,"100%","100%",url1);//然后多个ADD语句及SET语句 
        	//LODOP.SET_SHOW_MODE("MESSAGE_PARSING_URL","");//该语句隐藏进度条或修改提示信息
        	LODOP.PREVIEW();
        	//LODOP.PRINT();                               //最后一个打印(或预览、维护、设计)语句
            
        }
    });
}

/*]]>*/
</script>
<script th:src="@{/static/js/bootstrap4/js/jquery-1.12.4.js}"></script>
<script th:src="@{/static/js/bootstrap4/js/bootstrap.min.js}"></script>
</html>

3、打印页面html:这里在2中可以看到,是在iframe中嵌入了一个html,下面便是那个html

<head>
<meta charset="UTF-8"/>
<style>
p {  text-indent:2em; }
font-test { color:#F00; }
.div-contract { height: 80px;}  
.div-content { }
.inpt{  border:none;border-bottom:1px solid #999;}
.inpt-red { border:none; border-bottom:1px solid #F00}
.noborder  {  border:none; }
.bold { font-weight:bold }
textarea {
    outline: 0 none;
    border:none;
    display: block;
    overflow: hidden;
    width: 100%;
    min-width: 100%;
    max-width:100%;
    min-height: 140px;
    font-size: 14px;
    font: 14px/0.2;
    line-height: 18px;
    padding:2px;
    resize: vertical;
}
</style>
<script src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script>
</head>

<body>
<div id = "div-body" style = "width:100%;">
<div id = "test-div">
<input id = "restore-listener" type="button" value="点击建立新的监听" style = "display:none" onClick = "setListener()"></input><br></br>
<h1  align="center">
<input type="text" id ="htname" name="purchaseAndSaleContract" class="inpt setparam"/><span class = "bold"><font color="#FF0000">测试</font></span>
</h1>
<div class = "div-contract" >
<table class = "noborder">
<tr >
<td class = "bold" align="left">测试编号:<input type="text" name="contractCode" class="inpt setparam"/></td>
</tr>
</table>
</div>

<div class = "div-content1" >
<span class = "bold">第一条、测试内容</span>
<br></br>
<p>
1、测试名称:<input type="text" id="CGMC_if" class="inpt al-left setparam"/>(全称)
</p>
<p>
2、测试地点:<input type="text" id="GCDD_if" class="inpt al-left setparam"/>
</p>
<p>
3、测试期:从<input type="text" id="GHQKS_if" class="inpt setparam"/>至<input type="text" id="GHQZ_if" class="inpt setparam"/>止。
</p>
<br></br>
<span class = "bold">第二条、测试约定:</span><br></br>
<textarea id = "textarea_id1" style = "min-height: 200px; width:100%;align:center;height:220px">
免职就是上级组织直接解除领导职务,如同炒鱿鱼;责令辞职就是任免机关认定其已不再适合担任现职,通过一定程序责令其辞去现任领导职务;引咎辞职则是主动辞去领导职务、自我追究过失责任的一种形式,但如果要求其引咎辞职却不答应的话,也一样可以责令其辞职。用形象一点的说法,三者分别类似强制下岗、通知下岗和劝其主动下岗。其中,前两者为被动接受组织处理,而引咎辞职则是督促其主动承担责任的行为。
免职就是上级组织直接解除领导职务,如同炒鱿鱼;责令辞职就是任免机关认定其已不再适合担任现职,通过一定程序责令其辞去现任领导职务;引咎辞职则是主动辞去领导职务、自我追究过失责任的一种形式,但如果要求其引咎辞职却不答应的话,也一样可以责令其辞职。用形象一点的说法,三者分别类似强制下岗、通知下岗和劝其主动下岗。其中,前两者为被动接受组织处理,而引咎辞职则是督促其主动承担责任的行为。
</textarea>
</div>
<table border="1" cellpadding="1" cellspacing="0" bordercolor = "#333333" style="width:100%;align:center">
<tr >
<td class = "bold" align="center">测试名称</td>
<td class = "bold" align="center" >测试规格型号</td>
<td class = "bold" align="center">测试品牌</td>
</tr>

<tr>
<td><input type="text" class = "noborder" value = "测试"/></td>
<td><input type="text" class = "noborder" value = "测试"/></td>
<td><input type="text" class = "noborder" value = "测试"/></td>
</tr>

<tr>
<td><input type="text" class = "noborder" value = "测试"/></td>
<td><input type="text" class = "noborder" value = "测试"/></td>
<td><input type="text" class = "noborder" value = "测试"/></td>
</tr>
<tr>
<td colspan="5" align="left" > 
<textarea id = "textarea_id2" style ="width:100% ; height: 220px">
免职就是上级组织直接解除领导职务,如同炒鱿鱼;责令辞职就是任免机关认定其已不再适合担任现职,通过一定程序责令其辞去现任领导职务;引咎辞职则是主动辞去领导职务、自我追究过失责任的一种形式,但如果要求其引咎辞职却不答应的话,也一样可以责令其辞职。用形象一点的说法,三者分别类似强制下岗、通知下岗和劝其主动下岗。其中,前两者为被动接受组织处理,而引咎辞职则是督促其主动承担责任的行为。
免职就是上级组织直接解除领导职务,如同炒鱿鱼;责令辞职就是任免机关认定其已不再适合担任现职,通过一定程序责令其辞去现任领导职务;引咎辞职则是主动辞去领导职务、自我追究过失责任的一种形式,但如果要求其引咎辞职却不答应的话,也一样可以责令其辞职。用形象一点的说法,三者分别类似强制下岗、通知下岗和劝其主动下岗。其中,前两者为被动接受组织处理,而引咎辞职则是督促其主动承担责任的行为。
</textarea>
</td>
</tr>
<tr>
<td><input type="text" class = "noborder" value = "测试1"/></td>
<td><input type="text" class = "noborder" value = "测试"/></td>
<td><input type="text" class = "noborder" value = "测试"/></td>
</tr>

<tr>
<td><input type="text" class = "noborder" value = "测试2"/></td>
<td><input type="text" class = "noborder" value = "测试"/></td>
<td><input type="text" class = "noborder" value = "测试"/></td>
</tr>
<tr>
<td><input type="text" class = "noborder" value = "测试3"/></td>
<td><input type="text" class = "noborder" value = "测试"/></td>
<td><input type="text" class = "noborder" value = "测试"/></td>
</tr>

<tr>
<td><input type="text" class = "noborder" value = "测试4"/></td>
<td><input type="text" class = "noborder" value = "测试"/></td>
<td><input type="text" class = "noborder" value = "测试"/></td>
</tr>

<tr>
<td><input type="text" class = "noborder" value = "测试5"/></td>
<td><input type="text" class = "noborder" value = "测试"/></td>
<td><input type="text" class = "noborder" value = "测试"/></td>
</tr>

<tr>
<td><input type="text" class = "noborder" value = "测试6"/></td>
<td><input type="text" class = "noborder" value = "测试"/></td>
<td><input type="text" class = "noborder" value = "测试"/></td>
</tr>
<tr>
<td><input type="text" class = "noborder" value = "测试7"/></td>
<td><input type="text" class = "noborder" value = "测试"/></td>
<td><input type="text" class = "noborder" value = "测试"/></td>
</tr>

</table>
</div>
</div>
</body>

4、LodopFuncs.js:最后就是改这个的映射exe地址了,下面是改成了适配我项目路径的exe(偷懒只显示要改的地方,别的代码照常哦,不要乱删),当点击打印按钮发现没有安装exe的时候,出现的链接就可以下载我放在项目上的exe来下载,不需要再自己去搜索下载。

function getLodop(oOBJECT,oEMBED){
    //var strHtmInstall="<br><font color='#FF00FF'>打印控件未安装!点击这里<a href='install_lodop32.exe' target='_self'>执行安装</a>,安装后请刷新页面或重新进入。</font>";
    //var strHtmUpdate="<br><font color='#FF00FF'>打印控件需要升级!点击这里<a href='install_lodop32.exe' target='_self'>执行升级</a>,升级后请重新进入。</font>";
	
    var strHtmInstall="<br><font color='#FF00FF'>打印控件未安装!点击这里<a href='/static/lodop/install_lodop32.exe' target='_self'>执行安装</a>,安装后请刷新页面或重新进入。</font>";
    var strHtmUpdate="<br><font color='#FF00FF'>打印控件需要升级!点击这里<a href='/static/lodop/install_lodop32.exe' target='_self'>执行升级</a>,升级后请重新进入。</font>";
    var strHtm64_Install="<br><font color='#FF00FF'>打印控件未安装!点击这里<a href='/static/lodop/install_lodop64.exe' target='_self'>执行安装</a>,安装后请刷新页面或重新进入。</font>";
    var strHtm64_Update="<br><font color='#FF00FF'>打印控件需要升级!点击这里<a href='/static/lodop/install_lodop64.exe' target='_self'>执行升级</a>,升级后请重新进入。</font>";
    var strHtmFireFox="<br><br><font color='#FF00FF'>(注意:如曾安装过Lodop旧版附件npActiveXPLugin,请在【工具】->【附加组件】->【扩展】中先卸它)</font>";
    var strHtmChrome="<br><br><font color='#FF00FF'>(如果此前正常,仅因浏览器升级或重安装而出问题,需重新执行以上安装)</font>";
    var strCLodopInstall="<br><font color='#FF00FF'>CLodop云打印服务(localhost本地)未安装启动!点击这里<a href='/static/lodop/CLodop_Setup_for_Win32NT.exe' target='_self'>执行安装</a>,安装后请刷新页面。</font>";
    var strCLodopUpdate="<br><font color='#FF00FF'>CLodop云打印服务需升级!点击这里<a href='/static/lodop/CLodop_Setup_for_Win32NT.exe' target='_self'>执行升级</a>,升级后请刷新页面。</font>";
    var LODOP;
}

5、最后来张打印效果图:

 

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
Lodop打印需要的LodopFuncs.js已测试可使用 Lodop是什么? 有人说她是Web打印控件,因为她能打印、在浏览器中以插件的形式出现,用简单一行语句就把整个网页打印出来; 有人说她是打印编程接口,因为她介于浏览器和打印设备之间,是个通道和桥梁,几乎能想到的打印控制事项都能做到; 有人说她是JavaScript的扩展,因为她所有功能就那么几个语句,和JS语法一样,一看就明白个究竟; 有人说她是报表打印工具,因为那个add_print_table语句把报表统计的那点事弄了个明明白白; 有人说她是条码打印工具,因为用了她再也不用后台生成条码图片了,前端一行指令就动态输出清晰准确的条码,一维二维都行; 有人说她是图表打印工具,因为用她能输出几乎能想象的任何图表,虽然没那么豪华,但什么饼图、折线图、柱图甚至复合图等等都不在话下; 有人说她是个小玩意,因为她体积太小了,才2M多,她所包含的其中任何一个对照工具都是她的好几倍(例如条码打印控件、图表控件等); 有人说她是套打教案,因为以Lodop+JS实现套打这种模式,在网上已被吵吵为教科书般的解决方案; 有人说她是Web打印控件的“终结者”,因为接触“她”后再不想别的“她”; 有人说她就是一个Web编程小工具,因为有了她,在BS下的打印终于像cs下那种随意而高效了; 但我们说,她是全国1000多家软件公司的智慧结晶,诞生7年了,几乎每个功能细节都蕴藏着无数开发者的期待和汗水; 她就是Lodop,没有别的名称,她是web开发的必选伴侣...
Protobuf是一种高效的序列化协议,可以用于数据交换和数据存储。它的主要优势是大小小,速度快,可扩展性强。下面是使用Protobuf的一些小记: 1. 定义消息格式 首先,需要定义消息格式,以便Protobuf可以将数据序列化和反序列化。消息格式定义在.proto文件中,使用protobuf语言编写。例如,下面是一个简单的消息格式定义: ``` syntax = "proto3"; message Person { string name = 1; int32 age = 2; } ``` 这个消息格式定义了一个名为Person的消息,包含两个字段:name和age。 2. 生成代码 一旦消息格式定义好,就可以使用Protobuf编译器生成代码。编译器将根据消息格式定义生成相应的代码,包括消息类、序列化和反序列化方法等。可以使用以下命令生成代码: ``` protoc --java_out=. message.proto ``` 这将生成一个名为message.pb.java的Java类,该类包含Person消息的定义以及相关方法。 3. 序列化和反序列化 一旦生成了代码,就可以使用Protobuf序列化和反序列化数据。例如,下面是一个示例代码,将一个Person对象序列化为字节数组,并将其反序列化为另一个Person对象: ``` Person person = Person.newBuilder() .setName("Alice") .setAge(25) .build(); byte[] bytes = person.toByteArray(); Person deserializedPerson = Person.parseFrom(bytes); ``` 这个示例代码创建了一个Person对象,将其序列化为字节数组,然后将其反序列化为另一个Person对象。在这个过程中,Protobuf使用生成的代码执行序列化和反序列化操作。 以上是使用Protobuf的一些基本步骤和注意事项,希望对你有所帮助!
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值