0 引 言
关于在线打印的技术一直是开发者研究的热点问题之一。众多学者对实现特殊格式的打印技术做出了大量的研究,文献对当前打印技术总结出直接使用IE的打印功能、IE的WebBrowser控件实现打印、水晶报表或第三方工具、将打印内容导出到Excel或Word中然后打印、用XML技术打印等6种方案,并提出了静态和动态相结合的Excel模板Web打印方案;文献使用jatoolsPrinter控件实现B/S模式下的报表设计;文献提出先使用Word软件设计模板,然后在应用程序中利用VBA对Word模板进行解析,生成打印文档。以上技术分别使用导出Excel或Word文件,使用第三方控件解决了Web系统中的信息按照规定格式的打印问题。以上技术很好地实现了对一些特殊格式要求的打印,但是由于用户导出的文件可以使用相关软件进行修改操作,从而会导致打印出的纸质文档与原始数据不一致的现象发生。因此,这些技术不能应用于考试报名系统中考生打印准考证模块,设计出一种既能实现考生在线打印准考证,又能保证考生不能篡改其内容,并且实现信息在因特网中的安全传输是考试报名系统中亟待解决的技术问题。
1 总体设计
1.1 设计目标
在人事公招考试报名系统中,考生要通过报名系统平台自主打印准考证,其设计的主要目标体现在以下方面:
(1) 严格规范打印格式。为体现公招考试的严肃性、规范性,各单位都要求各个考生打印的准考证与要求的格式一致,避免考生将各种不规范的准考证带入考场。
(2) 防止考生篡改信息。为防止出现考试过程代考现象的发生,避免考生在打印前篡改准考证信息,因此,就要求使用相关技术实现在客户端只能显示图片和打印准考证操作。
(3) 减轻工作人员负担。当考生网上报名结束后,系统能抽取有效的基础数据,并根据实际要求,不但要将考试的所有信息填充在准考证内,而且要将考生进行智能分配考场,从而达到减轻工作人员工作量并提高工作效率的目的。
(4) 保证系统正常运转。由于公招考试面向社会公开并接受社会的监督,为避免考生由于技术问题而导致考生不能正常打印准考证,产生一些对单位的负面影响,因此,设计的生成准考证技术要求全面考虑各种因素,确保考生正常报名和打印准考证。
(5) 加强模块的实用性。报名系统平台运行后,为保证今后每一次组织的公招考试报名中能按照不同的要求精确生成准考证,需要解决通用性的设计目标。当系统管理员在每一次导入准考证模板的尺寸大小不一、模板中的文字内容发生改变等情况下,系统能根据模板的变化而进行灵活地处理。
1.2 工作流程
系统在设计中主要有三种角色的用户,即考生用户、工作人员和系统管理员,系统生成准考证需要处理这三种用户所设置的基础数据。
考生在报名之前,系统管理员对报名系统进行初始化设置,其中初始化项目包括本次公开招聘的岗位及条件,报名的时间段等报考信息,考生的学历、学位、政治面貌等选择项信息,以上初始化信息用于考生报名模块。在生成准考证模块中,系统管理员初始化公招考试笔试的考试时间、地点和考场等考试信息,以实现将该信息填充到准考证内,另外系统管理员还需要向系统导入准考证模板。图1给出了系统管理员向系统导入准考证的初始化流程。
在考生报名过程中,考生用户将要填写个人的基本信息,如姓名、性别、身份证号、政治面貌、学历、学位、报考岗位、照片等信息,页面提交后,系统将这些信息将保存在关系数据库中,报名期间,工作人员登录系统,时时检测考生报名的状况,审核考生是否符合公开发布文件中所规定的要求,若考生不符合要求,工作人员及时发出信息告知考生。考生报名截至后,若考生符合公招条件并具备考试资格,工作人员进入报名系统平台执行生成准考证的操作,当准考证文件生成后,考生再次登录系统,根据相关信息的提示打印准考证,从而考生可以取得考试资格,考生用户操作的流程见图2所示。
图1 管理员上传初始化模板流程图
图2 考生报名及打印准考证流程图
2 技术实现过程
2.1 在线切割图像的实现
考生注册是公招考试报名系统中的一个重要模块,其功能是实现对考生基本信息的收集。该模块除了使用J2EE实现传统的信息交互处理技术之外,还要求考生对提交的照片进行在线切割操作,以使得生成各个准考证中考生照片的尺寸相同。
在Web系统实现网络在线切割照片,需要使用客户端技术与服务器端的应用程序相结合的方式实现。程序基本流程为:
Step1:在考生注册界面中实现照片的文件上传功能,将考生的基本信息和照片文件传送到服务器;
Step2:考生登录系统后,客户端网页中显示已经上传的照片,使用JS语言设计出按照规定的比例初始化照片的选择区域,并给出提示信息;
Step3:在考生图片上拖拽选择区域,取出考生头像图片,在此同时记录下该区域在照片中的相对位置坐标和大小;
Step4:用户选取指定区域点击确定按钮后,将位置坐标值及区域大小值传递给服务器;
Step5:服务器根据客户端传递的坐标和区域大小参数提取数值,对考生的原始照片进行切割;
Step6:切割后的照片按照准考证中规定的大小按比例缩放,以实现每一个考生照相同尺寸都相同。
在设计客户端网页中照片区域选择及拖拽效果的过程中,为减少JS代码的书写,在网页中导入jQuery框架,使用该框架提供的imgAreaSelect()函数实现对考生头像区域的选取和确定区域坐标位置。在服务器端,提取到头像图片尺寸及位置参数值后,使用Java类库中的ImageInputStream,ImageReadParam,Rectangle,BufferedImage等类创建对象,调用类中定义的相关方法实现对照片的切割,其主要代码如下:
FileInputStream fileInputStream = new FileInputStream(src);
Iterator it =
ImageIO.getImageReadersByFormatName("jpg");
ImageReader reader = it.next();
ImageInputStream imageInputStream =
ImageIO.createImageInputStream(fileInputStream);
reader.setInput(imageInputStream,true);
ImageReadParam param = reader.getDefaultReadParam();
Rectangle rect = new Rectangle(x, y, width, height);
param.setSourceRegion(rect);
BufferedImage bufferedImage = reader.read(0,param);
ImageIO.write(bufferedImage, "jpg", newImage);
ImageBean.resize(112,155,newImage);
该程序段执行后,将对考生上传的照片在坐标x,y值上切割出宽度为width,高度为height的新图片newImage,实现了各考生照片宽度为112像素,高度为155像素,其效果如图3所示。
图3 在线裁剪图片的效果
2.2 分配考场算法的实现
为考生分配考场是一个复杂的过程,由于某些岗位招聘的工作人员人数少,则该岗位的考生人数相对较少,在实际的考试过程中,不需要为每一个岗位分配一个教室,对考生人数较少的岗位,可以安排多个岗位的考生在一个考场内,以节约人力和物力资源。
设计中,在关系数据库中创建数据表,用于分配考场算法中基础数据的提取和计算结果的保存。根据实际需求,创建了考场信息表(自动编号N(8),教室号C(5),教室容量N(3),已经分配考生数量N(3),备注C(50)),系统运行后,该表由系统管理员执行考场数据项添加操作;岗位信息表(自动编号N(8),岗位编号C(8),考生人数N(5),是否分配考场N(2)),该表从考生报名的基础数据中统计得出,并将统计的各岗位及对应的考生人数等数据添加到数据表中;考场分配结果数据表(自动编号N(3),岗位编号C(10),教室号C(3)),用于存放算法执行后,存放分配结果的数据集。
在工程中创建Java类,使之分别与以上数据表建立对象关系映射(ORM),创建JavaBean模型,分别为各类设计出各数据表的增、删、改、查询等方法,实现数据事务的处理,创建该类的对象后,调用对象的方法可以为考场分配算法提供基础数据,在取得系统的基础数据后,业务处理程序设计分配考场算法,其算法流程图如图4所示。
在算法流程图中,为考场的最优分配方案算法描述为:计算得出当前考场的剩余座位数,定义临时变量用于存储剩余座位数与包括当前岗位的考生人数的差值,取岗位对象集合中的第一个岗位对象,若取得的岗位已经分配了考场,则取下一个岗位对象,否则计算剩余座位数与考生人数的差值,若该值小于零,则继续取下一个岗位对象进行判断差值,取得差值后,用该值与临时变量存放的值进行比较,以得出将差值最小的岗位对象分配到当前考场中,以此循环操作,当循环结束后得到分配的最优解。
图4 分配考场算法流程图
分配岗位的算法应用到工程的Web事务中,当服务器接收到管理员用户在客户端请求后,程序开始调用和执行,并将执行的结果存储在数据表中,从而为准考证中输出考生所在的考场提供数据支持。
2.3 生成准考证的实现
系统生成准考证程序执行之前,需要使用客户端技术实现考生基本信息在准考证模板中的定位设置,实现不同尺寸的模板图片都可以正常生成准考证图片,达到系统具有对模板灵活处理目的。
实现信息输出的定位,通过鼠标在模板图片上的单击事件,触发JS函数并记录下鼠标在模板图片中的坐标位置,并将x坐标值和y坐标值填充到文本框内,在操作界面中添加下拉框选择当前坐标位置输出哪一个信息项,最后使用Ajax异步传输技术,将当前的x坐标值、y坐标值以及输出的信息项发送给服务程序,实现在服务器端保存设置。
在考生基础数据收集、考场分配取得结果、信息项的输出定位设置等一系列准备工作完成后,系统可以生成准考证图片,其算法步骤描述如下:
Step1:以岗位编号为分组依据,从数据库取出符合考试资格的考生,并将这些考生存放在集合中;
Step2:取出数据库中存放输出位置的各信息项及坐标值对象,并将这些信息存放在集合中;
Step3:从集合中取第一个考生对象,使用该考生的岗位编号属性值,搜索出考场信息、报考单位等相关属性值,按规定的格式条件生成准考证号;
Step4:把上传的模板文件复制到指定存放准考证文件的文件夹,并以考生的身份证号重命名;
Step5:在程序中创建Image对象读取模板图片,BufferedImage对象将模板图片写入到内存里的图像缓冲区,创建Graphics对象,并使用该对象的drawString()和drawImage()方法,在方法中传入坐标参数,实现对模板图片中指定的位置输出文字和图片;
Step6:当前考生的准考证图片已经生成,继续回到Step3,依次生成每一个考生的准考证。
至此,系统已经实现了为各个考生生成图片格式的准考证文件,其效果如图5所示,系统核心技术已经完成,剩下的工作是解决信息安全问题。
图5 使用JPEG模板技术生成准考证效果图
3 测试及结果分析
在某高校网络管理中心计算机实验室搭建J2EE运行环境,采用Tomcat作为Web服务器,MySQL数据库软件为系统提供数据服务,配置人事公招考试报名系统的域名为pta.sasu.cn,系统部署后,组织部分学生模拟在线报名以进行黑盒测试。在模拟报名过程中,系统运行状况良好,学生能根据系统的提示信息进行操作,表现出系统具有较好的交互能力,工作人员登录系统后能根据考生报名的数据和设置初始化信息生成准考证。
系统生成的准考证图片文件平均大小约43 KB,保证了网络带宽比较低的考生用户能快速取得准考证图片文件。由于在系统生成准考证过程中,服务器频繁读写文件,当生成超大数量的准考证时耗时比较长,经对1 000个数据量的测试,得到表1的实验结果。
根据测试中的数据表明,系统在生成准考证期间,管理员需要等待一段时间,直到准考证文件全部生成。在测试中设计了访问数据库的JSP页面,通过系统在生成准考证期间与正常情况下,对该JSP页面执行耗时进行对比,通过测试数据可以表明,在生成准考证期间,虽然耗时较长,但不影响考生对系统的访问。
表1 生成1 000个以内考生准考证的实验测试结果
4 结 语
使用模板技术生成准考证,在某高校2013年度人事公开招聘工作人员在网上报名工作中发挥了重要的作用。生成准考证过程中,系统实现了为考生分配考场算法,并根据算法执行结果,将考场信息自动填充到准考证中,减少了人工分配考场的工作量,
提高了工作效率。系统生成的准考证,有效地解决了格式控制问题,保证了每一个考生的纸质准考证格式相同,体现了考试的正规性。考生在访问准考证图片文件中,禁止考生修改准考证图片中的内容,防止了考生制作假准考证的代考现象,系统实现了准考证图片在网络传输中的防盗问题,保证了考生的信息安全。基于JPEG图片模板的生成准考证技术,有较高的实用价值,该技术也可以进行推广应用到其他工程项目中。
参考文献
李永锋,谷川.一种模板化的Web打印方法的设计与实现.计算机应用与软件,2010,27(4):118?119.
张国晋,李仕金,陆歌皓.基于物流服务平台下打印技术的研究与应用.计算机系统应用,2012,21(12):177?181.