前段时间做一个web项目,需要打印证照功能,一开始是采用生成pdf文件再发到本地打印的方法,在客户实际使用中发现不太灵活,主要是在不同打印机环境下,偏移量不太好设定,另外客户想自行调整打印内容,比如字体大小,这个用pdf就比较麻烦了,于是在网上找了一下,看有没有好的web打印方案,发现了reportall这个软件,试用了一下,感觉还不错,而且普通版是免费使用的.现在就和大家分享一下使用心得
一.reportall简介
详细介绍请到其官网查看(网址:http://www.reportall.com.cn),这里只简单说一下.
ra采用的是activeX技术,可以兼容大多数浏览器,在第一次使用的时候,浏览器会把reportall.ocx这个activeX控件下载到本地,这个控件负责解析报表的模板格式(报表文档)以及要打印的动态数据(报表数据),所以服务器端的任务就是负责提供这两类数据.
报表文档:记录报表页面的样式及格式信息.reportall提供了专门的报表设计器来编辑报表文档
动态数据:以xml格式定义的要填写到报表中的内容
二.使用步骤
<1>用reportall报表设计器设计好报表文档,如果你接触过fastreport之类的报表软件,对这种设计方式应该不陌生.具体方法请查看ra的说明文件.最终得到一个后缀名为rad的报表文档.
<2>把报表文档发到服务器的适当地方,比如/public/rad路径下
<3>把下面代码嵌入到需要输出报表的页面里,这段代码定义了报表文档的地址和提供动态数据的服务器地址
<Object clsid="{568DC60B-F884-4147-8610-8C348AAFA2F8}"id="ReportAll" TYPE="application/x-itst-activex"width="100%" height="100%" <!--RA控件 -->
param_docsrc ="http://localhost/Public/rad/sample01.rad" <!--报表文档url-->
param_datasrc="http://localhost/test/index.php/raserver" > <!--报表数据(web服务器)url-->
</Object>
<4>编写提供动态数据的服务器程序
三.PHP服务器程序的编写
下面重点介绍如何用php编写一个向ra控件提供报表数据的服务器程序
<1>数据格式
动态数据是以xml文件方式提供的,
假设我们要输出一个单位的部门清单,这个清单里有两列,第一列是部门编号ID,第二列是部门名称Name
报表数据实例:
<?xmlversion="1.0" encoding="UTF-8" ?>
<DocumentData>
<Detail>
<Row ID="1" Name="办公室" />
<Row ID="2" Name="财务科" />
<Row ID="3" Name="物资科" />
<Row ID="4" Name="综合科" />
</Detail>
</DocumentData>
要点是<Row/>,动态数据就藏身其中.
ID和Name都是fieldname即报表文档中引用动态数据的字段名称,等号后面是数据值
所以一行数据的格式就是
<Row 数据1的字段名称="数据1的取值” 数据2的字段名称="数据2的取值”...... />
<2>服务器程序的任务
服务器的任务就是根据请求的参数,从数据库中查询出数据,然后拼装成一个xml格式的字符串,并传递给请求者.
考虑到效率,对这种格式很清楚的xml数据的生成,没必要使用php中的SimpleXML或DomDocument工具,最好采用直接写的方式(这几种方式的效率比较见我的博文 PHP中3种生成XML文件方法的速度比较 )
privatefunction directWriteXml($d){
$xmltext='<?xml version="1.0"encoding="UTF-8" ?>';
$xmltext.='<DocumentData>';
$xmltext .='<Detail>';
foreach($d as $key=$value){
$xmltext.=" <Row ID=\" {$key} \" Name=\"{$value]}\" />" ;
}
$xmltext.='</Detail>';
$xmltext .='</DocumentData>';
return$xmltext;
}