明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

PHP的FDF文檔支持

[摘要]作者:Uwe Steinmann 來(lái)源:http://www.phpbuilder.com 譯者:znsoft webmaster@phpease.com http://www.phpease....
作者:Uwe Steinmann  
來(lái)源:http://www.phpbuilder.com  
譯者:znsoft webmaster@phpease.com http://www.phpease.com  

譯注:(保留)  
作PHP已經(jīng)有一年多了吧,從3.0到4.0,不能說(shuō)有多高(我現(xiàn)在也只是大菜鳥(niǎo),比起何、Hunte,差多了,當(dāng)然還有別的高手),但也有些經(jīng)驗(yàn)。從PHP的火熱  到現(xiàn)在的平靜, 一路看的多了,聽(tīng)的也多了,見(jiàn)過(guò)的"高手"(會(huì)寫留言板,聊天室什么的)也多,靜下來(lái)一想:PHP只是一種語(yǔ)言。它自有  它存在的必要。國(guó)內(nèi)的web開(kāi)發(fā)也只停留在低水平的層次,想當(dāng)初國(guó)外在大力發(fā)展asp組件時(shí)我們卻只會(huì)用asp,PHP也一樣。不過(guò)要感謝  php,它讓我得到了生平的第二份工作(第一份是asp的,當(dāng)初狠學(xué)c/c++,怎么也沒(méi)想到吧),當(dāng)然也通過(guò)它認(rèn)識(shí)了不少朋友,Hunte,陳老板,一蛇,  何志強(qiáng)(雖然至今沒(méi)有聯(lián)絡(luò),但他的文章讓我受益非),sony,macro,cfr... 為了生計(jì),為了將來(lái)的發(fā)展,小生將離開(kāi)PHP界,雖然不愿,  但也無(wú)奈,將拖了很久的一篇文章譯出來(lái)作為最后的禮物獻(xiàn)給大家,獻(xiàn)給所有使用PHP&mysql的朋友。如果有學(xué)習(xí)VC和驅(qū)動(dòng)開(kāi)發(fā)的朋友可以和  
我聯(lián)絡(luò),讓我們一起來(lái)探討。  
---------------------------------------------------------------  


動(dòng)機(jī)  

WWW上的交互意味著填表、點(diǎn)擊submit按鈕,然后得到一個(gè)確定的結(jié)果。Html和Http提供一個(gè)機(jī)制來(lái)通過(guò)表單很容易地執(zhí)行這種操作。  PHP用一種非常便利的方法來(lái)支持這種機(jī)制,每個(gè)輸入域(譯注:表單的輸入框)的值被存貯為一個(gè)與輸入域同名的PHP變量。  

一個(gè)很相似的機(jī)制已經(jīng)被adobe開(kāi)發(fā)著,但是是為PDF文檔。他們簡(jiǎn)單地叫它Acrobat 表單。 從用戶的觀點(diǎn)來(lái)看,Html表單和Acrobat表  單唯一的不同是它們的外觀。前者使用HTML文檔,后者使用PDF文檔來(lái)呈現(xiàn)表單。  

要開(kāi)發(fā)WEB界面,Acrobat表單也可以象HTML表單一樣被處理,如果這個(gè)表單象HTML表單一樣提供輸入數(shù)據(jù)。然而,Adobe 已經(jīng)為表單數(shù)  據(jù)提出一個(gè)新的格式叫FDF(表單數(shù)據(jù)格式)。PHP已經(jīng)包含這種格式的支持。  

用數(shù)據(jù)生成一個(gè)PDF文檔的可能性,如定制它,是Acrobat 表單的附加特性了.用PDF文檔作為表單并且在PHP中用數(shù)據(jù)生成PDF文檔將在 這篇文章中被描述。你會(huì)發(fā)現(xiàn)這兩個(gè)例了是多么的容易。  

在你開(kāi)始試這篇文章中的在線例子之前你要安裝Acrobat閱讀器插件或使用Acrobat 4.如果你想在自己的web服務(wù)器上測(cè)試php腳本你也要安裝PDF工具包并使PHP中的FDF支持生效。  

最后,如果你開(kāi)發(fā)你自己的PDF表單你需要Acrobat Exchange 3.x或Acrobat 4。  

在過(guò)去的幾年中,Adobe已經(jīng)開(kāi)發(fā)出可便攜文檔格式(PDF)并且擴(kuò)展了它。一種擴(kuò)展是允許用戶輸入數(shù)據(jù)并送到服務(wù)器中處理的Acrobat  表單,就象HTML表單。  
這樣的PDF文檔與靜態(tài)的PDF文檔很相似,但當(dāng)你用Acrobat閱讀器看它時(shí),你會(huì)發(fā)現(xiàn)可編輯的區(qū)域。  就象HTML中一樣有很多輸入域有效,例如 提交和重置按鈕,文本輸入域,檢查框等等.. 創(chuàng)建這樣一個(gè)PDF表單需要Acrobat Exchange 3.x或新的Acrobat 4軟件,不幸的是它們只能在windows和MacOS中運(yùn)行。
兩者都提供一個(gè)方式來(lái)放置不同的輸入域到一個(gè)已存在的PDF文檔中。  
提交按鈕傳送在它被按下時(shí)調(diào)用的URL屬性。這非常象HTML,但不同的是在數(shù)據(jù)被傳送到服務(wù)器時(shí)的格式。  
在按下Submit按鈕時(shí),數(shù)據(jù)是用一個(gè)在URL中可以被觀察的確定格式從HTML表單傳輸。Acrobat表單支持這種格式,還有FDF(表單數(shù)據(jù)格式)  FDP是一種新格式,需要FDF工具包(當(dāng)前版本4.0)解釋。如果PHP在編譯時(shí)加了FDF支持,它就能解析FDF數(shù)據(jù)并且用名字存取任何輸入域。  FDF數(shù)據(jù)一般被存在PHP的HTTP_RAW_POST_DATA變量中(就象HTML數(shù)據(jù)存儲(chǔ)在HTTP_POAT_DATA中一樣)  
數(shù)據(jù)的實(shí)際賦值是在PHP腳本中完成的,相反的是HTML提交數(shù)據(jù)是在PHP引擎中被賦值的。  

要想得到一個(gè)FDF數(shù)據(jù)看起來(lái)的樣子,這兒是一個(gè)例子:(譯注:從網(wǎng)上拷下的原始文件如此,我也看不清亂碼是什么,不過(guò)如果放在英文系統(tǒng)中能看清吧)  

%FDF-1.2 %懺嫌 1 0 obj << /FDF << /Fields [ << /V (This is just some text for testing)/T (comment)>> ....  

這個(gè)僅僅是一個(gè)完整記錄的第一部分,但它能明顯地表示出輸入域的注解(譯注:可能是標(biāo)題吧)和它的值。這兒是測(cè)試文本。  

這了讓它更清楚,提供一個(gè)簡(jiǎn)單的例子。首先,假設(shè)我們有一個(gè)包含數(shù)量,出版者,準(zhǔn)備者,日期,注解發(fā)行者,發(fā)行準(zhǔn)備者等域的PDF表單。  前五個(gè)域是文本域,最后兩個(gè)域是檢查框(check box)。我們的PHP腳本總會(huì)顯示數(shù)量、日期、注解域的值,當(dāng)相應(yīng)的檢查框選中時(shí)才顯示出版者、準(zhǔn)備者域的值。  
如果這個(gè)框(check box)被選中,它們的值是"On"這是在表單被創(chuàng)建時(shí)設(shè)置的。當(dāng)然這個(gè)表單也有提交按鈕,在我們的這個(gè)例子中它甚至有reset按鈕。  
點(diǎn)擊提交按鈕運(yùn)行下面的腳本。這個(gè)腳本象上面所述的來(lái)賦域數(shù)據(jù)的值。  

<?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);  

?>  

你可以試試這個(gè)例子 http://gehtnix.fernuni-hagen.de:8000/testfdf/example1.pdf  



比較實(shí)際情況,PDF表單比HTML表單有更好的外觀,這種技術(shù)好象沒(méi)有確切的優(yōu)勢(shì)。然而,PDF有另一種用處。你可以回顧一下上面的  
過(guò)程,并用數(shù)據(jù)組成一個(gè)PDF文檔。  
如果你需要定制PDF文檔中僅需的幾個(gè)確定部分,象地址,日期等等。它也可以用于創(chuàng)建完整的PDF文檔,但要用PHP的pdf文檔功能創(chuàng)建混合文檔  
需要很多工作。  
例如在通常情況下,它也值得用于設(shè)計(jì)者創(chuàng)建準(zhǔn)備文檔(譯注:可能是草稿吧)。用PHP中的PDF文檔功能創(chuàng)建PDF表單(譯注:不是fdf文檔)幾乎不可能的。  

在FDF中用數(shù)據(jù)組成一個(gè)PDF文檔很簡(jiǎn)單。你用Acrobat 4的話將必須創(chuàng)建一個(gè)PDF文檔并在其中加入輸入域。放到你的web服務(wù)器上。  然后,你需要用PHP創(chuàng)建FDF文檔,它包含每個(gè)域,它的值和數(shù)據(jù)將被插入的文檔的參考。(這個(gè)PDF文檔你剛才已經(jīng)建好了)。這個(gè)會(huì)在php中被飛快地處理。文檔的參考是一個(gè)指向PDF文檔的URL。  

以第一個(gè)例子為基礎(chǔ),下面的php腳本非常容易。腳本的第二部分已經(jīng)加入了。  

<?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");  

?>  

你也可以試試這個(gè)例子 http://gehtnix.fernuni-hagen.de:8000/testfdf/example2.pdf  

In this example several steps are performed:  
在這個(gè)例中幾個(gè)步驟已經(jīng)完成:  

用戶已經(jīng)埴完了PDF 表單 example2.pdf  
點(diǎn)擊提交按鈕后,提交按鈕關(guān)聯(lián)的URL已經(jīng)被調(diào)用。在這個(gè)例子中,已經(jīng)執(zhí)行這個(gè)PHP腳本。PHP腳本檢索FDF數(shù)據(jù)流中的數(shù)據(jù)并創(chuàng)建新的FDF文檔  
它包含作為結(jié)果的PDF文檔的數(shù)據(jù)。  

FDF文檔用application/vnd.fdf類型送回。  

Acrobat插件讀取數(shù)據(jù)并顯示這個(gè)參考PDF文檔。在此例中為 resultlabel.pdf。  

這仍不是FDF做的每件事,在這個(gè)教程中還有很多遺留的東西需要討論。  
你可以在adobe的web網(wǎng)站檢驗(yàn)這篇文檔。  




標(biāo)簽:PHP的FDF文檔支持