给你一个简单的示例:
<% for t=1 to 10 %><input type="checkbox" id="chk<%=t%>" value="<%=t%>" /><span id="span<%=t%>">选项<%=t%></span><br />
<% next%>
<input type="button" value="打印" onclick="javascript:printme()" />
<script type="text/javascript">
function printme(){
var o=window.open("","print")
var s=""
for(var t=1t<=10t++){
if(document.getElementById("chk"+t).checked==true){
s+="<br />"+document.getElementById("span"+t).innerHTML
}
}
o.document.write("<body>")
o.document.write(s)
o.document.write("</body>")
}
</script>
你根据需要把要打印的格式处理一下就行了
实现代码如下:
<%@ page contentType="text/htmlcharset=utf-8" language="java" import="java.sql.*" errorPage="" %>
<%@ taglib prefix ="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7"/>
<meta http-equiv="Content-Type" content="text/htmlcharset=utf-8" />
<link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/css/bid.css"/>
<title>批量打印模板</title>
<script type="text/javascript" language="javascript">
function printOnload(){
var count = <s:property value="uriList.size()"/>
var index
for(i = 0i <counti++){
index = i + 1
//把iframe的html挪到div上
document.getElementById('page' + index).innerHTML
= window.frames[0].document.getElementsByTagName('body')[0].innerHTML
}
}
</script>
<!-- media="print"表示改样式只在打印预览或打印的时候才生效 -->
<style media="print" type="text/css">
.NOPRINT{display:none}
.PageNext{page-break-after: always}
.none{}
</style>
</head>
<body onload="printOnload()">
<!-- 根据urlList,生成<div><iframe><iframe/></div>这样格式的页面-->
<s:iterator value="uriList" status="status1" id="uri">
<div style="<s:if test='#status1.count != uriList.size()'>page-break-after: always</s:if>" id="page${status1.count}">
<iframe src="<%=request.getContextPath() %>${uri }"></iframe>
</div>
</s:iterator>
</body>
</html>
首先得构造一个适合打印的页面,然后直接用浏览器的打印功能就可以 :
1、后台request保存了一个List<URLObj>,uri属性表示请求地址
2、该打印demo页面,根据List<URLObj>,用struts2标签在body上构建<div><iframe></iframe></div>,iframe打开的是每一个需要批量打印的页面
3、页面加载完成后,调用printOnLoad函数,把iframe里面的html挪到div上
问题描述:
在B/S项目中需要打印大量的图片,我们使用window.print,但是当数据量大至上万的时候,将图片加载出来需要一些时间,加载出来之后打印,如果用户关闭了打印界面会导致打印页的缺失。
解决思路:
1.IE,使用ActiveX控件,非IE,使用Flash插件。这种思路不同的浏览器开发方式不一样,IE/FF/GROME
2.开发一个exe,客户端安装到本地服务,使用HTTP通讯方式。通过JS发送HTTP请求给本地的服务,本地服务起一个小型的HTTP server接收请求,然后返回数据,JS解析,显示在UI上。比如将打印的参数传值到本地服务,本地服务去调用打印机,使浏览器资源得到释放。
我们使用第二种思路。
尝试了以下方法:
1.HttpPrinter
采用原因 免费 ,OME费用很便宜的,而且不限制时间和数量.还可以购买源码的。
HttpPrinter.com
2.葡萄城的ActiveReports
中有B / s端的打印使用window.print实现
https://demo.grapecity.com.cn/ActiveReports/ASPNET/ControlExplorer/Viewers/Default.aspx?category=1001&action=14
另外有C / S端的打印,无法与浏览器交互,但是可以去改进
https://gcdn.grapecity.com.cn/forum.php?mod=viewthread&tid=48785&extra=page%3D1
3. Lodop分为收费版与免费版
(1)使用Lodop插件,需要客户端安装一个服务,服务的端口默认是8000或18000
(2)如何购买和使用打印控件的Lodop的注册号
http://blog.sina.com.cn/s/blog_721e77e50100nfzs.html
(3)Lodop样例演示
http://www.lodop.net/LodopDemo.html
考量问题:
(1)免费版有水印
4. JCP分为收费版与免费版
安装程序需要替换
网官 http://printfree.jatools.com/
考量问题:
免费版只适合于IE浏览器
图片需要渲染到页面,打印时释放浏览器资源可以做其他操作
收费版jatoolsPrint支持大部分浏览器
5.jquery打印
底层是window.print方法
最后考量,我们决定将的ActiveReports中的C / S端程序打包成EXE,利用自定义协议实现打开本地exe服务,使用HTTP方式实现浏览器与本地服务的通讯。