背景说明:
客户端经常需要对报表进行批量打印,此时可以调用applet打印、PDF打印或本地打印进行批量打印操作,用法如下:
applet打印:
<%
//report的参数格式为:report={无参数报表名}{报表1(参数1=value1;参数2=value2;...)}{报表2(参数1=value1;参数2=value2;...)}...prompt=yes
request.setCharacterEncoding( "GBK" );
String report = request.getParameter( "report" );
if( report == null || report.trim().length() == 0 ) throw new Exception( "请输入报表文件名及参数串report={无参数报表名}{报表1(参数1=value1;参数2=value2;...)}{报表2(参数1=value1;参数2=value2;...)}..." );
String prompt = request.getParameter( "prompt" );
String appmap = request.getContextPath();
String serverPort = String.valueOf( request.getServerPort() );
String serverName = request.getServerName();
String appRoot = "http://" + serverName + ":" + serverPort + appmap;
%>
<object classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" codebase="<%=appRoot%>/jre-6u24-windows-i586.exe #Version=6.0.240.7" width="40" height="16" id="report1_directPrintApplet" style="vertical-align:middle">
<param name="name" value="report1_directPrintApplet">
<param name="code" value="com.raqsoft.report.view.applet.DirectPrintApplet.class">
<param name="archive" value="<%=appmap%>/raqsoftReportApplet.jar">
<param name="type" value="application/x-java-applet;version=1.4">
<param name="appRoot" value="<%=appRoot%>">
<param name="dataServlet" value="/reportServlet?action=1">
<param name="srcType" value="file">
<param name="fontFace" value="宋体">
<param name="fontSize" value="18pt">
<param name="fontColor" value="#0000FF">
<param name="backColor" value="#12632256">
<param name="icon" value= "<%=appmap%>/images/print.gif">//为打印控件的打印按钮设置图片,如果不设置此参数,则打印按钮上不显示图片。
<param name="label" value="打印">
<param name="needPrintPrompt" value="<%=prompt%>">
<param name="scriptable" value="true">
</object>
<a href="javascript:window.close()" class="style3 style5">取消</a>
<script language=javascript>
//此函数返回的格式为:"{无参数报表名}{报表1(参数1=value1;参数2=value2;...)}{报表2(参数1=value1;参数2=value2;...)}..."
function raqsoft_getPrintReports() {
//请在此函数里加上打印前需要的处理,最后返回需要打印的报表
return "<%=report%>";
}
</script>
打印其它相关知识:
1. 批量打印时,可以在第一张报表打印前弹出一个页面设置窗口,用户输入新的页面设置数据后,所有的报表都可以使用此设置进行打印。
方法:在directprint.jsp中增加下面的参数
<param name="needSetPageSize" value="yes">
2. 批量打印时,也可以使用以前保存的客户端打印设置,在directprint.jsp中增加下面的参数:
<param name="savePrintSetup" value="yes">
3. html报表、打印方式发布的报表、批量打印报表在打印完成后,均可以回调页面中的一个js函数,以便让用户可以实现打印后的处理事件。用户在页面中写一个名称为raqsoft_printOver()的javaScript函数,通过此函数实现打印后的处理。
PDF打印:
<script language=javascript>
var myToast;
function showToast() {
myToast = $().toastmessage('showToast', {
text : '<%=ServerMsg.getMessage(request,"jsp.loadingPrint")%>',
sticky: true,
position : 'middle-center',
type: 'notice'
});
}
function closeToast() {
$().toastmessage('removeToast', myToast);
}
</script>
……
<%
//此JSP参数格式为:report={无参数报表名}{报表1(参数1=value1;参数2=value2;...)}{报表2(参数1=value1;参数2=value2;...)}
request.setCharacterEncoding( "UTF-8" );
String report = request.getParameter( "report" );
if( report == null || report.trim().length() == 0 ) throw new Exception( "请输入报表文件名及参数串report={无参数报表名}{报表1(参数1=value1;参数2=value2;...)}{报表2(参数1=value1;参数2=value2;...)}..." );
String src = request.getContextPath() + ServletMappings.getMapping( "com.raqsoft.report.view.ReportServlet" ) + "?action=45&report=" + URLEncoder.encode( report, "UTF-8" );
String preview = request.getParameter( "preview" );
if( "no".equalsIgnoreCase( preview ) ) {
String url = appmap + ReportConfig.raqsoftDir + "/pdfjs/pdfDirectPrint.jsp?src=" + URLEncoder.encode( src, "UTF-8" );
%>
<iframe src="<%=url%>" style="position:absolute;left:-100px;top:-100px" width=50 height=50>
</iframe>
<script language=javascript>
showToast();
</script>
<%
}
else {%>
<object classid="clsid:CA8A9780-280D-11CF-A24D-444553540000" id=pdfobj width="100%" height="100%" border="0">
<param name="_Version" value="65539">
<param name="_ExtentX" value="20108">
<param name="_ExtentY" value="10866">
<param name="_StockProps" value="0">
<param name="SRC" value="<%=src%>">
<comment>
<embed id=pdfobj1
type="application/pdf"
src="<%=src%>"
width="100%"
height="95%">
</embed>
</comment>
</object>
<% } %>
PDF批量打印可访问pdfBatchPrint.jsp,示例url如:http://localhost:6868/demo/reportJsp/pdfBatchPrint.jsp?report={a.rpx}{b.rpx(bid=10248;eid=10250)}&preview=yes
当参数preview的值为no时,则为直接批量打印;无此参数或参数值不为no时,则为预览后批量打印。
本地打印:
<%
//此JSP参数格式为:report={无参数报表名}{报表1(参数1=value1;参数2=value2;...)}{报表2(参数1=value1;参数2=value2;...)}...&prompt=yes&needSelectPrinter=yes
request.setCharacterEncoding( "UTF-8" );
String report = request.getParameter( "report" );
//"请输入报表文件名及参数串report={无参数报表名}{报表1(参数1=value1;参数2=value2;...)}{报表2(参数1=value1;参数2=value2;...)}..."
if( report == null || report.trim().length() == 0 ) throw new Exception( ServerMsg.getMessage(request,"jsp.dpArgError") );
String prompt = request.getParameter( "prompt" );
String needSelectPrinter = request.getParameter( "needSelectPrinter" );
String pages = request.getParameter( "pages" );
String copies = request.getParameter( "copies" );
String appmap = request.getContextPath();
String appRoot = ReportServlet.getUrlPrefix( request );
if( !appRoot.startsWith( "http" ) ){
String approot1 = request.getRequestURL().toString();
approot1 = approot1.substring( 0, approot1.indexOf( request.getRequestURI() ) );
appRoot = approot1 + appmap;
}
StringBuffer url = new StringBuffer( "printrpx://" );
url.append( "a=" + URLEncoder.encode( appRoot, "UTF-8" ) );
url.append( "&b=" + URLEncoder.encode( "/reportServlet;jsessionid=" + session.getId() + "?action=1", "UTF-8" ) );
url.append( "&c=" + URLEncoder.encode( report, "UTF-8" ) );
if( needSelectPrinter != null ) {
url.append( "&k=" + needSelectPrinter );
}
url.append( "&u=1" );
url.append( "&v=" + prompt );
url.append( "&x=UTF-8" ); //paramCharset
if( pages != null ) url.append( "&z=" + pages );
if( copies != null ) url.append( "&aa=" + copies );
url.append( "&ti=" + System.currentTimeMillis() );
%>
本地批量打印可访问directprint_local.jsp,示例url如:http://localhost:6868/demo/reportJsp/ directprint_local.jsp?report={a.rpx}{b.rpx(bid=10248;eid=10250)}
注意:
1. 如果rpx文件带参数,则必须要加{}大括号。
2. { }大括号、( )小括号这个2个特殊符号需要转码,分别对应为%7B、%7D、%28、%29。
3. 本地打印与applet打印功能基本相同,但本地打印不支持在页面中写js回调函数:打印开始前raqsoft_getPrintReports() 、打印完成后raqsoft_printOver()。
l 本地打印url中参数说明:
参数名 |
是否必填 |
参数说明 |
a |
必需 |
报表web应用服务器前缀,到应用名结束,需要url编码,如URLEncode.encode("http://ip:port/appmap","UTF-8") |
b |
必需 |
报表web应用中本地打印命令,目前是固定值,需要url编码,URLEncode.encode("/reportServlet?action=1","UTF-8") |
c |
必需 |
要打印的文件名,如有特殊字符需要url编码,如URLEncode.encode("报表1.rpx","UTF-8") |
d |
选填 |
报表存储方式,目前是固定值file |
e |
选填 |
报表参数缓存id |
f |
选填 |
报表缓存id |
h |
选填 |
是否保存打印设置,默认no |
i |
选填 |
是否报表组,默认no |
k |
选填 |
是否需要选择打印机,默认yes |
l |
选填 |
是否服务器分页,默认no |
m |
选填 |
是否镜像打印,默认no |
n |
选填 |
指定使用的打印机名称,如有特殊字符需要url编码,如URLEncode.encode("财务专用打印机","UTF-8") |
o |
选填 |
报表参数串,需要url编码,如URLEncode.encode("arg1=中国;arg2=华北","UTF-8") |
u |
选填 |
是否直接打印,默认no |
v |
选填 |
直接打印时是否需要用户确认,默认no |
x |
必需 |
参数值的字符集编码,一般是UTF-8 |
y |
选填 |
是否黑白打印,默认no |
z |
选填 |
需要打印的页码串,默认全部 |
aa |
选填 |
打印份数,默认1 |
ti |
选填 |
当前时间的长整数,加此项是为了让url每次都不同,避免因服务器缓存而取不到最新数据 |