不使用SOAP協議,通過XFDF格式實現PDF表單與數據庫交互的方法。該方法兼容免費的Adobe Reader,且無需特殊權限設置。
背景與問題
-
歷史方案:
- Adobe曾提供ADBC接口(基于ODBC),但在Acrobat 9后被移除。
- SOAP方案在免費版Reader中無法使用。
-
新方案核心:
使用XFDF(XML版本的FDF)作為數據交換格式,通過PHP腳本作為中間層連接PDF表單與數據庫。
FDF與XFDF格式對比
FDF示例
%FDF-1.2
%a??ó
1 0 obj
<</FDF<</F (testXFDF.pdf)/Fields[<</T (Field 1)/V (test data)>>]>>
>>
endobj
XFDF示例
<?xml version="1.0" encoding="UTF-8"?>
<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve"><fields><field name="Field 1"><value>test data</value></field></fields>
</xfdf>
優勢: XFDF基于XML,更易解析和生成。
實現步驟
1. 提交表單數據到服務器
PDF表單通過submitForm()
方法以XFDF格式提交數據到PHP腳本。
2. 服務器端處理(PHP)
基礎接收腳本
<?php$myXFDF = file_get_contents("php://input");echo "Received some data.";
?>
返回數據到表單
<?phpheader('Content-type: application/vnd.adobe.xfdf');$returnXFDF = <<<EOT
<?xml version="1.0" encoding="UTF-8"?>
<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve"><fields><field name="Field 1"><value>Updated Value</value></field></fields>
</xfdf>
EOT;echo $returnXFDF;
?>
關鍵點: URL需附加#XFDF
以告知Acrobat返回格式。
完整PHP解決方案
功能
- 解析接收的XFDF數據。
- 生成數據庫唯一序列號。
- 返回更新后的XFDF數據。
核心代碼
<?phpfunction getNextSerial($userName) {$mysqli = new mysqli("localhost", "theUser", "thePassword", "serialnumbers");if (mysqli_connect_errno()) {printf("Connect failed: %s\n", mysqli_connect_error());exit();}$query = "INSERT INTO serialnumbers (username, date) VALUES (\"" . $mysqli->real_escape_string($userName) . "\", NOW())";$mysqli->query($query);$idx = $mysqli->insert_id;$mysqli->close();return $idx;}function createXFDF($info, $enc='UTF-8', $file=''){$domtree = new DOMDocument('1.0', $enc);$xmlRoot = $domtree->createElement("xfdf");$xmlRoot->appendChild($domtree->createAttribute('xmlns'))->appendChild($domtree->createTextNode("http://ns.adobe.com/xfdf/"));$xmlRoot = $domtree->appendChild($xmlRoot);$fields = $domtree->createElement("fields");addXFDFData($domtree, $fields, $info);$xmlRoot->appendChild($fields);header('Content-type: application/vnd.adobe.xfdf');echo $domtree->saveXML();}$myXFDF = new DOMDocument('1.0');$myXFDF->load("php://input");$xpath = new DOMXpath($myXFDF);$xpath->registerNameSpace('xfdf', 'http://ns.adobe.com/xfdf/');$elements = $xpath->query("//xfdf:fields/xfdf:field[@name='UserName']")->item(0);$userName = "";if ($elements instanceof DomElement) {$userName = $elements->nodeValue;}if (strcmp($userName, "") !== 0) {$serialNumber = getNextSerial($userName);$info = array("SerialNumber" => $serialNumber);createXFDF($info);}
?>
注意事項
-
瀏覽器兼容性:
Chrome/Firefox等瀏覽器內置PDF查看器不支持此功能,必須使用Adobe Acrobat或Reader。 -
安全性:
Acrobat會提示用戶確認是否允許提交操作。 -
部署建議:
- 確保服務器支持PHP。
- 根據實際需求調整數據庫連接和字段映射。
最后
通過XFDF和PHP中間層,實現了PDF表單與數據庫的無縫交互,解決了SOAP和ADBC的限制問題。適用于需要動態填充或提交數據的PDF表單場景。