译注:(保留)
作php已经有一年多了吧,从3.0到4.0,不能说有多高(我现在也只是大菜鸟,比起何、hunte,差多了,当然还有别的高手),但也有些经验。从php的火热 到现在的平静, 一路看的多了,听的也多了,见过的"高手"(会写留言板,聊天室什么的)也多,静下来一想:php只是一种语言。它自有 它存在的必要。国内的也只停留在低水平的层次,想当初国外在大力发展asp组件时我们却只会用asp,php也一样。不过要感谢 php,它让我得到了生平的第二份工作(第一份是asp的,当初狠学c/c++,怎么也没想到吧),当然也通过它认识了不少朋友,hunte,陈老板,一蛇, 何志强(虽然至今没有联络,但他的文章让我受益非),sony,macro,cfr... 为了生计,为了将来的发展,小生将离开php界,虽然不愿, 但也无奈,将拖了很久的一篇文章译出来作为最后的礼物献给大家,献给所有使用php&mysql的朋友。如果有学习vc和驱动开发的朋友可以和
我联络,让我们一起来探讨。
---------------------------------------------------------------
动机
www上的交互意味着填表、点击submit按钮,然后得到一个确定的结果。html和http提供一个机制来通过表单很容易地执行这种操作。 php用一种非常便利的方法来支持这种机制,每个输入域(译注:表单的输入框)的值被存贮为一个与输入域同名的php变量。
一个很相似的机制已经被adobe开发着,但是是为pdf文档。他们简单地叫它acrobat 表单。 从用户的观点来看,html表单和acrobat表 单唯一的不同是它们的外观。前者使用html文档,后者使用pdf文档来呈现表单。
要开发web界面,acrobat表单也可以象html表单一样被处理,如果这个表单象html表单一样提供输入数据。然而,adobe 已经为表单数 据提出一个新的格式叫fdf(表单数据格式)。php已经包含这种格式的支持。
用数据生成一个pdf文档的可能性,如定制它,是acrobat 表单的附加特性了.用pdf文档作为表单并且在php中用数据生成pdf文档将在 这篇文章中被描述。你会发现这两个例了是多么的容易。
在你开始试这篇文章中的在线例子之前你要安装acrobat阅读器插件或使用acrobat 4.如果你想在自己的web服务器上测试php脚本你也要安装pdf工具包并使php中的fdf支持生效。
最后,如果你开发你自己的pdf表单你需要acrobat exchange 3.x或acrobat 4。
在过去的几年中,adobe已经开发出可便携文档格式(pdf)并且扩展了它。一种扩展是允许用户输入数据并送到服务器中处理的acrobat 表单,就象html表单。
这样的pdf文档与静态的pdf文档很相似,但当你用acrobat阅读器看它时,你会发现可编辑的区域。 就象html中一样有很多输入域有效,例如 提交和重置按钮,文本输入域,检查框等等.. 创建这样一个pdf表单需要acrobat exchange 3.x或新的acrobat 4软件,不幸的是它们只能在windows和macos中运行。
两者都提供一个方式来放置不同的输入域到一个已存在的pdf文档中。
提交按钮传送在它被按下时调用的url属性。这非常象html,但不同的是在数据被传送到服务器时的格式。
在按下submit按钮时,数据是用一个在url中可以被观察的确定格式从html表单传输。acrobat表单支持这种格式,还有fdf(表单数据格式) fdp是一种新格式,需要fdf工具包(当前版本4.0)解释。如果php在编译时加了fdf支持,它就能解析fdf数据并且用名字存取任何输入域。 fdf数据一般被存在php的http_raw_post_data变量中(就象html数据存储在http_poat_data中一样)
数据的实际赋值是在php脚本中完成的,相反的是html提交数据是在php引擎中被赋值的。
要想得到一个fdf数据看起来的样子,这儿是一个例子:(译注:从网上拷下的原始文件如此,我也看不清乱码是什么,不过如果放在英文系统中能看清吧)
%fdf-1.2 %忏嫌 1 0 obj << /fdf << /fields [ << /v (this is just some text for testing)/t (comment)>> ....
这个仅仅是一个完整记录的第一部分,但它能明显地表示出输入域的注解(译注:可能是标题吧)和它的值。这儿是测试文本。
这了让它更清楚,提供一个简单的例子。首先,假设我们有一个包含数量,出版者,准备者,日期,注解发行者,发行准备者等域的pdf表单。 前五个域是文本域,最后两个域是检查框(check box)。我们的php脚本总会显示数量、日期、注解域的值,当相应的检查框选中时才显示出版者、准备者域的值。
如果这个框(check box)被选中,它们的值是"on"这是在表单被创建时设置的。当然这个表单也有提交按钮,在我们的这个例子中它甚至有reset按钮。
点击提交按钮运行下面的脚本。这个脚本象上面所述的来赋域数据的值。
<?php
$fdffp = fopen("test.fdf", "w");
fwrite($fdffp, $http_raw_post_data, strlen($http_raw_post_data));
fclose($fdffp);
$fdf = fdf_open("test.fdf");
$volume = fdf_get_value($fdf, "volume");
echo "the volume field has the value '<b>$volume</b>'<br>";
$date = fdf_get_value($fdf, "date");
echo "the date field has the value '<b>$date</b>'<br>";
$comment = fdf_get_value($fdf, "comment");
echo "the comment field has the value '<b>$comment</b>'<br>";
if(fdf_get_value($fdf, "show_publisher") == "on") {
$publisher = fdf_get_value($fdf, "publisher");
echo "the publisher field has the value '<b>$publisher</b>'<br>";
} else
echo "publisher shall not be shown.<br>";
if(fdf_get_value($fdf, "show_preparer") == "on") {
$preparer = fdf_get_value($fdf, "preparer");
echo "the preparer field has the value '<b>$preparer</b>'<br>";
} else
echo "preparer shall not be shown.<br>";
fdf_close($fdf);
?>
你可以试试这个例子 http://gehtnix.fernuni-hagen.de:8000/testfdf/example1.pdf
比较实际情况,pdf表单比html表单有更好的外观,这种技术好象没有确切的优势。然而,pdf有另一种用处。你可以回顾一下上面的
过程,并用数据组成一个pdf文档。
如果你需要定制pdf文档中仅需的几个确定部分,象地址,日期等等。它也可以用于创建完整的pdf文档,但要用php的pdf文档功能创建混合文档
需要很多工作。
例如在通常情况下,它也值得用于设计者创建准备文档(译注:可能是草稿吧)。用php中的pdf文档功能创建pdf表单(译注:不是fdf文档)几乎不可能的。
在fdf中用数据组成一个pdf文档很简单。你用acrobat 4的话将必须创建一个pdf文档并在其中加入输入域。放到你的web服务器上。 然后,你需要用php创建fdf文档,它包含每个域,它的值和数据将被插入的文档的参考。(这个pdf文档你刚才已经建好了)。这个会在php中被飞快地处理。文档的参考是一个指向pdf文档的url。
以第一个例子为基础,下面的php脚本非常容易。脚本的第二部分已经加入了。
<?php
$fdffp = fopen("test.fdf", "w");
fwrite($fdffp, $http_raw_post_data, strlen($http_raw_post_data));
fclose($fdffp);
$fdf = fdf_open("test.fdf");
$volume = fdf_get_value($fdf, "volume");
$date = fdf_get_value($fdf, "date");
$comment = fdf_get_value($fdf, "comment");
if(fdf_get_value($fdf, "show_publisher") == "on") {
$publisher = fdf_get_value($fdf, "publisher");
} else
$publisher = "";
if(fdf_get_value($fdf, "show_preparer") == "on") {
$preparer = fdf_get_value($fdf, "preparer");
} else
$preparer = "";
fdf_close($fdf);
$outfdf = fdf_create();
fdf_set_value($outfdf, "f_volume", $volume, 0);
fdf_set_value($outfdf, "b_volume", $volume, 0);
fdf_set_value($outfdf, "f_comment", $comment, 0);
fdf_set_value($outfdf, "b_comment", $comment, 0);
fdf_set_value($outfdf, "f_date", $date, 0);
fdf_set_value($outfdf, "b_date", $date, 0);
fdf_set_value($outfdf, "f_preparer", $preparer, 0);
fdf_set_value($outfdf, "b_preparer", $preparer, 0);
fdf_set_value($outfdf, "f_publisher", $publisher, 0);
fdf_set_value($outfdf, "b_publisher", $publisher, 0);
fdf_set_file($outfdf, "http:/testfdf/resultlabel.pdf");
fdf_save($outfdf, "outtest.fdf");
fdf_close($outfdf);
header("content-type: application/vnd.fdf");
$fp = fopen("outtest.fdf", "r");
fpassthru($fp);
unlink("outtest.fdf");
?>
你也可以试试这个例子 http://gehtnix.fernuni-hagen.de:8000/testfdf/example2.pdf
in this example several steps are performed:
在这个例中几个步骤已经完成:
用户已经埴完了pdf 表单 example2.pdf
点击提交按钮后,提交按钮关联的url已经被调用。在这个例子中,已经执行这个php脚本。php脚本检索fdf数据流中的数据并创建新的fdf文档
它包含作为结果的pdf文档的数据。
fdf文档用application/vnd.fdf类型送回。
acrobat插件读取数据并显示这个参考pdf文档。在此例中为 resultlabel.pdf。
这仍不是fdf做的每件事,在这个教程中还有很多遗留的东西需要讨论。
你可以在adobe的web网站检验这篇文档。 ,欢迎访问网页设计爱好者web开发。