|
|
XXXI. Forms Data Format
Forms Data Format (FDF) est un format de fomulaire pour les documents
PDF. Vous pouvez lire la documentation (en anglais) �
pour plus de d�tails sur les tenants et les aboutissants.
Note�:
Si vous rencontrez des probl�mes de configuration de PHP avec le support
fdftk, v�rifiez bien que le fichier d'en-t�tes FdfTk.h
et la librairie libFdfTk.so sont bien situ�s.
Elle devrait �tre dans les dossiers
fdftk-dir/include et fdftk-dir/lib.
Cela ne sera pas le cas si vous avez simplement d�compress�
la distribution FdfTk.
L'esprit de FDF est similaire � celui des formulaires HTML. Les
diff�rences r�sident dans les moyens de transmission des
donn�es au serveur, lorsque le bouton "submit" (soumettre) est
press� (ce qui est du ressort de Form Data Format) et le format de
formulaire lui-m�me (qui est plut�t du ressort de Portable Document
Format, PDF). G�rer des donn�es FDF est un des objectifs des
fonctions FDF. Mais il y en a d'autres. Vous pouvez aussi prendre un
formulaire PDF, et pr�-remplir les champs, sans modifier le
formulaire lui-m�me. Dans ce cas, on va cr�er un document FDF
(fdf_create()), remplir les champs
(fdf_set_value()) et l'associer � un fichier PDF
(fdf_set_file()). Finalement, le tout sera envoy�
au client, avec le type MIME "application/vnd.fdf". Le module "Acrobat reader"
de votre navigateur va reconna�tre ce type MIME, et lire le fichier
PDF, puis le remplis avec FDF.
Si vous �ditez un fichier FDF avec un �diteur de texte, vous trouverez
un catalogue d'objet avec le nom de FDF. Cet objet
peut contenir des entr�es telles que Fields,
F, Status etc..
Les entr�es les plus couramment utilis�es sont
Fields, qui indique une liste de champs de contr�le,
et F qui contient le nom du fichier PDF a qui
appartiennent ces donn�es. Ces entr�es sont d�sign�es dans la documentation
PDF sous le nom de /F-Key ou /Status-Key.
La modification de ces entr�es est possible avec les fonctions
fdf_set_file() et fdf_set_status().
Les champs sont modifiables avec les fonctions
fdf_set_value(), fdf_set_opt() etc..
Les exemples suivants montre comme �valuer les donn�es
du formulaire.
Exemple 1. Evaluer un document FDF <?php
// Sauver le fichier FDF dans un fichier temporaire.
$fdffp = fopen("test.fdf", "w");
fwrite($fdffp, $HTTP_FDF_DATA, strlen($HTTP_FDF_DATA));
fclose($fdffp);
// Ouvrir le fichier temporaire, et utiliser les donn�es.
// Le formulaire pdf contenait diff�rents fichiers texte, avec pour nom :
// volume, date, comment, publisher, preparer, ainsi que deux bo�tes
// � cocher show_publisher et show_preparer.
$fdf = fdf_open("test.fdf");
$volume = fdf_get_value($fdf, "volume");
echo "La valeur du champs volume �tait : '<B>$volume</B>'<br>";
$date = fdf_get_value($fdf, "date");
echo "La valeur du champs date �tait '<B>$date</B>'<br>";
$comment = fdf_get_value($fdf, "comment");
echo "La valeur du champs comment �tait '<B>$comment</B>'<br>";
if(fdf_get_value($fdf, "show_publisher") == "On") {
$publisher = fdf_get_value($fdf, "publisher");
echo "La valeur du champs publisher �tait : '<B>$publisher</B>'<br>";
} else
echo "La valeur du champs ne doit pas �tre affich�e.<br>";
if(fdf_get_value($fdf, "show_preparer") == "On") {
$preparer = fdf_get_value($fdf, "preparer");
echo "La valeur du champs preparer �tait '<B>$preparer</B>'<br>";
} else
echo "La valeur du champs Preparer ne doit pas �tre affich�.<br>";
fdf_close($fdf);
?> |
|
User Contributed Notes Forms Data Format |
|
[email protected]
28-Apr-2000 10:42 |
|
The simplest thing to do is get the FDF data from $HTTP_RAW_POST_DATA.
(unless you have the server library installed none of the fdf data gets
parsed!) This is typical of what you get:
%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 ()>>
>>
endobj
trailer
<<
/Root 1 0 R
>>
%%EOF
kill everything before the [ and then
parse it down into key value pairs.
I wrote this to create an FDF,
make sure you do a
header("Content-type:
application/vnd.fdf");
before you echo the returned value to the
user.
function 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";
//echo "<</T ($key) /V
(". $val . ")>>\n";
}
}
return
$A.$B.$C;
}
It ain't perfect - but it works. (I use HTML for
posting to the server, FDF to the browser)
joe
|
|
[email protected]
21-Dec-2001 09:06 |
|
Here is an easy script to output fdf data to the browser without using the
fdf toolkit or creating an actual fdf file on the server.
By the way
acrobat is very picky about line breaks so you must leave the
"\n" in the script. The script reads the variables posted to it
from a form use POST and creates a fdf file from them. The field names
posted to this script must match the field names in the pdf. Acrobat will
ignore any that don't match.
<?php
//path to pdf
file
$url="
$values=$HTTP_POST_VARS;
$fdfdata
= "%FDF-1.2\n%����\n";
$fdfdata .= "1 0 obj \n<<
/FDF ";
$fdfdata .= "<< /Fields [\n";
//loop that adds the field names and values
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";
/*** Now
we display the FDF data which causes Acrobat to start
***/
header ("Content-Type:
application/vnd.fdf");
print
$fdfdata;
?>
You can use javascript in the pdf to
read the values from a GET method posted directly to the pdf. you can see
both methods here:
|
|
[email protected]
09-Mar-2002 02:26 |
|
function 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];
$key =
preg_replace("/^\s*\(/","",$key);
$key =
preg_replace("/\)$/","",$key);
$key = preg_replace("/\\\/","",$key);
$val =
preg_replace("/^\s*\(/","",$val);
$val =
preg_replace("/\)$/","",$val);
$matches[$key] = $val; }
} return $matches; }
|
|
[email protected]
02-Aug-2002 05:30 |
|
Here is yet another example of generating pre-filled PDFs without using the
FDF functions. This function takes two args: a URL to the PDF (like
"
and an array with all the field's values.
/* WARNING!!
THIS FUNCTION SENDS HTTP HEADERS! It MUST be called before any
content is spooled to the browser, or the function will fail!
void output_fdf (string $pdf_file, array $pdf_data)
$pdf_file: a string containing a URL path to a PDF file on the
server. This PDF MUST exist and contain fields with
the names referenced by $pdf_data for this function
to work. $pdf_data: an array of any fields in
$pdf_file that you want to populate, of the form
key=>val; where the field name is the key, and
the field's value is in val. */
function 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"; /* Now
we display the FDF data which causes Acrobat to start */ header
("Content-Type: application/vnd.fdf"); print $fdf; }
|
|
|
| |