PHP动态生成网页中PDF文件的详细教程
详细介绍了使用PHP动态构建PDF文件的全过程。试用免费PDF库(FPDF)或PDFLib-Lite等开源工具,使用PHP代码控制PDF内容格式。
有时您需要精确控制要打印页面的显示。在这种情况下,HTML不再是最好的选择。PDF文件使您可以完全控制页面的呈现方式,以及文本、图形和图像在页面上的呈现方式。不幸的是,用于构建PDF文件的API不是PHP工具包的标准部分。现在你需要提供一些帮助。
当你在网上搜索支持PHP的PDF时,你可能会首先发现商业版的PDFLib库及其开源版本PDFLib-Lite。这些都是很好的库,但是商业版还是挺贵的。PDFLib库的简化版本库仅作为原始版本分发,当您尝试在托管环境中安装简化版本时,会出现这种限制。
另一个选择是免费的PDF库(FPDF),这是一个原生的PHP,没有任何编译,是完全免费的,所以你不会看到像在未经许可的版本的PDFLib水印。这个免费的PDF库正是我将在本文中使用的。
我们将用女子旱冰比赛的成绩来演示动态构建PDF文件的过程。这些分数是从网络上获得的,并被转换成XML。清单1显示了一个示例XML数据文件。
清单1。XML数据
赛事活动名称=' 2011年东部野兽'比赛评分1='88' team1='多伦多戈尔-戈尔罗尔格尔斯' team2='蒙特利尔La Racaille '评分2='11 '比赛评分1='58' team1='多伦多死亡轨迹娃娃' team2='蒙特利尔Les Contrabanditas '评分2='49 './game/game/Event活动名称=' 2011年尘碗邀请赛'./event event name=' 2011年约克郡大对决'./event/events XML的根元素是一个events标记。数据按项目分组,每个项目包含多个比赛。在事件标签内,有一系列事件标签,其中有多个游戏标签。这些游戏标签包含参加比赛的两个队的名字和他们在比赛中的得分。
清单2显示了用于读取XML的PHP代码。
?phpffunction getResults(){ $ XML=new DOMDocument();$ XML-load(' events . XML ');$ events=array();foreach($ XML-getElementsByTagName(' event ')as $ event){ $ games=array();foreach($ event-getElementsByTagName(' game ')as $ game){ $ games[]=array(' team 1 '=$ game-getAttribute(' team 1 '),' score 1 '=$ game-getAttribute(' score 1 '),' team 2 '=$ game-getAttribute(' score 2 '),' score 2 '=$ game-getAttribute(' score 2 '));} $ events[]=array(' name '=$ event-GetAttribute(' name '),' games '=$ games);}返回$ events}?这个脚本实现了一个getResults函数,将XML文件读入DOM文档。然后使用DOM调用遍历所有的事件和游戏标签来构建一个事件数组。系列中的每个元素都是包含事件名称和事件数组的哈希表。结构基本上是XML结构的内存版本。
为了测试这个脚本的效果,我们将构建一个HTML导出页面,使用getResults函数读取文件,然后以一系列HTML表的形式输出数据。清单3显示了用于该测试的PHP代码。
清单3。结果网页
?phpinclude _ once(' get results . PHP ');$ results=getResults();foreach($结果为$event ) {?h1?php echo($event['name'])?/h1?phpforeach($ event[' games ']as $ game){ $ S1=(int)$ game[' score 1 '];$ S2=(int)$ game[' score 2 '];php}?tablebodytr TD style=' font-weight :PHP echo($ S1 $ S2)bold' : '正常')?'?php echo($game['team1'])?TD/TD?php echo($s1)?/TD TD TD style=' font-weight :PHP echo($ S2 $ S1)bold' : '正常')?'?php echo($game['team2'])?TD/TD?php echo($s2)?/td/tr/tbody/table?php}?通过代码getresults.php,XML数据文件被上传到网络服务器,您可以查看HTML结果,类似于图1。图1。HTML格式的竞赛结果
在这个结果中,粗体用于获胜队,以查看哪个队赢得了哪场比赛。
构建PDF
得到数据后,我们应该专注于构建PDF文件。第一步是下载FPDF库,并将其安装在与现有应用程序文件集相同的目录中。事实上,只要它在PHP库路径中,你就可以把它安装在你喜欢的任何地方。跟踪字体目录的位置,因为您需要设置“FPDF _字体路径”,如清单4所示。
清单4。你好,世界
?phpdefine('FPDF_FONTPATH ','/Library/WebServer/Documents/derby/font/');需要(' fpdf . PHP ');$pdf=新FPDF();$pdf-SetFont('Arial ','',72);$ pdf-AddPage();$pdf-Cell(40,10,'你好,世界!',15);$ pdf-Output();这个脚本实际上是一个“Hello World”,但它是PDF格式的,而不是HTML。该脚本执行的第一个操作是使用define语句设置FPDF字体目录的位置。然后用require语句介绍FPDF图书馆。这个脚本从库中创建一个FPDF对象,设置字体,添加一个页面,然后使用单元格方法在页面上放置一些文本,并输出PDF。
图2显示了一切正常时的结果。
图2。你好,PDF格式的世界
如果没有看到PDF,您可能希望在命令行上运行此脚本,以查看fpdf.php文件是否丢失或有其他问题。
现在PDF已经正常渲染了,是时候将其与干滑动结果文件合并,看看可以动态生成什么了。清单5显示了合并操作的第一个版本。
清单5。显示结果的第一个PDF
?phpdefine('FPDF_FONTPATH ','/Library/WebServer/Documents/derby/font/');需要(' fpdf . PHP ');require(' get results . PHP ');类PDF扩展了PDF函数event table($ event){ $ this-Cell(40,10,$event['name'],15);$ this-Ln();}}$pdf=新PDF();$pdf-SetFont('Arial ','',48);foreach(getResults()as $ event){ $ pdf-AddPage();$ pdf-EventTable($ event);} $ pdf-Output();我们没有从外部扩展FPDF类,而是使用我们自己的PDF子类来扩展FPDF类。在这些子类中,我们创建了一个名为EventTable的新方法,并为给定的事件构建了一个结果表。在这种情况下,我们从一个小地方开始,只输出事件名称。该名称位于脚本的底部,包装在foreach循环中,该循环为每个事件添加一个页面,然后调用EventTable方法。
您可以在图3中看到这个脚本的输出。
图3。动态PDF的第一版
向下滚动页面以显示每个事件都在自己的页面上。这里的下一步是开始向页面添加结果。
构建结果表
构建PDF文件时,就像构建HTML一样简单。构建表格的方法是构建许多具有不同宽度、字体、填充颜色、行颜色等的单元格。
清单6显示了设置表格标题栏的添加代码。
清单6。添加结果表的标题
?phpdefine('FPDF_FONTPATH ','/Library/WebServer/Documents/derby/font/');需要(' fpdf . PHP ');require(' get results . PHP ');类PDF扩展了PDF函数event table($ event){ $ this-SetFont(',' B ',' 24 ');$this-Cell(40,10,$event['name'],15);$ this-Ln();$this-SetXY(10,45);$this-SetFont(“”、“B”、“10”);$this-SetFillColor(128,128,128);$ this-SetTextColor(255);$this-SetDrawColor(92,92,92);$ this-SetLineWidth(. 3);$this-Cell(70,7,' Team 1 ',1,0,' C ',true);$this-Cell(20,7,' Score 1 ',1,0,' C ',true);$this-Cell(70,7,' Team 2 ',1,0,' C ',true);$this-Cell(20,7,' Score 2 ',1,0,' C ',true);$ this-Ln();}}$pdf=新PDF();$pdf-SetFont('Arial ','',10);foreach(getResults()as $ event){ $ pdf-AddPage();$ pdf-EventTable($ event);} $ pdf-Output();这里添加的代码用于设置字体、颜色和线宽。然后它将呈现几个带有四个标题列的单元格。然后调用Ln方法(相当于回车键)启用新线路。
在浏览器中查看该脚本时,您可以看到类似于图4的内容。
图4。带有表格标题行的页面
在图四中,标题以白色文本呈现在灰色背景上。这种格式有助于将其与呈现在标题下面的数据进行区分。要呈现比赛结果,请在清单七中添加以下代码。
清单7.添加完整的结果表
?phpdefine('FPDF_FONTPATH ','/Library/WebServer/Documents/derby/font/');需要(' fpdf。PHP’);require('获取结果。PHP’);类便携文档格式扩展了便携文档格式函数事件表($ event){ $ this-SetFont(',' B ',' 24 ');$this-Cell(40,10,$event['name'],15);$ this-Ln();$this-SetFont(“”、“B”、“10”);$this-SetFillColor(128,128,128);$ this-SetTextColor(255);$this-SetDrawColor(92,92,92);$ this-SetLineWidth(。3);$this-Cell(70,7,' Team 1 ',1,0,' C ',true);$this-Cell(20,7,' Score 1 ',1,0,' C ',true);$this-Cell(70,7,' Team 2 ',1,0,' C ',true);$this-Cell(20,7,' Score 2 ',1,0,' C ',true);$ this-Ln();$this-SetFillColor(224,235,255);$ this-SetTextColor(0);$ this-SetFont(" ");$ fill=false foreach($ event[' games ']as $ game){ $ this-SetFont(' Times ',((int)$ game[' score 1 '](int)$ game[' score 2 '])?BI ' : ' ');$this-Cell(70,6,$game['team1'],' LR ',0,' L ',$ fill);$this-Cell(20,6,$game['score1'],' LR ',0,' R ',$ fill);$this-SetFont('Times ',((int)$ game[' score 1 '](int)$ game[' score 2 '])?BI ' : ' ');$this-Cell(70,6,$game['team2'],' LR ',0,' L ',$ fill);$this-Cell(20,6,$game['score2'],' LR ',0,' R ',$ fill);$ this-Ln();$fill=!$ fill} $this-Cell(180,0 ' ',' T ');}}$pdf=新PDF();$pdf-SetFont('Arial ','',10);foreach(getResults()as $ event){ $ pdf-AddPage();$ pdf-EventTable($ event);} $ pdf-Output();除了标题行之外,在事件表方法中还有一个为每一个循环,它将在每个比赛上进行迭代。图5显示了用于此用途的代码。
图5.包含结果表的便携文档格式
$填充变量可通过切换来改变表中每行的颜色。优胜队的名称和得分用加粗、斜体字体表示,这样可以清晰显示它们。还需注意的是,字体从标题的天线字体更改成了显示比赛内容所用的英国泰晤士报(1785 年创刊)字体。
要完成示例代码,则需要添加一些图形。
使用图形进行修饰
向便携文档格式添加图像非常容易。首先需要从网抓取一个图像。我抓取了一个旱滑参赛队的徽标,并将其存储为巴布亚新几内亚格式的图像。此后,我一直使用清单8中的新代码。
清单8.添加徽标图像
?phpdefine('FPDF_FONTPATH ','/Library/WebServer/Documents/derby/font/');需要(' fpdf。PHP’);require('获取结果。PHP’);类便携文档格式扩展了FPDF {函数事件表($ event){ $ this-Image(' logo。巴布亚新几内亚',5,5,33);$this-SetXY(40,15);$this-SetFont(',' B ',' 24 ');$this-Cell(40,10,$event['name'],15);$ this-Ln();$this-SetXY(10,45);$this-SetFont(“”、“B”、“10”);$this-SetFillColor(128,128,128);$ this-SetTextColor(255);$this-SetDrawColor(92,92,92);$ this-SetLineWidth(。3);$this-Cell(70,7,' Team 1 ',1,0,' C ',true);$this-Cell(20,7,' Score 1 ',1,0,' C ',true);$this-Cell(70,7,' Team 2 ',1,0,' C ',true);$this-Cell(20,7,' Score 2 ',1,0,' C ',true);$ this-Ln();$this-SetFillColor(224,235,255);$ this-SetTextColor(0);$ this-SetFont(" ");$ fill=false foreach($ event[' games ']as $ game){ $ this-SetFont(' Times ',((int)$ game[' score 1 '](int)$ game[' score 2 '])?BI ' : ' ');$this-Cell(70,6,$game['team1'],' LR ',0,' L ',$ fill);$this-Cell(20,6,$game['score1'],' LR ',0,' R ',$ fill);$this-SetFont('Times ',((int)$ game[' score 1 '](int)$ game[' score 2 '])?BI ' : ' ');$this-Cell(70,6,$game['team2'],' LR ',0,' L ',$ fill);$this-Cell(20,6,$game['score2'],' LR ',0,' R ',$ fill);$ this-Ln();$fill=!$ fill} $this-Cell(180,0 ' ',' T ');}}$pdf=新PDF();$pdf-SetFont('Arial ','',10);foreach(getResults()as $ event){ $ pdf-AddPage();$ pdf-EventTable($ event);} $ pdf-Output();清单8中的关键方法是图像方法,它为图像、位置和宽度选取一个文件名称。所有其它参数都是可选的,因此您只指定您想要的信息便可。
到SetXY的一些新调用会将文本和表左右移动到适当的位置,防止其覆盖图像。
图6显示了这个脚本的输出。
图6。带有徽标图像的已完成PDF
PDF库还提供了其他方法来渲染图形、添加流文本、添加超链接、管理边距和方向等。您可以完全控制您的PDF文件。
结束语
使用适当的工具,通过PHP构建PDF文件是非常容易的。这种方式非常适合打印发行X票或票据,填写表格,以及任何需要严格控制内容布局的项目。
版权声明:PHP动态生成网页中PDF文件的详细教程是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。