J'essaie de cocher une case sur mon PDF avec iText7. Mais au lieu de vérifier un seul champ, il vérifie tous les champs

Ce dont j'ai besoin:

img

Ce que j'obtiens:

img

PDF lors de l'édition :

img

Je pense que la valeur exportée y est pour quelque chose. Mais je ne sais pas quoi faire.

img

Mon code:

private static void CreatePdf(string output)
{
    using var _pdfDoc = new PdfDocument(new PdfReader("CheckTest.pdf"), new PdfWriter(output));
    var form = PdfAcroForm.GetAcroForm(_pdfDoc, true);
    var check = form.GetField("Check");
    check.SetValue("01");
}

PDF : Lien

Quelqu'un sait comment le vérifier correctement ?

Merci!

1
Gustavo Sabel 16 nov. 2020 à 15:32

1 réponse

Meilleure réponse

Tout d'abord, le PDF utilise essentiellement à mauvais escient les champs de case à cocher PDF AcroForm en tant que boutons radio au lieu d'utiliser de véritables champs de bouton radio PDF AcroForm.

La spécification PDF ne spécifie pas clairement ce qu'une visionneuse PDF doit faire dans un tel cas (c'est une mauvaise utilisation après tout), mais les développeurs du générateur de formulaire PDF en question ont probablement expérimenté et déterminé que dans la visionneuse PDF la plus largement utilisée, Adobe Acrobat Reader, cette mauvaise utilisation fonctionne comme ils le souhaitent.

Comme cette utilisation est au-delà des spécifications, cependant, d'autres processeurs PDF traitant de tels PDF peuvent produire des résultats complètement différents sans rien faire de mal.


Cela étant dit, il existe un moyen de remplir le formulaire à l'aide d'iText et d'obtenir des résultats similaires à ceux générés par Adobe Reader.

Le problème est que iText par défaut pour tous les types de champs de formulaire, à l'exception des champs de bouton radio AcroForm réels, génère de nouvelles apparences d'une manière appropriée au type de champ lors de la définition de la valeur du champ. Dans votre document, il y a trois objets de champ de case à cocher avec le même nom. Ainsi, ils sont considérés comme une seule case à cocher avec trois widgets représentant la même valeur, et les apparences sont donc générées au fur et à mesure que vous observez.

Mais vous pouvez dire à iText de ne pas générer de nouvelles apparences, en utilisant une autre surcharge SetValue acceptant une valeur booléenne supplémentaire, remplacez simplement

check.SetValue("01");

Par

check.SetValue("01", false);

Maintenant, iText se contente des apparences existantes, de sorte que seul le champ qui a une apparence pour cette valeur "01" est vérifié.

Attention, n'empêchez iText de générer des apparences que dans des cas comme celui-ci. Dans le cas des champs de texte, par exemple, si les apparences ne sont pas mises à jour, les anciennes apparences avec l'ancien contenu du champ continueraient d'être affichées même si la valeur du champ interne a changé.

0
mkl 18 nov. 2020 à 12:20