Est-ce un formulaire AcroForm ou un formulaire LiveCycle Designer (xfa)?
S'il s'agit de XFA (ce qui est probablement donné les noms des champs), iText ne peut pas vous aider. Il ne peut obtenir/définir des valeurs de champ que lorsque vous travaillez avec XFA.
D'accord, un AcroForm. Plutôt que de suivre la route utilisée dans votre source, je vous suggère de manipuler directement les dictionnaires de champs existants et la liste de champs acroForm.
Je suis originaire de Java en matière de iText, de sorte que vous aurez à faire une traduction, mais va ici:
A) Supprimer le tableau de champ du AcroForm. Laissez l'ordre de calcul seul s'il est présent (/ CO). Je pense. B) Joindre tous les champs de «niveau supérieur» à une nouvelle matrice FIELDS.
PdfArray newFldArray = new PdfArray();
acroDict.put(newFldArray, PdfName.FIELDS);
// you could wipe this between pages to speed things up a bit
Set<PdfIndirectReference> radioFieldsAdded = new HashSet<PdfIndirectReference>();
int numPages = reader.getNumberOfPages();
for (int curPg = 1; curPg <= numPages; ++curPg) {
PdfDictionary curPageDict = reader.getPageN(curPg);
PdfArray annotArray = curPageDict.getAsArray(PdfName.ANNOTS);
if (annotArray == null)
continue;
for (int annotIdx = 0; annotIdx < annotArray.size(); ++annotIdx) {
PdfIndirectReference fieldReference = (PdfIndirectReference) annotArray.getAsIndirect(annotIdx);
PdfDictionary field = (PdfDictionary)PdfReader.getObject(fieldReference);
// if it's a radio button
if ((PdfFormField.FF_RADIO & field.getAsNumber(PdfName.FF).intValue()) != 0) {
fieldReference = field.get(pdfName.PARENT);
field = field.getAsDict(PdfName.PARENT); // looks up indirect reference for you.
// only add each radio field once.
if (radioFieldsAdded.contains(fieldReference)) {
continue;
} else {
radioFieldsAdded.add(fieldReference);
}
}
field.remove(PdfName.PARENT);
// you'll need to assemble the original field name manually and replace the bits
// you don't like. Parent.T + '.' child.T + '.' + ...
String newFieldName = SomeFunction(field);
field.put(PdfName.T, new PdfString(newFieldName));
// add the reference, not the dictionary
newFldArray.add(fieldReference)
}
}
C) Nettoyer
reader.removeUnusedObjects();
Inconvénient:
plus de travail.
Avantages:
Conserve tous les types de champs, attributs, apparences et ne modifie pas le fichier dans son ensemble. Moins CPU & mémoire. Votre code actuel ignore le script de champ, tous les drapeaux de champ (en lecture seule, cachés, requis, texte multiligne, etc.), listes/combos, boutons radio, et un bon nombre d'autres bric-à-brac.
Ce n'est pas un formulaire XFA –
merci pour l'aide, désolé pour réponse tardive –