PHP的FDF文档支持

译注:(保留)  
作PHP已经有一年多了吧,从3.0到4.0,不能说有多高(我现在也只是大菜鸟,比起何、Hunte,差多了,当然还有别的高手),但也有些经验。从PHP的火热  到现在的平静, 一路看的多了,听的也多了,见过的"高手"(会写留言板,聊天室什么的)也多,静下来一想:PHP只是一种语言。它自有  它存在的必要。国内的web开发也只停留在低水平的层次,想当初国外在大力发展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网站检验这篇文档。 

时间: 2024-10-31 01:54:32

PHP的FDF文档支持的相关文章

谷歌文档支持文件上传GDriver初现端倪

北京时间1月13日下午消息,据国外媒体报道,谷歌周三称,用户将能上传各种类文件到Google Docs(谷歌文档)账户中,上传文件最大可达250M.此举是谷歌为推出网络硬盘类业务做出的最新努力. 谷歌表示,这一服务可以让用户更轻松地通过网络存取文件,甚至可以放弃U盘,并能更方便地实现文件共享. Google Docs产品经理维贾伊·班加鲁(Vijay Bangaru)在博客中写道:"这一功能还能在开发中,帮助你实现在线的信息组织和协作工作.譬如,建筑师能够将设计图纸发送到建筑公司,学生报的编辑可

全面恢复受损的Word文档

Word是我们日常工作中使用最普遍的文档处理工具之一,但是很多朋友在使用时对碰到的文档出错,常常无计可施.难道只能眼睁睁的看着急需的文档无法打开而放弃吗?当然不能,其实在真正放弃之前,不防先看看我们的拯救行动方案. 一.第一方案:自动恢复 如果在编辑文档时,突然遭遇程序停止响应.死机,甚至死电等情况,而文档又未能及时保存时,这时不防按正常操作方法重新启动电脑,然后打开Word 2003,这样Word会自动弹出一个文档恢复操作窗口,在窗口中选择一个较晚的自动保存项目进行恢复.这样可以将损失降到最低

4招恢复受损Word文档

Word是我们日常工作中使用最普遍的文档处理工具之一,但是很多朋友在使用时对碰到的文档出错,常常无计可施.难道只能眼睁睁的看着急需的文档无法打开而放弃吗?当然不能,其实在真正放弃之前,不防先看看我们的拯救行动方案. 1.修改启动 由于Word文档支持宏命令,因此一些文档的原作者在里面使用宏命令进行加密,或者加载其中的宏命令出错,同样会导致文档无法打开.这时我们不防通过修改Word启动参数,禁止宏运行的方式来打开文档. 进入Word 2003安装目录,然后找到其中的Winword.exe,将其发送

Word文档损坏了怎么办

我们日常再用word文档工作的时候,难免会发生word文件打不开了,word文件损坏了,word里面通常有很多我们平常工作的资料,有时候会有很多很重要的资料;有时候会是很多日积月累的资料.这些对我们的工作都很重要,叫我们直接重新做这份打不开损坏的word是不可能的,我们想的肯定是如果恢复它,打开它. 1 自动恢复 有时候我们再写word的时候,如果关掉word忘了保存了,或者word无响应了不得不把它关了.不防按正常操作方法重新启动电脑,然后打开 Word 2003,这样Word会自动弹出一个文

《iOS 6高级开发手册(第4版)》——2.8节秘诀:声明文档支持

2.8 秘诀:声明文档支持 iOS 6高级开发手册(第4版) 应用程序文档并不仅限于它们创建或者从Internet下载的文件.如你在前一个秘诀中所发现的,应用程序可能处理某些文件类型.它们可能打开从其他应用程序传递过来的项目.你已经从发送方的角度见过了文档共享,它使用"open in"(打开在)控制器把文件导出到其他应用程序.现在应该从接收方的角度探讨它. 应用程序在它们的Info.plist属性列表中声明它们对某些文件类型的支持.Launch Services(启动服务)系统将读取该

“双子星”文档攻击预警:新型的跨平台恶意文档攻击分析报告

本文讲的是"双子星"文档攻击预警:新型的跨平台恶意文档攻击分析报告,近日,360公司QEX团队和追日团队发现了一种新型的跨平台恶意文档攻击开始流行,并捕获到了该攻击在野外出现的恶意样本.该恶意文档支持跨平台攻击,使用了白利用.无文件和windows安全策略绕过等高端攻击技术.以往的office文档只针对windows操作系统和苹果操作系统分别进行攻击,而最新的攻击样本兼容了两个操作系统,用户无论是在哪个系统打开这个文档,都有可能中招,我们将其命名为"双子星"文档攻击

文档在产品设计中的价值

有很多人会问:"说两句话就可以了嘛,为什么还需要写文档这么麻烦呢?"当我们所有的人都在同一办公室工作时,随便喊两句就OK了,为什么还要用文档记下每一件事情这么麻烦呢? 然而,产品文档的价值在于.它能够给整个团队一个参考点,对于这个项目中所需要完成的工作.产品文档提供了一个很好的依据,定义好你的这类产品文档,才能保证在开发过程中,不会出现模凌两可类似的情况.当产品经理看到了一篇新的文章或者是一个新的想法时,都会考虑增加一个全新的功能.一个项目如果没有固定的目标,没有安排日程,没有预先计划

请多多指点—关于项目文档

问题描述 小弟刚刚接触软件开发,希望各位大哥不要见怪.求一个完整项目,从开始到结束都需要一些什么文档支持. 解决方案 解决方案二:要有项目的需求分析,项目介绍 解决方案三:这个么有解决方案四:需求分析文档.概要设计文档.数据库文档.如果设计的好的话,还有功能模块的API接口文档.(非必须)测试文档.最后,软件的安装手册.解决方案五:引用3楼achilles_dynasty的回复: 需求分析文档.概要设计文档.数据库文档.如果设计的好的话,还有功能模块的API接口文档.(非必须)测试文档.最后,软

Flex帮助文档(html格式)制作及ASDoc的使用_Flex

最近工作上需要把这几个月研发的Flex Realspace产品在sp3时上线,急需制作帮助文档,之前开发的时候注释都是按着习惯性卸载代码里面的,也没有考虑后期的帮助文档,这几天愁啊,公司其他Flex产品用的是自己写的带包工具,我可没那么多时间,查了很多资料,希望通过ASDoc达成愿望. ASDoc是adobe官方提供的ActionScript的API文档生成工具,早已经集成在Flex Builder中,我使用的是Flex Builder4.6,使用方法如下: 1.首先配置一个生成文档需要的环境,