譯注:(保留)
作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開發。