Aplatir certains champs  (Lu 298 fois) Partager ce sujet Imprimer

1 B


jctremblay  21 avril 2021 : 20:58

Il est possible d'aplatir tout les champs d'un formulaire facilement avec flattenPages()
Est-ce possible d'aplatir un champ, ou quelques champs spécifique seulement?

IP archivée


Merlin  21 avril 2021 : 22:38

Bonjour

Tu as le choix entre le Selective Flatten Tool de Thom Parker :
https://www.pdfscripting.com/public/Selective-Flatten-Tool-Description.cfm


Ou le Selective Flattener de UVSAR :
https://www.uvsar.com/projects/acrobat/flattener/


Les deux sont excellents.


Sinon, l'outil "Aplatir" des abracadabraTools permet de n'aplatir qu'une seule page :
https://www.abracadabrapdf.net/utilitaires/acrobat-plugins/abracadabratools/

IP archivée


jctremblay  21 avril 2021 : 22:57

J’utilise Selective Flatten Tool de Thom Parker. Je me demandais s’il était possible d’aplatir qu’un seul avec le nom d’un champ spécifique mais en javascript.

IP archivée


Merlin  21 avril 2021 : 23:03

C'est une bonne question !  :joker:

IP archivée


jctremblay  21 avril 2021 : 23:41

Pour aplatir des champs spécifique, il y a un javascript ici: https://answers.acrobatusers.com/How-flatten-specific-group-form-fields-page-q293414.aspx


Par contre, je me demande si toutes ces lignes sont nécessaires.

IP archivée


bebarth  22 avril 2021 : 10:00

bonjour,
Il y a 3 possibilités pour le paramètre nNonPrint de la fonction flattenPages.
On peut dont paramétrer un champ de façon à faire ce que l'on souhaite.
https://help.adobe.com/en_US/acrobat/acrobat_dc_sdk/2015/HTMLHelp/index.html#t=Acro12_MasterBook%2FJS_API_AcroJS%2FDoc_methods.htm%23TOC_flattenPagesbc-34&rhtocid=_6_1_8_23_1_33
Attention : dans l'API Reference, la plupart du temps (car je ne le connais pas par coeur) le terme "annotation" fait référence aux commentaires (annots) mais pour cette fonction il englobe les champs, commentaires et liens (All annotations—including form fields, comments, and links).
@+
 :bonjour:

IP archivée


jctremblay  22 avril 2021 : 15:45

Donc, si j’ai bien saisi le script:


a) écriture de la liste des champs;
b) capturer les propriétés de visibilité de tout champs, puis les mettre tous invisible;
c) mettre les champs de la liste à visible;
d) Aplatir les champs visible;
e) Restaurer les propriétés initiaux des champs;

IP archivée


Merlin  22 avril 2021 : 16:48

C'est bien ça, sauf qu'il ne s'agit pas de la visibilité (display) qui n'est disponible que pour les champs, mais de la propriété nNonPrint qui est disponible pour les champs et les annotations/commentaires.

IP archivée


jctremblay  22 avril 2021 : 16:50

C’est ça. La «visibilité» ou pas lors de l’impression.

IP archivée


bebarth  22 avril 2021 : 19:04

En fin d'année dernière je me suis lancé sur l'écriture d'un utilitaire similaire... en français !
Je n'ai malheureusement pas trouvé le temps de le terminer bien qu'il soit bien avancé, et je ne pense pas pouvoir le faire ces prochain mois.
Certainement l'hiver prochain !
@+
 :bonjour:

IP archivée


Merlin  22 avril 2021 : 19:17

 :bravo:
Place tous les items en variable ou dans un array et tu auras un utilitaire multilingue sans effort supplémentaire. :Smiley03:

IP archivée


jctremblay  22 avril 2021 : 19:40

... Certainement l'hiver prochain !


J’ai hâte à l’hiver prochain! [Je pensais jamais dire ça!]  :jerisjaune:

IP archivée


jctremblay  27 avril 2021 : 14:55

Je reviens avec une petite question concernant le script disponible sur le site Acrobatuser que j’ai mentionné plus haut.


Ce script permet de saisir manuellement les noms des champs à aplatir comme ceci:


var list = new Array();
list = [
"Text1",
"Text2"
];




J’imagine que ce serait possible au lieu d’une liste spécifique, que le Array contiennent automatiquement tout les champs de type bouton. Comment pourrais-je inclure quelques choses du genre pour construire mon Array avec les noms des boutons?


Aucune idée comment faire ça avec > this.getField(fname).type == "button"


IP archivée


bebarth  27 avril 2021 : 20:57

bonjour,
Voici un script pour faire une table avec les noms de tous les boutons radio :
var lesBoutonsRadio=new Array();
for (var i=0; i<this.numFields; i++) {
    var leChamp=this.getField(this.getNthFieldName(i));
    if (leChamp.type=="radiobutton") lesBoutonsRadio.push(this.getNthFieldName(i));
}
@+
 :bonjour:

IP archivée


jctremblay  28 avril 2021 : 00:34


Merci... Si j’integre ton code pour aplatir seulement les champs bouton. J’ai une erreur. À la ligne 17.


TypeError: this.getField(...) is null

17:Console:Exec


Tu as une idée... J’essai de récupérer le code d’AcrobatUsers pour aplatir tout les boutons.


var list=new Array();
for (var i=0; i<this.numFields; i++) {
    var leChamp=this.getField(this.getNthFieldName(i));
    if (leChamp.type=="button") list.push(leChamp);
}


var fields = new Array;
for (var i = 0; i < this.numFields; i++) {
    fields[i] = [
        this.getNthFieldName(i),
        this.getField(this.getNthFieldName(i)).display
    ];
    this.getField(fields[i][0]).display = display.noPrint;
}


for (var i = 0; i < list.length; i++) {
    this.getField(list[i]).display = display.visible;
}


this.flattenPages({
    nStart: 0,
    nEnd: this.numPages - 1,
    nNonPrint: 1,
});


for (var i = 0; i < this.numFields; i++) {
    for (var j = 0; j < fields.length; j++) {
        if (fields[j][0] == this.getNthFieldName(i)) {
            this.getField(this.getNthFieldName(i)).display = fields[j][1];
        }
    }
}

IP archivée


bebarth  28 avril 2021 : 08:09

bonjour,
Erreur de ma part !!! en ligne 4 il faut écrire :
...
if (leChamp.type=="button") list.push(this.getNthFieldName(i));
...
@+
 :bonjour:

IP archivée


jctremblay  28 avril 2021 : 14:33

Merci! Cela fonctionne parfaitement.

IP archivée


bebarth  28 avril 2021 : 18:57

Voici comment j'aurai écrit, si je peux me permettre :
var fields=new Array();
for (var i=0; i<this.numFields; i++) {
    if (this.getField(this.getNthFieldName(i)).type!="button") {
        fields.push([this.getNthFieldName(i),this.getField(this.getNthFieldName(i)).display]);
        this.getField(this.getNthFieldName(i)).display=display.noPrint;
    } else {
        this.getField(this.getNthFieldName(i)).display=display.visible;
    }
}
this.flattenPages({
    nStart: 0,
    nEnd: this.numPages-1,
    nNonPrint: 1,
});
for (var i=0; i<fields.length; i++) {
    this.getField(fields[i][0]).display=fields[i][1];
}
Une seule fois la boucle pour vérifier le nom et l'état des champs, et pas besoin d'avoir 2 tables !
Ce coup ci j'ai vérifier avant de poster...
@+
 :bonjour:

IP archivée


Merlin  28 avril 2021 : 20:07

fields.push([this.getNthFieldName(i),this.getField(this.getNthFieldName(i)).display]);
Impressionant !
 :bravo:

IP archivée


jctremblay  28 avril 2021 : 20:11

Ça donne le vertige, mais c’est beau...  :jerisjaune:  Merci Bebarth!


Impressionant !
 :bravo:

IP archivée