PHP  
downloads | documentation | faq | getting help | mailing lists | | php.net sites | links 
search for in the  
previousunlinkfdf_add_templatenext
Last updated: Tue, 09 Jul 2002
view the printer friendly version or the printer friendly version with notes or change language to English | Brazilian Portuguese | Chinese | Czech | Dutch | Finnish | German | Hungarian | Italian | Japanese | Korean | Polish | Romanian | Russian | Spanish | Swedish | Turkish

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);
?>
Table des mati�res
fdf_add_template -- Adds a template into the FDF document
fdf_close -- Ferme un document FDF.
fdf_create -- Cr�e un nouveau document FDF.
fdf_get_file -- Lit la valeur de la cl� /F.
fdf_get_status -- Lit la valeur de la cl� /STATUS.
fdf_get_value -- Mot la valeur d'un champs.
fdf_next_field_name -- Lit le nom du champs suivant.
fdf_open -- Ouvre un document FDF.
fdf_save -- Sauver un document FDF.
fdf_set_ap -- Fixe l'apparence d'un champs.
fdf_set_encoding -- Modifie l'encodage des caract�res
fdf_set_file -- Fixe la valeur de la cl� /F.
fdf_set_flags -- Modifie une option d'un champs
fdf_set_javascript_action -- Modifie l'action javascript d'un champs
fdf_set_opt -- Modifie une option d'un champs
fdf_set_status -- Fixe la valeur de la cl� /STATUS.
fdf_set_submit_form_action -- Modifie l'action d'un formulaire
fdf_set_value -- Fixe la valeur d'un champs.
User Contributed Notes
Forms Data Format
add a note about notes
[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;

}

add a note about notes
previousunlinkfdf_add_templatenext
Last updated: Tue, 09 Jul 2002
show source | credits | stats | mirror sites
Copyright © 2001, 2002 The PHP Group
All rights reserved.
This mirror generously provided by:
Last updated: Sat Aug 31 06:19:44 2002 CEST