2024 年日本 PHP 研討會

FDF 函式

目錄

新增註解

使用者貢獻的註解 20 則註解

mitka at actdev.com
22 年前
重要事項

如果您像上述使用者貢獻的腳本一樣,透過 $HTTP_RAW_POST_DATA 處理 FDF POST,那麼當您決定使用 FDFToolkit 支援重建 PHP 時,最好知道 $HTTP_RAW_POST_DATA 將會是未定義的。

好消息是,$HTTP_FDF_DATA _將會_ 被定義。(請參閱上面的範例)。要在純 PHP 和 PHP+FDFToolkit 中讓使用者貢獻的腳本都能正常運作,請使用

$HTTP_RAW_POST_DATA . $HTTP_FDF_DATA

取代提及 $HTTP_RAW_POST_DATA 的地方。

Dimitri Tarassenko
fleischer at mail dot com
20 年前
greg@... 和 adam@... 建議的程式碼非常有幫助,但我發現(透過慘痛的教訓)如果輸入陣列(greg 程式碼中的 $values 或 adam 程式碼中的 $pdf_data)中包含的字串裡有未閉合的括號,Acrobat 會發出錯誤訊息,指出檔案已損毀。換句話說,如果輸入陣列中有像 "a) 我的第一點;b) 我的第二點" 這樣的字串,產生的 PDF/FDF 檔案會被 Acrobat 認為已損毀。這顯然是因為 FDF 檔案結構中所有的欄位名稱都用括號括起來。

我想出的解決方案是用反斜線跳脫所有左括號和右括號,這也意味著您需要跳脫所有反斜線。以下的程式碼完成了所有這些工作。

Erik

---------------

function output_fdf ($pdf_file, $pdf_data)
{
$fdf = "%FDF-1.2\n%????\n";
$fdf .= "1 0 obj \n<< /FDF ";
$fdf .= "<< /Fields [\n";

$search = array('\\', '(', ')');
$replace = array('\\\\', '\(', '\)');
foreach ($pdf_data as $key => $val)
{
$clean_key = str_replace($search, $replace, $key);
$clean_val = str_replace($search, $replace, $val);
$fdf .= "<< /V ($clean_val)/T ($clean_key) >> \n";
}

$fdf .= "]\n/F ($pdf_file) >>";
$fdf .= ">>\nendobj\ntrailer\n<<\n";
$fdf .= "/Root 1 0 R \n\n>>\n";
$fdf .= "%%EOF";

return $fdf;
}
wesley_grant at yahoo dot com
18 年前
將 php.ini 檔案中的

session.cache_limiter

指令改為 'private'

似乎可以解決同時將 fdf 資料和 session 標頭傳送到 Internet Explorer 的問題。
mirage at rateaprof dot com
21 年前
如果您從 Adobe 網站取得新的 fdftkv5.tar.gz(根據上面的連結),您會得到一些間距和檔案大小寫完全不同的檔案。要讓目前的 4.3.1 版本設定成功,您需要做一些事情。

將 fdftkv5.tar.gz 解壓縮到 /usr/local
cd /usr/local
# 為了方便使用
ln -s FDFToolkit\ for\ UNIX fdf

cd fdf
ln -s Headers\ And\ Libraries HeadersAndLibraries

# 可能需要根據您的作業系統修改以下內容
ln -s LINUX linux
cd linux/C
ln -s LIBFDFTK.SO libfdftk.so

cd ..
cd ..
ln -s Headers headers
cd headers
ln -s FDFTK.H fdftk.h

這樣應該就可以開始了... 至於維護設定檔的人,請注意 FDF Toolkit 中有一些變更。
jeff at cowart dot net
21 年前
我試圖使用上面 adam 和 Toppi 的腳本,但我一直無法讓它們正常工作,除非我儲存產生的 fdf 檔案,然後在 Acrobat 中手動開啟它。
匿名
19 年前
使用「Yes」(是)而不是「On」(開啟)來填入核取方塊。
bea dot el dot tea at gmail dot com
13 年前
如果您無法在 Windows 上的 PHP 5.3 中使用 php_fdf.dll,一個可能的解決方法是使用 Adobe 網站上「FDF Toolkit for Windows」中的 ActiveX 版本。以下是我為我的其中一個專案建置的類別的一部分。

<?php
類別 FDF{
公開
$NormalAP = 0;
公開
$RolloverAP = 1;
公開
$DownAP = 2;

保護
$fdf;

公開 函數
__construct(){
$com = 新 COM('FdfApp.FdfApp');
$this->fdf = $com->FDFCreate();
}
公開 函數
setFile($fileName){
$this->fdf->FDFSetFile(str_replace(' ', '%20', $fileName));
}
公開 函數
setValue($name, $value){
$this->fdf->FDFSetValue($name, $value, );
}
公開 函數
setAP($field, $whichFace, $fileName, $pageNumber){
$this->fdf->FDFSetAP($field, $whichFace, $fileName, $pageNumber);
}
公開 函數
savetoFile($saveFileName){
$this->fdf->FDFSavetoFile($saveFileName);
}
公開 函數
close(){
$this->fdf->FDFclose();
}
}
?>
software at yvanrodrigues dot com
20 年前
不要將 fdftk.dll (Windows) 的版本 6 與 PHP4.3.4 一起使用,請使用 PHP 隨附的版本。

如果您使用較新的 DLL,fdf_create 將不會返回有效的控制代碼。
Toppi at i-Mehl dot De
22 年前
我嘗試了很多 FDF -> PDF 並合併這些文件...
在我看來,xfdf 比 fdf 更方便... 對於那些想嘗試的人:可以隨意使用這個小函數從陣列生成 xfdf 文件。

ToPPi

函數 array2xfdf($xfdf_data, $pdf_file) {
// 從二維陣列建立 XFDF 檔案
// 格式: "array ("key1" => "content1", "key2" => "content2");
$xfdf = "<?xml version='1.0' encoding='UTF-8'?>\n";
$xfdf .= "<xfdf xmlns='http://ns.adobe.com/xfdf/' xml:space='preserve'>\n";
$xfdf .= "<fields>\n";
// 迴圈 -> 陣列到 XFDF 資料
foreach ($xfdf_data as $key => $val) {
$xfdf .= "<field name='".$key."'>\n";
$xfdf .= "<value>".$val."</value>\n";
$xfdf .= "</field>\n";
};
// XFDF「頁尾」


$xfdf .= "</fields>";
$xfdf .= "<f href='".$pdf_file."'/>";
$xfdf .= "</xfdf>";
return $xfdf;
}
g8z at yahoo dot com
20 年前
這段程式碼提供給想要將 HTML 表單資料與 PDF 表單合併,然後將填入資料的 PDF 表單輸出到網頁瀏覽器的使用者。

這是一個純 PHP 的解決方案,**不需要** FDF 工具包。由 www.TUFaT.com 提供。

<?php

// PDF 表單的完整 http 路徑
$form = 'http://my_domain.com/my_pdf_form.pdf';

function
create_fdf ($pdffile, $strings, $keys)
{
$fdf = "%FDF-1.2\n%????\n";
$fdf .= "1 0 obj \n<< /FDF << /Fields [\n";

foreach (
$strings as $key => $value)
{
$key = addcslashes($key, "\n\r\t\\()");
$value = addcslashes($value, "\n\r\t\\()");
$fdf .= "<< /T ($key) /V ($value) >> \n";
}
foreach (
$keys as $key => $value)
{
$key = addcslashes($key, "\n\r\t\\()");
$fdf .= "<< /T ($key) /V /$value >> \n";
}

$fdf .= "]\n/F ($pdffile) >>";
$fdf .= ">>\nendobj\ntrailer\n<<\n";
$fdf .= "/Root 1 0 R \n\n>>\n";
$fdf .= "%%EOF";

return
$fdf;
}

// 填入文字欄位
$strings = array(
'date' => '10/17/2004',
'full_name' => 'Joe Doe',
'phone_num' => '123-4567',
'company' => 'ACME Widgets',
'amount' => 'USD 100.00'
);

// 填入核取方塊/圓鈕
$keys = array('
gender'
=> 'male',//圓鈕
'is_adult' => 'Off',//核取方塊
'urgent' => 'On'//核取方塊
);

// 輸出已填入表單資料的 PDF 表單
header('Content-type: application/vnd.fdf');
echo
create_fdf($form, $strings, $keys);

?>
JFS at TRASH-MAIL dot COM
3 年前
function parseFDF($file) {
```php

```php
```php
```php
```php
```php
```php
```php
```php
```php
```php
```php
}
}
```php
}
}

```php
```php
使用者 *bmount at livid dot us*
19 年前
給正在為 Internet Explorer 中的 FDF 奮鬥的各位,這裡是解決方案

**不要**在產生並輸出 FDF 資料的頁面上初始化工作階段 (SESSION)。

這將修復找不到頁面的錯誤。
使用者 *m1tk4 at hotmail dot com*
20 年前
如果您想在不重建 RedHat EL3 / Fedora PHP RPM 的情況下新增 FDF 支援,請參閱 http://phprpms.sourceforge.net/fdf 的說明
使用者 *joe at koontz dot net*
24 年前
最簡單的做法是從 `$HTTP_RAW_POST_DATA` 取得 FDF 資料。(除非您已安裝伺服器函式庫,否則不會解析任何 FDF 資料!)以下是您會收到的典型資料
`%FDF-1.2`
`1 0 obj`
<<
`/FDF << /Fields [ << /V (0)/T (amount0)>> << /V (0)/T (amount1)>> << /V (0)/T (amount2)>>`
`<< /V (0)/T (amount3)>> << /V (0)/T (amount4)>> << /V (0)/T (amount5)>>`
`<< /V (0)/T (amount6)>> << /V (0)/T (amount7)>> << /V (0)/T (amount8)>>`
`<< /V (0)/T (amount9)>> << /V /0102 /T (chase_bk)>> << /V (0)/T (count)>>`
`<< /V (0)/T (invtotal)>> << /V (12/21/2000)/T (sent_ap)>> << /V /Off /T (spec_hand)>>`
`<< /V (041232)/T (transit_no)>> << /V (THIS FORM IS NOT COMPLETE!!!)/T (X)>>`
]
`/F (http://x.com/forms/AA00390q.pdf)>>`
>>
`endobj`
`trailer`
<<
`/Root 1 0 R`

>>
`%%EOF`
移除 `[` 之前的所有內容,然後將其解析為鍵值對。
我寫了這段程式碼來建立 FDF,請確保在將回傳值輸出給使用者之前執行
```php
在您將回傳值 `echo` 給使用者之前。

<?php
函數 FDFput($FDFpage){
$A = "%FDF-1.2\n1 0 obj\n<< \n/FDF << /Fields [ \n";
$C = " ] \n" ;
if (
$FDFpage>"" ) {$C .=" /F ($FDFpage)>>\n";}
$C .= ">>\n>> \nendobj\ntrailer\n\n<</Root 1 0 R>>\n%%EOF\n";
$B = "";
reset($FDFData);
while (list(
$key, $val) = each($FDFData))
{
if (
strlen(trim($val)) > 0 && is_string($key))
{
$B .= "<</T ($key) /V (". $val . ")>>\n";
// 顯示 "<</T ($key) /V (". $val . ")>>\n";
}
}
return
$A.$B.$C;
}
?>

它並不完美 - 但它有效。(我使用 HTML 將資料發佈到伺服器,FDF 到瀏覽器)
joe
sid at accesspdf dot com
20 年前
使用原生 PHP 建立基本的 FDF 資料很容易;您不需要 Adobe 的 FDF 工具包。我為此目的編寫了一個名為 forge_fdf() 的函數。您可以從以下網址下載

http://www.pdfhacks.com/forge_fdf/

我為我的著作《PDF Hacks》創建了它。可以在線上查看 forge_fdf() 的實際應用範例

http://pdfhacks.com/form_session/form_session-1.1/

從以下網址下載此線上範例的完整程式碼

http://pdfhacks.com/form_session/

請注意 PDF 表單資料是如何透過 POST 而不是 FDF 傳送回伺服器的。無需解析 FDF。

致敬-

Sid Steward
Teemu
21 年前
也許您必須使用瀏覽器能夠辨識 xfdf 檔案的 Header 函數。像這樣

Header( "Content-type: application/vnd.adobe.xfdf");
adam at andemyte dot com
22 年前
這是另一個無需使用 FDF 函數即可產生預填 PDF 的範例。此函數接受兩個參數:PDF 的 URL(例如「http://domain.com/path/to/form.pdf」)和一個包含所有欄位值的陣列。

/*
警告!!此函數會傳送 HTTP 標頭!它必須在
任何內容被傳送到瀏覽器之前呼叫,否則函數將會失敗!

void output_fdf (string $pdf_file, array $pdf_data)

$pdf_file:一個字串,包含伺服器上 PDF 檔案的 URL 路徑。
此 PDF 必須存在且包含 $pdf_data 參考的欄位名稱,
才能使此函數正常運作。

`$pdf_data`:一個陣列,包含您想要從 `$pdf_file` 填入的任何欄位,
格式為 key=>val;其中欄位
名稱是 key,欄位的值是 val。

*/

函式 output_fdf ($pdf_file, $pdf_data) {

$fdf = "%FDF-1.2\n%????\n";
$fdf .= "1 0 obj \n<< /FDF ";
$fdf .= "<< /Fields [\n";

foreach ($pdf_data as $key => $val)
$fdf .= "<< /V ($val)/T ($key) >> \n";

$fdf .= "]\n/F ($pdf_file) >>";
$fdf .= ">>\nendobj\ntrailer\n<<\n";
$fdf .= "/Root 1 0 R \n\n>>\n";
$fdf .= "%%EOF";

/* 現在我們顯示 FDF 資料,這會啟動 Acrobat */

header ("Content-Type: application/vnd.fdf");
print $fdf;

}
noah at NOSPAMbrandfidelity dot com
22 年前
函式 parse($file) {
if (!preg_match_all("/<<\s*\/V([^>]*)>>/x",
$file,$out,PREG_SET_ORDER))
return;
for ($i=0;$i<count($out);$i++) {
$pattern = "<<.*/V\s*(.*)\s*/T\s*(.*)\s*>>";
$thing = $out[$i][1];
if (eregi($pattern,$out[$i][0],$regs)) {
$key = $regs[2];
$val = $regs[1];
```php
```php
```php
```php
```php
```php
}
}
```php
}
gregDELETETHIS at laundrymat dot tv
22 年前
這是一個簡單的腳本,可以在不使用 FDF 工具包或在伺服器上建立實際 FDF 檔案的情況下,將 FDF 資料輸出到瀏覽器。
順帶一提,Acrobat 對換行符號非常挑剔,因此您必須在腳本中保留「\n」。該腳本會讀取從表單使用 POST 方法提交的變數,並從它們建立一個 FDF 檔案。提交到此腳本的欄位名稱必須與 PDF 中的欄位名稱相符。Acrobat 將忽略任何不匹配的欄位。

<?php

//PDF 檔案的路徑
$url="http://www.some_url.com/form.pdf";

$values=$HTTP_POST_VARS;

$fdfdata = "%FDF-1.2\n%????\n";
$fdfdata .= "1 0 obj \n<< /FDF ";
$fdfdata .= "<< /Fields [\n";

//添加欄位名稱和值的迴圈
foreach($values as $key=>$val)
{
$fdfdata.="<< /V ($val)/T ($key) >> ";
}


$fdfdata .= "]\n";
$fdfdata .= "/F ($url) >>";
$fdfdata .= ">>\nendobj\ntrailer\n<<\n/Root 1 0 R\n>>\n";
$fdfdata .= "%%EOF";

/*** 現在我們顯示 FDF 資料,這會啟動 Acrobat ***/

header ("Content-Type: application/vnd.fdf");
print
$fdfdata;

?>

您可以在 PDF 中使用 JavaScript 來讀取直接發佈到 PDF 的 GET 方法中的值。您可以參考以下兩個方法:http://laundrymat.tv/pdf/
info at theindigoworks dot com
17 年前
回覆 g8z at yahoo dot com 2004年10月18日 06:46

我認為程式碼中少了一行

foreach ($keys as $key => $value)
{
$key = addcslashes($key, "\n\r\t\\()");
$fdf .= "<< /T ($key) /V /$value >> \n";
}

我已將其修改為

$key = addcslashes($key, "\n\r\t\\()");
$value = addcslashes($value, "\n\r\t\\()");
$fdf .= "<< /T ($key) /V /$value >> \n";

現在所有核取方塊和選項按鈕都會填入值,而不像以前那樣只有表單中的最後一個項目會填入。
To Top