abracadabraPDF › Forums › PDF – Général › Propriété d’un champ › Répondre à : Propriété d’un champ
bonjour,
J’avais écris un script il y a déjà quelques temps qui comptait le nombre de lignes d’un champ même si elles n’apparaissaient pas toutes :
Compter des lignes dans un champ multignes sans caractères de retour à la ligne
Je m’en suis donc inspiré pour l’adapter et pouvoir redimensionner le champ.
La réponse longue est oui, il faut compter le nombre de caractères saisis en temps réel et aussi ceux qui sont supprimés. Ça requiert donc une usine à gaz en JavaScript assez longue à développer et ça impose d’utiliser une police à chasse fixe (Courier), et dont le corps ne doit pas varier.
C’est effectivement une usine à gaz, mais de cette manière mais la police n’a pas besoin d’une chasse fixe !
Et voici le script à exécuter depuis la console ou en action (également en pièce jointe dans le fichier) :
console.show();
console.clear();
// Variables
var p=this.numPages;
var g=this.getField("champTexte");
var gRect=g.rect;
var hautChamp=gRect[1];
var basChamp=gRect[3];
var paragraphes=g.value.split("\r");
var nbParagraphes=paragraphes.length;
var toutLeTexte=g.value;
var nbCaracteres=toutLeTexte.length;
var texteEntier=g.value;
var nbLignesTexte=0;
var nbLignes=0;
var deltaLignes=0;
var aRect=this.getPageBox("Crop");
var laPage=0;
// Fonction
function calculMots(lesMots) {
var lesMots=lesMots.replace(/[\'\-\’]/g, " ");
var lesMots=lesMots.replace(/[\"\”\*\_\,\.\;\:\!\?\(\)\{\}\[\]\«\»]/g, "");
var lesMots=lesMots.replace(/\s+/g, " ");
var lesMots=lesMots.replace(/^\s+|\s+$/g, "");
var lesMots=lesMots.replace(/\s+/g, " ");
var enTable=lesMots.split(" ");
motsParagraphe.push(enTable.length);
}
var motsParagraphe=[];
for (var i=0; i<nbParagraphes; i++) calculMots(paragraphes);
if (paragraphes[0].length) {
// Boucle si texte débordant de la page
while (toutLeTexte.length) {
// Nouvelle page
this.newPage(p, aRect[2], aRect[1]);
var basMot=hautChamp;
// Copie du champ
var f=this.addField("autreChamp", "text", p, g.rect);
for (var j in g) {
try {
if (typeof g[j]!="function" && j!="name" && j!="type" && j!="page" && j!="rect") f[j]=g[j];
} catch(e) {}
}
f.value=toutLeTexte;
// Aplatissement
this.flattenPages(p);
// Nombre de mots
var nbMots=this.getPageNumWords(p);
for (var i=0; i<nbMots; i++) {
var leMot=this.getPageNthWord(p, i, true);
var q=this.getPageNthWordQuads(p, i);
m=(new Matrix2D).fromRotated(this,p);
mInv=m.invert();
r=mInv.transform(q);
r=r.toString();
r=r.split(",");
if (Number(r[5])>basChamp) {
if (Number(r[5])<basMot) {
var basMot=Number(r[5]);
if (!laPage) nbLignesTexte++;
nbLignes++;
}
if (!laPage) {
if (i==0) {
var hautTexte=Number(r[1]);
var premiereLigne=basMot;
var deltaV=hautChamp-hautTexte;
}
if (nbLignes==2 && !deltaLignes) var deltaLignes=premiereLigne-Number(r[5]);
}
var toutLeTexte=toutLeTexte.substr(toutLeTexte.indexOf(leMot)+leMot.length)
var toutLeTexte=toutLeTexte.replace(/[\"\”\*\-\_\,\.\;\:!?\'\(\)\{\}\[\]\«\»]$/, "").replace(/^\s+$/, "");
} else break;
}
laPage++;
this.deletePages(p);
}
// Redimensionnement
var champBas=premiereLigne-(deltaLignes*(nbLignes-1))-deltaV;
if (champBas<=0) var champBas=0;
gRect[3]=champBas;
g.rect=gRect;
g.value=texteEntier;
// Texte Alerte et Console
var leTexte="Le texte du champ \""+this.getField("champTexte").name+"\" est écrit sur "+nbLignes+" ligne";
if (nbLignes>1) leTexte+="s";
leTexte+=". ";
var nbMots=0;
for (var i=0; i<motsParagraphe.length; i++) nbMots+=motsParagraphe;
leTexte+="Il est composé de "+nbMots+" mot";
if (nbMots>1) leTexte+="s";
if (nbParagraphes>1) leTexte+=" et divisé";
if (nbMots>1) {
leTexte+=" en "+nbParagraphes+" paragraphe";
if (nbParagraphes>1) leTexte+="s";
}
leTexte+=".\nIl y a "+nbCaracteres+" caractères au total.";
if (nbParagraphes>1) {
for (var i=0; i<motsParagraphe.length; i++) {
leTexte+="\n• Paragraphe "+(i+1)+" : "+motsParagraphe+" mot";
if (motsParagraphe>1) leTexte+="s";
leTexte+=" ("+paragraphes.length+" caractères).";
}
}
if (champBas!=basChamp) leTexte+="\r\rLe champ a été redimensionné.\rIl comportait "+nbLignesTexte+" lignes visibles entièrement.";
if (champBas<basChamp) {
if (champBas>0) leTexte+="\r\rToutes les lignes sont maintenant visibles.";
else leTexte+="\r\rLe champ n'est pas assez haut pour afficher tout le texte avec ce corps.";
}
console.println(leTexte);
app.alert(leTexte,3);
console.hide();
//this.dirty=false;
} else {
app.alert("Il faut écrire un texte dans ce champ pour en connaître les détails !",3);
}
@+
😎