本文
详细描述了利用PHP动态生成PDF
文件的整个过程。使用
开源工具,如免费的PDF库(可以)或PDFLib-Lite实验,使用PHP代码来
控制PDF
文档内容的格式。
有时你需要精确地控制页面的
显示要
打印的。在这种
情况下,HTML不再是最好的选择。PDF文件使您能够完全控制页面的呈现,以及方式的
文本,图形和图像在
网页渲染。不幸的是,API的使用建立PDF文件不属于标准的PHP工具包的一部分。现在你需要一点帮助。
当你在
网络上
搜索和寻找PHP PDF
支持,你5月1日找到商业PDFLib库及其开源版本pdflib-lite.these很好的图书馆,但商业版本是相当昂贵的,PDFlib库的精简版,图书馆仅分布为蓝本,这发生在当你试图限制托管环境中
安装一个精简版。
另一个
选项是免费的PDF库(可以),这是php的。不需要任何编译就可以完全免费。因此,你不会看到水印你在PDFLib授权版本。这个免费的PDF图书馆图书馆是我在本文中使用。
我们将利用女子滑旱冰比赛的成绩来演示动态构建PDF文件的过程,这些分数是从Web中获取并
转换成XML的。清单1展示了一个XML
数据文件示例。
清单1。XML数据
…
…
…
XML的根元素是一个事件标记,数据按事件分组,每个事件包含多个
游戏。事件标记中是一系列事件标记,这些标签中有多个游戏标记。这些游戏标记包括参加比赛的两个队的名称和他们在比赛中的得分。
清单2显示了用于读取XML的PHP代码。
< PHP
函数得到的结果(){
为XML =新DOMDocument();
为XML ->负荷('events。XML);
$事件=数组();
foreach($ XML -> getElementsByTagName('event)达事件){
游戏=数组();
foreach($事件-> getElementsByTagName(博弈)达游戏){
$游戏数组{ } =('team1= > $游戏-> getAttribute('team1),
算总账= $游戏-> getAttribute('score1),
团队=美元游戏> getAttribute('team2),
score2'游戏-> getAttribute('score2美元));
}
$事件数组{ } =('name' = > $事件-> getAttribute('name'),
游戏= $游戏);
}
返回$事件;
}
>
这个
脚本实现getResults函数读取XML文件的文档,然后使用DOM调用遍历所有的事件和游戏标签建立事件数组。序列中的每个元素是一个哈希表包含事件名称和参赛项目的阵列。结构基本的XML结构的
内存版。
为了测试这个脚本的
功能,我们将
创建一个HTML导出网页,阅读赢得函数文件,并在一系列HTML表格输出数据。清单3显示了用于测试PHP代码。
清单3。html页面的结果
< PHP
include_once('getresults。php);
结果=美元得到的结果();
foreach($结果达事件){
>
< PHP
foreach($事件{ 'games}达游戏){
$ S1 =(int)$游戏{ 'score1};
$ S2 =(int)$游戏{ 'score2};
>
< PHP
}
>
$ S2)'bold:正常> >>
美元'bold S1):正常> >>
< PHP
}
>
用代码getresults.php,XML数据文件
上传到Web
服务器,你可以看看HTML的结果,这是类似于图1。
图1。HTML格式的竞争结果
在比赛结果中,获胜队被大胆使用,看哪个队赢了这场比赛。
建立PDF
后得到的数据,应该把重点放在PDF文件的建设。第一步是
下载FPDF库,然后将其安装在同一
目录下的现有的
应用程序文件集。事实上,只要是在PHP库的
路径,你可以安装任何你喜欢的地方。轨道的地方你把
字体目录下,因为你需要
设置的fpdf_fontpath,如清单4所示。
清单4。PDF你好世界
< PHP
定义('fpdf_fontpath ',' / / /文档库服务器 / / /字体德比);
要求('fpdf。php);
美元=新FPDF(PDF);
为PDF格式->设置字体('arial ',' ',72);
为PDF -> AddPage();
为PDF ->细胞(40,10,你好世界!
输出();
>
这个剧本实际上是一个Hello World,但它不是一个HTML PDF格式。这个脚本的第一个
操作是使用自定义报表设置的FPDF字体目录的
位置,然后要求语句是用来引入FPDF库。这个脚本创建从图书馆的FPDF对象,设置字体,添加一个页面,然后把一些文字在网页上使用的细胞的
方法,并输出PDF。
图2显示了正常情况下的所有结果。
图2。你好世界PDF格式
如果你不看PDF,你可能想
运行这个脚本
命令行上看如果你已经失去了fpdf.php文件或者有其他问题。
现在PDF是正常的,现在应该把它与一个滑动结果文件合并,看看可以动态生成什么。清单5显示了合并操作的第一个版本。
清单5。显示结果PDF的第一个版本。
< PHP
定义('fpdf_fontpath ',' / / /文档库服务器 / / /字体德比);
要求('fpdf。php);
要求('getresults。php);
课堂延伸可以PDF
{
功能事件表($事件)
{
美元->细胞(40,10,$事件{ 'name' },15);
此$;
}
}
新的PDF();
为PDF格式->设置字体('arial ',' ',48);
foreach()得到的结果(美元事件){
为PDF -> AddPage();
为PDF ->事件表($事件);
}
输出();
>
而不是
扩展FPDF类从外面,我们用我们自己的PDF类延长FPDF类。在这些子类中,我们创建了一个新的方法称为事件表对于一个给定的活动建立一个结果表。在这种情况下,我们从小和输出事件的名称的名称位于开始。在脚本的底部,用foreach循环,增加了每一个活动页面,然后调用事件表的方法。
您可以在图3中看到该脚本的输出。
图3。动态PDF的第一个版本
向下滚动页面显示每个事件都在自己的页面上。下一步是开始将结果添加到页面中。
构建结果表
在构建PDF文件时,构建一个无表结构就像构建一个HTML一样简单。构建表的方法是构建许多不同的单元,如一些宽度、字体、填充颜色和行色。
清单6显示了将标题栏添加到表中的代码。
清单6。添加结果表的标题
< PHP
定义('fpdf_fontpath ',' / / /文档库服务器 / / /字体德比);
要求('fpdf。php);
要求('getresults。php);
课堂延伸可以PDF
{
功能事件表($事件)
{
美元->设置字体('',B,'24);
美元->细胞(40,10,$事件{ 'name' },15);
此$;
美元-> setxy(10, 45);
美元->设置字体('',B,10');
美元-> setfillcolor(128128128);
美元-> SetTextColor(255);
美元-> setdrawcolor(92,92,92);
美元->设置线的宽度2(。3);
美元->细胞(70,7,团队1
美元->细胞(20,7,得分1
美元->细胞(70,7,团队2
美元->细胞(20,7,得分2
此$;
}
}
新的PDF();
为PDF格式->设置字体('arial ',' ',10);
foreach()得到的结果(美元事件){
为PDF -> AddPage();
为PDF ->事件表($事件);
}
输出();
>
这里的Add代码用于设置字体、颜色和线宽,然后它将显示包含四个标题列的几个单元格。然后调用LN方法(此方法相当于回车键)以
启用新行。
当您在
浏览器中查看此脚本时,您可以看到类似于图4的内容。
图4。包含表标题行的页。
在图4中,标题用白色文本呈现在灰色
背景中。这种格式有助于将它与标题下显示的数据区分开来。要显示游戏的结果,请在清单7中添加以下代码。
清单7。添加完整的结果表
< PHP
定义('fpdf_fontpath ',' / / /文档库服务器 / / /字体德比);
要求('fpdf。php);
要求('getresults。php);
课堂延伸可以PDF
{
功能事件表($事件)
{
美元->设置字体('',B,'24);
美元->细胞(40,10,$事件{ 'name' },15);
此$;
美元->设置字体('',B,10');
美元-> setfillcolor(128128128);
美元-> SetTextColor(255);
美元-> setdrawcolor(92,92,92);
美元->设置线的宽度2(。3);
美元->细胞(70,7,团队1
美元->细胞(20,7,得分1
美元->细胞(70,7,团队2
美元->细胞(20,7,得分2
此$;
美元-> setfillcolor(224235255);
美元-> SetTextColor(0);
美元->设置字体();
填充= false;
foreach($事件{ 'games} $游戏)
{
美元->设置字体('times ',(((int){ } > 'score1美元游戏(int)$游戏{ 'score2})'bi ':');
美元->细胞(6,游戏'team1'} {美元,'lr ',0,'我',为填补);
美元->细胞(20,6,游戏'score1'} {美元,'lr ',0,R,$填写);
美元->设置字体('times ',(((int){ } < 'score1美元游戏(int)$游戏{ 'score2})'bi ':');
美元->细胞(6,游戏'team2'} {美元,'lr ',0,'我',为填补);
美元->细胞(20,6,游戏'score2'} {美元,'lr ',0,R,$填写);
此$;
填充=填充;
}
美元->细胞(180,0,' ',不');
}
}
新的PDF();
为PDF格式->设置字体('arial ',' ',10);
foreach()得到的结果(美元事件){
为PDF -> AddPage();
为PDF ->事件表($事件);
}
输出();
>
除了标题行,有一个foreach循环事件表的方法,将重复在每一场比赛。图5显示了用于此目的的代码。
图5。包含结果表的pdf。
充满变数的美元可以通过交换表中每行的颜色变化。冠军球队的
名字和分数表示粗体,斜体字体,这样他们可以清楚地显示出来。也要注意字体是从标题中用来显示竞争内容的字体Arial字体很重要。
要完成示例代码,需要添加一些图形。
使用图形
修改 将图像添加到PDF中非常简单。首先,您需要从Web上抓取一个图像。我抓住了一个光滑的团队的标志,并将其存储为PNG格式的图像。从那时起,我一直在使用清单8中的新代码。
清单8。添加徽标图像
< PHP
定义('fpdf_fontpath ',' / / /文档库服务器 / / /字体德比);
要求('fpdf。php);
要求('getresults。php);
课堂延伸可以PDF
{
功能事件表($事件)
{
美元->图像('logo。png,5,5,33);
美元-> setxy(40, 15);
美元->设置字体('',B,'24);
美元->细胞(40,10,$事件{ 'name' },15);
此$;
美元-> setxy(10, 45);
美元->设置字体('',B,10');
美元-> setfillcolor(128128128);
美元-> SetTextColor(255);
美元-> setdrawcolor(92,92,92);
美元->设置线的宽度2(。3);
美元->细胞(70,7,团队1
美元->细胞(20,7,得分1
美元->细胞(70,7,团队2
美元->细胞(20,7,得分2
此$;
美元-> setfillcolor(224235255);
美元-> SetTextColor(0);
美元->设置字体();
填充= false;
foreach($事件{ 'games} $游戏)
{
美元->设置字体('times ',(((int){ } > 'score1美元游戏(int)$游戏{ 'score2})'bi ':');
美元->细胞(6,游戏'team1'} {美元,'lr ',0,'我',为填补);
美元->细胞(20,6,游戏'score1'} {美元,'lr ',0,R,$填写);
美元->设置字体('times ',(((int){ } < 'score1美元游戏(int)$游戏{ 'score2})'bi ':');
美元->细胞(6,游戏'team2'} {美元,'lr ',0,'我',为填补);
美元->细胞(20,6,游戏'score2'} {美元,'lr ',0,R,$填写);
此$;
填充=填充;
}
美元->细胞(180,0,' ',不');
}
}
新的PDF();
为PDF格式->设置字体('arial ',' ',10);
foreach()得到的结果(美元事件){
为PDF -> AddPage();
为PDF ->事件表($事件);
}
输出();
>
清单8中的关键方法是图像方法,它为图像、位置和宽度选择文件名。所有其他
参数都是可选的,因此您只指定您想要的信息。
一些新的调用setxy移动文本和表格送到
正确的地点,以防止图像叠加。
图6显示了这个脚本的输出。
图6。带有标志图像的完整PDF
PDF库还提供其他方式来呈现图形、添加流文本、添加超链接、
管理页边距和方向等。你可以完全控制你的PDF文件。
结语
使用正确的工具,通过PHP构建PDF文件非常容易,这种方法非常适合于打印X票或票据,或填写表单,以及任何需要严格控制内容布局的项目。