4.6 FPDF/PFI:动态生成PDF形式的报表
现在几乎所有的系统开发时,用户都有生成PDF报表的要求。PDF报表几乎成为了IT业界的标准了。这是因为PDF文件具有外观精美、保存方便(只读性的PDF文件生成后,不用担心被参改;保存时还可设置密码以及是否能被印刷的控制)。印刷时“所见即所得”,即PDF文件印刷出来的效果与屏幕上看到的浏览效果相差无几。到现在为止,还没有出现比PDF更优秀的文档格式了。
本节将介绍应用PHP的程序包动态生成PDF报表的方法。本节的应用是从如下图所示的页面输入数据后,生成PDF文件的方法。掌握这些之后,也可以将其改造成从数据库检索数据后,再生成PDF报表的应用。
本例要点
在应用FPDF/PFI生成PDF文档前,必须事先准备一个PDF文件模板(template)。可以将固定的信息先放在这个模板文件中,实际生成PDF文档时,只用将动态变化的数据写入这个模板文件中就可以了。这样做可以节省许多操作,生成过程的反应时间也会快些。
在下面例子中,从读入PDF模板文件开始,到实际写入动态数据,最后完成PDF文件的生成。这里会做出详细的介绍。
目录结构
本例代码
在使用FPDF生成PDF过程中,默认在输出前后分别调用header/footer方法。header/footer方法默认为空壳状态。如果要输出文件头与文件脚时,必须重写header/footer方法。
设定文字font类型(此处为黑体),样式(B:粗体,I:斜体),大小。
输出单元。cell方法的参数依次为“单元宽度”、“单元高度”、输出对象字符串”、“分界线输出否(0不输出)”、“下一个单元的显示位置(右边显示)”、“字符的位置(C:中间对齐,R:右对齐,L:左对齐)”。单元的宽度指定为0时,单元的宽度可以到右边边界为止。
{nb}是为显示总页数而设定的占位符,后面调用AliasNbPages方法将其置换为总页数。pageNo方法显示现在的页码数。
定义字符代码转换函数,为了防止出现乱码下面将用到这个函数。
生成PDF文档管理对象。传给构造函数的参数依次为“改页方向(P:Portrait,L:Landscape)”、“单位”、“纸张大小”。
AddBig5Font方法只有初始化MyPDF_Chinese类才能调用。
使用setSourceFile方法读入PDF模板文件后,在调用importPage指定实际要作为模板的页码。此处指定的是第一页。但是实际开始使用模板页是从调用useTemplate方法开始的。
addPage方法追加新页,useTemplate方法开始使用模板,useTemplate方法的参数依次为“PDF模板页对象”、“开始位置的X坐标”、“Y坐标”。
设定文字类型,输出坐标。
以数组的形式定义报表的项目名称。
项目为申请日时,以年月日的形式显示日期。
加入改行符。
输出总页数。
输出PDF文档,这里省略了参数。output方法里可以依次指定“下载时的文件名”、“文档的输出方式”。文档的输出方式有“I:直接输出到浏览器”、“D:强制下载”、“F:以本地文件的方式保存”、“S:输出字符串”。
补充
本例注意事项
本节使用的FPDF/FPDI是外部程序库,在运行上述程序前,必须导入到系统中。FPDF/FPDI的代码已经放在本书附带的光盘中了,但是,因为FPDF/FPDI会进行频繁的升级,建议你下载最新的版本。
FPDF的下载与设置
FPDF是提供生成/输出PDF文档等基本功能的程序库。利用FPDF时,需要从FPDF官方网站(http://www.fpdf.org/)下载下列文件。
fpdfXXX.zip为FPDF的主体。解压缩后,目录中有FPDF.php与font文件夹。将其全部复制到PHP的include_path的目录下(Windows环境默认在“C:\php\includes\fpdf”,Linux环境默认在“/usr/local/lip/php/fpdf目录中”)。chinese.php是支持中文必需的PHP脚本,必须放在与FPDF.php相同的目录下。
FPDI的下载与设置
FPDI是FPDF的扩张库,提供将已生成的PDF作为模板导入的功能。利用FPDI前,务必在其官方网站(http://www.setasign.de/products/pdf-php-solutions/fpdi)下载最新版本。
解压缩后放在与FPDF相同的目录下。
使FPDF支持中文的设置
要使FPDF支持中文必须要制作中文字库。在之前要下载制作字库的工具及其中文支持字体库—ttf2pt1与ttf2pt1-chinese。下载网址如下:
http://www.brothersoft.com/ttf2pt1-download-125985.html
http://heanet.dl.sourceforge.net/sourceforge/ttf2pt1/ttf2pt1-chinese-3.4.0.zip
先来制作中文字体,把TTF2TP1里的ttf2tp1.exe解压到一个易于操作的文件夹里,因为要使用WIN的命令行工具,这里就用“C:\ttf”了。然后把TTF2TP1中文包里的ugbk.map也解压到这个目录下。从WIN字体文件夹中找到你想要处理的字体,这里用的是黑体(simhei.ttf),也复制到这个文件夹下吧。
在命令行工具里运行C:\ttf\ttf2pt1.exe -a -L ugbk.map+a1 simhei.ttf simhei,特别提醒:命令里的所有字符都是半角的,如你把两个横线转成了全角,有人运行时提示错误,建议最好不要复制,自己用键盘输入。
经过一番艰苦的运行,C:\ttf文件夹里多出了simhei.afm和simhei.t1a两个文件,后面一个没用了,保留simhei.ttf和simhei.afm,一会儿用。
解压FPDF压缩包,用到的是其中的fpdf.php文件和/font/makefont文件夹,把它们解压或上传到你的服务器目录里吧,如果用的是Linux的服务器,记得把/font文件夹属性改为777,生成的字体文件要写入到这里。
把FPDF中文包里的chinese.php和ex.php两个文件解压或上传到FPDF的根目录下。
把刚才提到的simhei.ttf和simhei.afm复制或上传到/font文件夹内。
在/font文件夹里建立一个文件,形如:
PHP代码:
使用浏览器浏览该文件,屏幕上出现许多东西,不管它,只要看到又生成了两个文件simhei.php和simhei.z,制作字体的工作就完成了,删掉simhei.ttf。做多个字体只需重复上面的工作就可以。所有的字体做完之后,可以把/font/makefont.php文件和/font/makefont文件夹给删除掉。用Linux服务器的朋友记得把/font文件夹的属性给改回来。
共有条评论 网友评论