PHP的FDF文檔支援

來源:互聯網
上載者:User
關鍵字 PHP的FDF文檔支援
作者:Uwe Steinmann 
來源:http://www.phpbuilder.com 
譯者:znsoft webmaster@phpease.com http://www.phpease.com 

譯註:(保留) 
作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按鈕。 
點擊提交按鈕運行下面的指令碼。這個指令碼象上面所述的來賦域資料的值。 


$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 ' $volume'
"; 

$date = fdf_get_value($fdf, "date"); 
echo "The date field has the value ' $date'
"; 

$comment = fdf_get_value($fdf, "comment"); 
echo "The comment field has the value ' $comment'
"; 

if(fdf_get_value($fdf, "show_publisher") == "On") { 
$publisher = fdf_get_value($fdf, "publisher"); 
echo "The publisher field has the value ' $publisher'
"; 
} else 
echo "Publisher shall not be shown.
"; 

if(fdf_get_value($fdf, "show_PReparer") == "On") { 
$preparer = fdf_get_value($fdf, "preparer"); 
echo "The preparer field has the value ' $preparer'
"; 
} else 
echo "Preparer shall not be shown.
"; 
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指令碼非常容易。指令碼的第二部分已經加入了。 


$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網站檢驗這篇文檔。 

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.