在报表设计的时候,每张报表都有一个打印设置,但是这个设置可能与客户端电脑的打印机配置不相匹配(如设计的是A3纸,可是客户端打印机只支持A4纸);或者不同的报表需要用不同的打印机来打印(如发票打印机打印套打式报表等)。这样客户端用户在打印这些报表时每次都需要更改打印设置,用起来比较烦琐,因此需要将客户端的打印设置保存到服务器上,以便下次再打印这张报表时,可以从服务器读出打印设置,从而不需要再次设置。
保存时的主键是根据以下生成的:
客户端电脑名+客户端电脑网卡IP+报表名
报表系统配置:
要做到上述功能,报表系统需做以下几项工作:
1. web.xml的配置
需要增加一个servlet的配置如下:
<servlet>
<servlet-name>com.raqsoft.report.usermodel.PrintSetupServlet</servlet-name>
<servlet-class>com.raqsoft.report.usermodel.PrintSetupServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>com.raqsoft.report.view.PagedPrint</servlet-name>
<servlet-class>com.raqsoft.report.view.PagedPrint</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>com.raqsoft.report.usermodel.PrintSetupServlet</servlet-name>
<url-pattern>/servlet/PrintSetupServlet</url-pattern>
</servlet-mapping>
蓝色字体部分“/servlet/PrintSetupServlet”是servlet的映射路径,不可更改。com.raqsoft.report.usermodel.PrintSetupServlet是润乾报表提供的一个缺省servlet实现,可以被替换。
2. tag属性设置
生成一个需要保存打印设置的报表,在tag标签中需增加一个属性设置,如下:
<report:html ......
savePrintSetup=”yes”
......
/>
缺省servlet说明:
润乾报表提供的这个servlet是将打印配置以文件的形式保存在服务器上的用户主目录(user.home)中,文件名叫clientPrintSetup.properties。其源程序如下:
package com.raqsoft.report.usermodel;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import com.raqsoft.common.*;
import com.raqsoft.report.usermodel.*;
/* 保存和读取客户端报表打印设置的Servlet */
public class PrintSetupServlet extends HttpServlet {
private boolean saveScale = false;
public void init() throws ServletException {
String scale = this.getServletConfig().getInitParameter("saveDisplayScale");
this.saveScale = "yes".equalsIgnoreCase(scale);
}
public void service(HttpServletRequest request, HttpServletResponse response) {
PrintWriter pw = null;
try {
request.setCharacterEncoding(Context.getJspCharset());
response.setContentType("text/html; charset=" + Context.getJspCharset());
pw = response.getWriter();
String userHome = System.getProperty("user.home");
String fileName = userHome + File.separator + "clientPrintSetup.properties";
String action = request.getParameter("action");
String key = request.getParameter("key"); //存取打印设置的关键字
Properties p = new Properties();
if ("write".equalsIgnoreCase(action)) { //保存
FileInputStream fis = null;
try {
fis = new FileInputStream(fileName);
p.load(fis);
}
catch (Exception e) {}
finally {
try {
if (fis != null) {
fis.close();
}
}
catch (Exception ex) {}
}
String width = request.getParameter("width"); //纸张宽
String height = request.getParameter("height"); //纸张高
String x = request.getParameter("x"); //左边距
String y = request.getParameter("y"); //上边距
String w = request.getParameter("w"); //内容区宽
String h = request.getParameter("h"); //内容区高
String orientation = request.getParameter("orientation"); //纸张方向
String printerName = request.getParameter("printerName"); //打印机名
String a = request.getParameter("a"); //水平对齐
String scale = request.getParameter("scale");
String setup = width + "|" + height + "|" + x + "|" + y + "|" + w + "|" + h + "|"+ orientation + "|" + printerName + "|" + a + "|" + scale;
p.setProperty(key, setup);
FileOutputStream fos = null;
try {
fos = new FileOutputStream(fileName);
p.store(fos, "Client user's print setup of report");
}
catch (Exception e) {}
finally {
try {
if (fos != null) {
fos.close();
}
}
catch (Exception ex) {}
}
pw.println("ok");
}
else {
FileInputStream fis = null;
try {
fis = new FileInputStream(fileName);
p.load(fis);
}
catch (Exception e) {}
finally {
try {
if (fis != null) {
fis.close();
}
}
catch (Exception ex) {}
}
String setup = p.getProperty(key);
if (setup != null) {
ArgumentTokenizer at = new ArgumentTokenizer(setup, '|');
//以下是向客户端传送打印设置,每行一个属性,属性名含义与前面保存时的相同
pw.println("width=" + at.nextToken());
pw.println("height=" + at.nextToken());
pw.println("x=" + at.nextToken());
pw.println("y=" + at.nextToken());
pw.println("w=" + at.nextToken());
pw.println("h=" + at.nextToken());
pw.println("orientation=" + at.nextToken());
pw.println("printerName=" + Escape.add(at.nextToken()));
if (at.hasMoreTokens()) {
pw.println("a=" + at.nextToken());
}
if (at.hasMoreTokens()) {
String scale = at.nextToken();
if (saveScale) {
pw.println("scale=" + scale);
}
}
pw.println("setup=yes"); //输出这一行,说明此报表保存有打印配置
}
else {
pw.println("setup=no"); //输出这一行,说明此报表没有保存打印配置
}
}
pw.flush();
}
catch (Exception e) {
if (pw != null) {
pw.println("setup=no");
}
}
finally {
if (pw != null) {
pw.close();
}
}
}
}
替换缺省的servlet:
如果你所需要的打印设置保存方式与缺省的形式不同,比如你想保存到数据库中,那么你可以自己写一个servlet来替换,同时修改前面介绍的servlet的配置,将类名换成你的,但是映射名不能更改。
你的这个servlet中接收和传送打印设置的方式与例子中一定要相同。