- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章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 文件的过程。这些得分是从 Web 中获得并被转换成 XML。清单 1 显示了一个示例 XML 数据文件.
清单 1. XML 数据 。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<
events
>
<
event
name
=
"Beast of the East 2011"
>
<
game
score1
=
"88"
team1
=
"Toronto Gore-Gore Rollergirls"
team2
=
"Montreal La Racaille"
score2
=
"11"
>
<
game
score1
=
"58"
team1
=
"Toronto Death Track Dolls"
team2
=
"Montreal Les Contrabanditas"
score2
=
"49"
>
...
</
game
></
game
></
event
>
<
event
name
=
"Dustbowl Invitational 2011"
>
...
</
event
>
<
event
name
=
"The Great Yorkshire Showdown 2011"
>
...
</
event
>
</
events
>
|
XML 的根元素是一个 events 标记。按事件对数据进行分组,每个事件都包含多个比赛。在 events 标记内,是一系列的 event 标记,在这些标记中有多个 game 标记。 这些 game 标记中包含参加比赛的两个队的名称以及他们在比赛中的得分.
清单 2 展示了用来读取 XML 的 PHP 代码.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<?php
function
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
(
'team1'
=>
$game
->getAttribute(
'team1'
),
'score1'
=>
$game
->getAttribute(
'score1'
),
'team2'
=>
$game
->getAttribute(
'team2'
),
'score2'
=>
$game
->getAttribute(
'score2'
) );
}
$events
[]=
array
(
'name'
=>
$event
->getAttribute(
'name'
),
'games'
=>
$games
);
}
return
$events
;
}
?>
|
这段脚本实现了一个 getResults 函数,以便将 XML 文件读入 DOM 文档。然后使用 DOM 调用遍历所有 event 和 game 标记,以构建一个事件阵列。该数列内的每个元素都是一个散列表,包含事件名称和比赛项目的阵列。结构基本上是 XML 结构的内存版.
为了测试这个脚本的作用,将构建一个 HTML 导出页面,使用 getResults 函数读取文件,然后以一系列 HTML 表的形式输出数据。清单 3 显示了该测试所用的 PHP 代码.
清单 3. 结果 HTML 页面 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
<?
php
include_once('getresults.php');
$
results
=
getResults
();
foreach( $results as $event ) {
?>
<
h1
><?
php
echo( $event['name'] ) ?></
h1
>
<?
php
foreach( $event['games'] as $game ) {
$s1 = (int)$game['score1'];
$s2 = (int)$game['score2'];
?>
<?
php
}
?>
<
table
><
tbody
><
tr
>
<
td
style="font-weight:<?php echo( ( $s1 > $s2 ) ? 'bold' : 'normal') ?>">
<?
php
echo( $game['team1'] ) ?></
td
>
<
td
><?
php
echo( $s1 ) ?></
td
>
<
td
style="font-weight:<?php echo( ( $s2 > $s1 ) ? 'bold' : 'normal') ?>">
<?
php
echo( $game['team2'] ) ?></
td
>
<
td
><?
php
echo( $s2 ) ?></
td
>
</
tr
></
tbody
></
table
>
<?
php
}
?>
|
通过代码 getresults.php,XML 数据文件被上传到 Web 服务器,您可以查看 HTML 结果,这与 图 1 类似。 图 1. HTML 格式的竞赛结果 。
在该结果中,对获胜队使用了粗体,以便查看哪支队赢得了哪场比赛.
构建 PDF 。
获得数据之后,应将重点放在构建 PDF 文件上。第一步是下载 FPDF 库,然后将其安装在与现有应用文件集相同的目录中。实际上,只要是在 PHP 库路径中,您可以将它安装在任何您喜欢的地方。追踪您放置字体目录的地方,因为您需要设置 ‘FPDF_FONTPATH',如 清单 4 所示.
清单 4. PDF Hello World 。
1
2
3
4
5
6
7
8
9
10
11
|
<?php
define(
'FPDF_FONTPATH'
,
'/Library/WebServer/Documents/derby/font/'
);
require
(
'fpdf.php'
);
$pdf
=
new
FPDF();
$pdf
->SetFont(
'Arial'
,
''
,72);
$pdf
->AddPage();
$pdf
->Cell(40,10,
"Hello World!"
,15);
$pdf
->Output();
?>
|
这段脚本实际上是一个 “Hello World”,但采用的是 PDF 格式而不是 HTML。这段脚本执行的第一个操作是使用 define 语句设置 FPDF 字体目录的位置。然后使用 require 语句引入 FPDF 库。这段脚本从该库创建了一个 FPDF 对象,设置字体,添加一个页面,然后使用 Cell 方法将一些文本放在该页面上,并输出 PDF.
图 2 展示了一切都正常情况下的结果.
图 2. PDF 格式的 Hello World 。
如果没有看到 PDF,那么您可能想在命令行运行这段脚本,查看是否丢失了 fpdf.php 文件或者存在其他问题.
既然 PDF 呈现正常,那么现在应该将其与旱滑结果文件合并,并查看可以动态生成哪些内容。清单 5 展示了该合并操作的第一个版本.
清单 5. 显示结果的首版 PDF 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<?php
define(
'FPDF_FONTPATH'
,
'/Library/WebServer/Documents/derby/font/'
);
require
(
'fpdf.php'
);
require
(
'getresults.php'
);
class
PDF
extends
FPDF
{
function
EventTable(
$event
)
{
$this
->Cell(40,10,
$event
[
'name'
],15);
$this
->Ln();
}
}
$pdf
=
new
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. 添加结果表标题 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
<?php
define(
'FPDF_FONTPATH'
,
'/Library/WebServer/Documents/derby/font/'
);
require
(
'fpdf.php'
);
require
(
'getresults.php'
);
class
PDF
extends
FPDF
{
function
EventTable(
$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
=
new
PDF();
$pdf
->SetFont(
'Arial'
,
''
,10);
foreach
( getResults()
as
$event
) {
$pdf
->AddPage();
$pdf
->EventTable(
$event
);
}
$pdf
->Output();
?>
|
此处的添加代码用于设置字体、颜色和行宽。然后它将呈现包含四个标题列的几个单元格。然后调用 Ln 方法(该方法与回车键等效)启用一个新行.
在浏览器中查看这段脚本时,可以看到类似 图 4 的内容.
图 4. 包含表的标题行的页面 。
在 图 4 中,标题以白色文本呈现在灰色背景上。这种格式有助于将其与呈现在标题下面的数据进行区分。要呈现比赛结果,请在 清单 7 中添加以下代码.
清单 7. 添加完整的结果表 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
<?php
define(
'FPDF_FONTPATH'
,
'/Library/WebServer/Documents/derby/font/'
);
require
(
'fpdf.php'
);
require
(
'getresults.php'
);
class
PDF
extends
FPDF
{
function
EventTable(
$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
[
'score1'
]>(int)
$game
[
'score2'
])?
'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
[
'score1'
]<(int)
$game
[
'score2'
])?
'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
=
new
PDF();
$pdf
->SetFont(
'Arial'
,
''
,10);
foreach
( getResults()
as
$event
) {
$pdf
->AddPage();
$pdf
->EventTable(
$event
);
}
$pdf
->Output();
?>
|
除了标题行之外,在 EventTable 方法中还有一个 foreach 循环,它将在每个比赛上进行迭代。图 5 显示了用于此用途的代码.
图 5. 包含结果表的 PDF 。
$fill 变量可通过切换来改变表中每行的颜色。优胜队的名称和得分用加粗、斜体字体表示,这样可以清晰显示它们。还需注意的是,字体从标题的 Arial 字体更改成了显示比赛内容所用的 Times 字体.
要完成示例代码,则需要添加一些图形.
使用图形进行修饰 。
向 PDF 添加图像非常容易。首先需要从 Web 抓取一个图像。我抓取了一个旱滑参赛队的徽标,并将其存储为 PNG 格式的图像。 此后,我一直使用 清单 8 中的新代码.
清单 8. 添加徽标图像 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
<?php
define(
'FPDF_FONTPATH'
,
'/Library/WebServer/Documents/derby/font/'
);
require
(
'fpdf.php'
);
require
(
'getresults.php'
);
class
PDF
extends
FPDF
{
function
EventTable(
$event
)
{
$this
->Image(
'logo.png'
,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
[
'score1'
]>(int)
$game
[
'score2'
])?
'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
[
'score1'
]<(int)
$game
[
'score2'
])?
'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
=
new
PDF();
$pdf
->SetFont(
'Arial'
,
''
,10);
foreach
( getResults()
as
$event
) {
$pdf
->AddPage();
$pdf
->EventTable(
$event
);
}
$pdf
->Output();
?>
|
清单 8中的关键方法是 Image 方法,它为图像、位置和宽度选取一个文件名称。所有其它参数都是可选的,因此您只指定您想要的信息便可.
到 SetXY 的一些新调用会将文本和表左右移动到适当的位置,防止其覆盖图像.
图 6 显示了这段脚本的输出结果.
图 6. 带有徽标图像的已完成的 PDF 。
该 PDF 库还提供了其他方法来呈现图形、添加流文本、添加超链接、管理页边距和方向等结构,您可以完全控制您的 PDF 文件.
结束语 。
使用合适的工具,通过 PHP 构建 PDF 文件是非常容易的。这种方法非常适用于打印发x票或票据,或填写表单,以及需要严格控制内容布局的任何项目.
最后此篇关于PHP在网页中动态生成PDF文件详细教程的文章就讲到这里了,如果你想了解更多关于PHP在网页中动态生成PDF文件详细教程的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我在 JavaScript 文件中运行 PHP,例如...... var = '';). 我需要使用 JavaScript 来扫描字符串中的 PHP 定界符(打开和关闭 PHP 的 )。 我已经知道使
我希望能够做这样的事情: php --determine-oldest-supported-php-version test.php 并得到这个输出: 7.2 也就是说,php 二进制检查 test.
我正在开发一个目前不使用任何框架的大型 php 站点。我的大问题是,随着时间的推移慢慢尝试将框架融入应用程序是否可取,例如在创建的新部件和更新的旧部件中? 比如所有的页面都是直接通过url服务的,有几
下面是我的源代码,我想在同一页面顶部的另一个 php 脚本中使用位于底部 php 脚本的变量 $r1。我需要一个简单的解决方案来解决这个问题。我想在代码中存在的更新查询中使用该变量。 $name)
我正在制作一个网站,根据不同的情况进行大量 PHP 重定向。就像这样...... header("Location: somesite.com/redirectedpage.php"); 为了安全起见
我有一个旧网站,我的 php 标签从 因为短标签已经显示出安全问题,并且在未来的版本中将不被支持。 关于php - 如何避免在 php 文件中写入
我有一个用 PHP 编写的配置文件,如下所示, 所以我想用PHP开发一个接口(interface),它可以编辑文件值,如$WEBPATH , $ACCOUNTPATH和 const值(value)观
我试图制作一个登录页面来学习基本的PHP,首先我希望我的独立PHP文件存储HTML文件的输入(带有表单),但是当我按下按钮时(触发POST到PHP脚本) )我一直收到令人不愉快的错误。 我已经搜索了S
我正在寻找一种让 PHP 以一种形式打印任意数组的方法,我可以将该数组作为赋值包含在我的(测试)代码中。 print_r 产生例如: Array ( [0] => qsr-part:1285 [1]
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: What is the max key size for an array in PHP? 正如标题所说,我想知道
我正在寻找一种让 PHP 以一种形式打印任意数组的方法,我可以将该数组作为赋值包含在我的(测试)代码中。 print_r 产生例如: Array ( [0] => qsr-part:1285 [1]
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我在 MySQL 数据库中有一个表,其中存储餐厅在每个工作日和时段提供的菜单。 表结构如下: i_type i_name i_cost i_day i_start i_
我有两页。 test1.php 和 test2.php。 我想做的就是在 test1.php 上点击提交,并将 test2.php 显示在 div 中。这实际上工作正常,但我需要向 test2.php
我得到了这个代码。我想通过textarea更新mysql。我在textarea中回显我的MySQL,但我不知道如何更新它,我应该把所有东西都放进去吗,因为_GET模式没有给我任何东西,我也尝试_GET
首先,我是 php 的新手,所以我仍在努力学习。我在 Wordpress 上创建了一个表单,我想将值插入一个表(data_test 表,我已经管理了),然后从 data_test 表中获取所有列(id
我有以下函数可以清理用户或网址的输入: function SanitizeString($var) { $var=stripslashes($var); $va
我有一个 html 页面,它使用 php 文件查询数据库,然后让用户登录,否则拒绝访问。我遇到的问题是它只是重定向到 php 文件的 url,并且从不对发生的事情提供反馈。这是我第一次使用 html、
我有一个页面充满了指向 pdf 的链接,我想跟踪哪些链接被单击。我以为我可以做如下的事情,但遇到了问题: query($sql); if($result){
我正在使用 从外部文本文件加载 HTML/PHP 代码 $f = fopen($filename, "r"); while ($line = fgets($f, 4096)) { print $l
我是一名优秀的程序员,十分优秀!