abracadabraPDF › Forums › PDF – Général › Indexation des renvois de page dans document PDF. – RÉSOLU
- Ce sujet est vide.
- CréateurSujet
- 28 juillet 2011 à 12:47 #43983
bebarth
Maître des clésBonjour,
Comme pratiquement tous les ans maintenant, je travaille sur mon CD-ROM qui contient un catalogue (1600 pages) en 3 langues.
Jusqu’à présent, l’indexation des renvois de page dans le texte (see page…) était fait manuellement. Mais cette année, avec l’automatisation des renvois dans la base de données, il y en a vraiment trop pour le faire manuellement. Surtout qu’avec les 3 langues, le travail doit être fait 3 fois, car ne sont pas situé exactement au même endroit.Dans “Acrobat JavaScript Scripting Reference”, j’ai trouvé un script qui repère tous les mots “Acrobat” et fait un renvoi vers le site adobe. J’ai essayé et ce script fonctionne parfaitement avec ma version Acrobat 8.
Je pense que pour un pro de javascript, l’adaptation à mon problème ne devrait pas trop poser de problème. Pour ma part, je balbutie avec le javascript une fois par an, et cela risque de me prendre plusieurs heures, voir journées.
Y aurait-il une personne qui n’est pas encore en vacances ou déjà revenue, et qui pourrait m’aider.
Merci d’avance, ci-dessous le script Adobe.
bebarthfor (var p = 0; p < this.numPages; p++)
{
var numWords = this.getPageNumWords(p);
for (var i=0; i{
var ckWord = this.getPageNthWord(p, i, true);
if ( ckWord == “Acrobat”)
{
var q = this.getPageNthWordQuads(p, i);
// convert quads in default user space to rotated
// user space used by Links.
m = (new Matrix2D).fromRotated(this,p);
mInv = m.invert()
r = mInv.transform(q)
r=r.toString()
r = r.split(“,”);
l = addLink(p, [r[4], r[5], r[2], r[3]]);
l.borderColor = color.red
l.borderWidth = 1
l.setAction(“this.getURL(‘http://www.adobe.com/’);”);
}
}
} - CréateurSujet
- AuteurRéponses
- 29 juillet 2011 à 07:35 #51866
bebarth
Maître des clésBonjour,
Après mes premiers essais, je m’aperçois que la variable ckWord ne doit pas contenir d’espace (un simple mot). Si on ne doit travailler que sur le numéro de page, à chaque fois que le script trouvera le chiffre il fera un renvoi, même si ce numéro ne correspond pas à un numéro de page.
Je pense qu’il faudrait donc travailler plutôt sur une chaîne de caractères.
Je poursuis mes recherches.
bebarth29 juillet 2011 à 07:57 #51867bebarth
Maître des clésJ’ai trouvé le script de Merlin qui est plus complet et convivial que celui d’Adobe, mais qui est sur la même base.
http://www.abracadabrapdf.net/forum/index.php?topic=1185.msg5151#msg515129 juillet 2011 à 09:20 #51868Merlin
Maître des clésSalut,
je ne comprend pas bien… ces scripts me semblent convenir pour faire ce que tu as à faire.
Rechercher “mot”, et appliquer un hyperlien.Où rencontres tu un problème ?
29 juillet 2011 à 09:46 #51869bebarth
Maître des clésBonjour Merlin,
au début, je voulais indexer “voir page xxx” avec renvoi à la page xxx, mais “voir page xxx” ça fait 3 mots et non un seul, donc le script ne fonctionne pas.
Si j’utilise le script en n’indiquant que le numéro de page (50 par exemple), à chaque fois que le script va rencontre “50”, il va l’indexer à la page 50, même si ce nombre correspond à autre chose (longueur, poids…)
bebarth29 juillet 2011 à 13:14 #51870Merlin
Maître des clésC’est effectivement un problème que j’avais rencontré avec ce script, mais dans mon cas ce n’était pas vraiment un problème, donc je n’avais pas cherché plus loin.
Essaye en saisissant l’espace* en Unicode : u0020
Sinon j’espère qu’il existe un métacaractère pour signifier l’espace en JavaScript…
:idee:* ou bien l’expression en entier : http://abracadabrapdf.net/articles.php?lng=fr&pg=440
29 juillet 2011 à 13:41 #51871bebarth
Maître des clésÇa ne marche pas !!!
N’est-il pas possible de rechercher une chaîne de caractères ?
Par exemple, si on pouvait faire une recherche d’une chaîne de caractères qui serait la concaténation d’une première chaîne “page ” et d’une variable “xxx” représentant le numéro de la page ?
:doute:29 juillet 2011 à 14:22 #51872bebarth
Maître des clésMerlin,
J’ai aussi regardé ton script de comptage de mots, ou tu fais la distinction entre les mots avec et sans chiffres : ne pourrait-on faire une recherche sur les mots “page”, et si le mot suivant est un chiffre, on peut l’indexer…
ça, des idées, j’en ai : c’est les concrétiser que j’ai du mal…
:idee:29 juillet 2011 à 15:59 #51873Merlin
Maître des clésOn va attendre le passage de notre spécialiste du JavaScript… parce-que je ne suis pas non plus l’auteur du script de comptage de mots…
Moi ce que je maîtrise le mieux en JavaScript c’est le copier-coller et la mise en variable des messages d’alerte.
:joker:29 juillet 2011 à 20:14 #51874bebarth
Maître des clésPour info, ci-joint l’adresse de l’e-book qui a été fait (aux US) à partir des fichiers pdf :
http://www.nxtbook.com/nxtbooks/newportcorp/resource2011/#/36
On peut remarquer que l’indexation des pages fonctionne. Le sous-traitant affirme que son logiciel le fait automatiquement, mais que ces liens ne peuvent être remontés dans le pdf.
C’est donc peut-etre possible d’y arriver avec un script !
??:
1 août 2011 à 20:11 #51875bebarth
Maître des clésBon, ben finalement je me suis lancé, et bien sure ça marche pas !
C’est peut-être un début de quelque chose.
Si l’un de vous a une idée…
Merci d’avance.
:doute:for (var p = 0; p < this.numPages; p++)
{
var numWords = this.getPageNumWords(p);
for (var i=0; i{
var ckWord = this.getPageNthWord(p, i, true);
if ( ckWord == “page”)
{
//Analyse du mot suivant
MotSuivant=this.getPageNthWord(p,i+1,0);
//Premier caractère est-il un chiffre?
if(MotSuivant.charCodeAt(0)>=48&MotSuivant.charCodeAt(0)<=57)
{
// pp numéro de la page indexee
var pp = MotSuivant.Value
var q = this.getPageNthWordQuads(p, i+1);
// convert quads in default user space to rotated
// user space used by Links.
m = (new Matrix2D).fromRotated(this,p);
mInv = m.invert()
r = mInv.transform(q)
r=r.toString()
r = r.split(“,”);
l = addLink(p, [r[4], r[5], r[2], r[3]]);
l.borderColor = color.red
l.borderWidth = 1
l.setAction(“this.pageNum(pp);”);
}
}
}
}15 août 2011 à 09:22 #51876alex
ParticipantSi j’ai bien compris, voici qui devrait mieux se comporter…
Les erreurs sont signalées dans le script.console.clear();
console.println(“Processus de creation des liens…”);
for (var p = 0; p < this.numPages; p++)
{
console.println(“Page “+(p+1));
var numWords = this.getPageNumWords(p);
for (var i=0; i{
var ckWord = this.getPageNthWord(p, i, true);
console.println(i+”-Mot trouve : “+ckWord);
if ( ckWord == “page”|ckWord == “Page”)
{
//Analyse du mot suivant
MotSuivant=this.getPageNthWord(p,(i+1),true);
console.println(“Mot suivant trouve, lien a creer : “+MotSuivant);
//Premier caractère est-il un chiffre?
if(MotSuivant.charCodeAt(0)>=48&MotSuivant.charCodeAt(0)<=57)
{
// pp numéro de la page indexee
//erreur ici
var pp = MotSuivant;
//fin erreur
console.println(“Créer des liens, mot suivant trouve est un chiffre, lien a creer : “+pp);
var q = this.getPageNthWordQuads(p, i+1);
// convert quads in default user space to rotated
// user space used by Links.
m = (new Matrix2D).fromRotated(this,p);
mInv = m.invert()
r = mInv.transform(q)
r=r.toString()
r = r.split(“,”);
l = addLink(p, [r[4], r[5], r[2], r[3]]);
l.borderColor = color.red
l.borderWidth = 1;
//erreur ici
action=”this.pageNum=”+(pp-1);
l.setAction(action);
//fin erreur
}
}
}
}15 août 2011 à 09:40 #51877Merlin
Maître des clés:bravo:
19 août 2011 à 22:31 #51878bebarth
Maître des clésje profite d’une connexion wifi difficile à trouver pendant mes vacances pour remercier alex de cette excellente réponse !!!!
:extra:
merci aussi à Merlin pour son aide.
:contentdance:20 août 2011 à 07:12 #51879alex
ParticipantA tester quand même avec un document volumineux ! J’ai ajouté dans la recherche les mots “Page” et “page”:
if ( ckWord == “page”|ckWord == “Page”)
Bonne vacances !20 août 2011 à 14:20 #51880Merlin
Maître des clésA tester quand même avec un document volumineux !
Ca sature la console et ça prend un temps fou !
21 août 2011 à 11:57 #51881alex
ParticipantPour ne pas saturer la console, placer un console.clear() comme suit:
…
for (var p = 0; p < this.numPages; p++)
{
console.clear();
console.println(“Page “+(p+1));
var numWords = this.getPageNumWords(p);
…
Ainsi, la console sera effacée à chaque ouverture de page…On peut aussi supprimer toutes les impressions dans la console.En ce qui concerne le temps de calcul, c’est une autre affaire…Peut-être que la méthode que j’ai utilisé dans la mesure d’encrage pour définir le rectangle est meilleure mais ce n’est pas sûr.
21 août 2011 à 13:02 #51882bebarth
Maître des clésJ’ai fait un essai sur 175 pages, et ça m’a pris 1/2 heure. Je fait une vérif vite fait, et je lance pour 1600 pages. Cela devrait prendre 4,5 heures, mais je trouve ça raisonnable. J’ai cela à faire pour les 3 langues. Pour ce qui est du français, je fais la recherche sur “page” et “pages” car je sais qu’il n’y aura pas de “Page”. Je ferai l’indexation des “pages” suivantes manuellement car je sais qu’il n’y en a pas beaucoup.
Pour ce qui est de la console, je n’y comprend pas grand chose ! J’ai essayé de lancer l’application console du Mac, mais je ne vois rien…
Merci encore !21 août 2011 à 18:58 #51883Merlin
Maître des clésPour ce qui est de la console, je n’y comprend pas grand chose ! J’ai essayé de lancer l’application console du Mac, mais je ne vois rien…
Il s’agit de la console d’Acrobat : Pomme + J (ou CRTL + J sur PC).
24 août 2011 à 14:20 #51884bebarth
Maître des clésIl me manque vraiment des notions de base en Javascript ! D’ailleurs j’aimerais trouver un livre pour les nuls…
Mon nouveau problème est que j’ai 30 pages avant la page 1. J’ai don essayé d’incrémenter la variable pp avec pp+30, mais cela ne fonctionne pas ! Par exemple pour pp=100, pp+30 donne 10030. Ce qui me parait étrange, c’est que pp+30-1 donne 10029 !!!
Quel est donc le bon opérateur pour avoir pp+30 en numérique ???
Merci :mur:24 août 2011 à 15:02 #51885alex
ParticipantIl suffit de partir de la page 31, ce qui donne:
for (var p = 30; p < this.numPages; p++)
Le JavaScript pour les nuls, ça existe:
http://www.amazon.fr/JavaScript-pour-nuls-Emily-VanderVeer/dp/2844277160
Mais il s’agit du JavaScript pour HTML, pas de celui qui gère les objets d’Acrobat, pourtant les bases sont là. Pour trouver votre bonheur faites un tour chez Eyrolles.24 août 2011 à 17:44 #51886Merlin
Maître des clésLe JavaScript pour les nuls, ça existe:[/color]
http://www.amazon.fr/JavaScript-pour-nuls-Emily-VanderVeer/dp/2844277160Est-ce que ça existe en DVD ?
24 août 2011 à 17:48 #51887alex
ParticipantTu me poses une colle, j’aime bien l’écrit et je ne suis pas très DVD ou Webminar, si je passe chez Eyrolles, je regarde ce qui est le mieux …
Autre source, excellente et pas seulement en Javascript (j’ai trouvé tout ce qu’il faut en AJAX, SQL, pHp et Flex):
http://javascript.developpez.com/cours/24 août 2011 à 21:44 #51888bebarth
Maître des clésMerci Alex, mais je ne comprends pas le raisonnement de commencer la recherche des numéros de page à partir de la page 30 avec :
for (var p = 30; p < this.numPages; p++)
A mon avis il faudrait augmenter la variable pp de 30 dans :
action=”this.pageNum=”+(pp-1);
:doute:25 août 2011 à 06:35 #51889alex
ParticipantSi la page 1 est en 30ème position et si on ignore les 29 première pages du document, il faut doute faut-il écrire:
action=”this.pageNum=”+(30+pp-1);25 août 2011 à 07:14 #51890Merlin
Maître des clésMerci, ce site à l’air intéressant et plein de ressources.
:bravo:25 août 2011 à 09:50 #51891bebarth
Maître des clésPareil… Pour pp = 100 par exemple (30+pp-1) donne 3099 !!!
Pour les sites, je verrai plus tard car je n’ai qu’une connexion 3G.
:Euuuh:25 août 2011 à 10:08 #51892alex
ParticipantLa somme est traitée comme une concaténation de caractères (“30″+”pp-1”) !
Essayez de forcer le calcul comme suit:
action=”this.pageNum=”+(Math.round(30)+pp-1);
Ou bien:
action=”this.pageNum=”+(1*30+pp-1);25 août 2011 à 22:24 #51893bebarth
Maître des clésLes 2 solutions ne fonctionnent pas !!!
J’ai trouvé la solution (ou une solution) que j’ai testé et qui fonctionne :
…
var pp = parseInt(MotSuivant);
pp+=30
…
le problème est donc maintenant résolu, à moins que je ne m’aperçois d’un autre problème.
Merci Alex et Merlin
26 août 2011 à 06:31 #51894alex
ParticipantJe ne comprend pas, peux-tu donner l’ensemble du code ?
26 août 2011 à 07:53 #51895Merlin
Maître des clésMerci Alex et Merlin
Remercie surtout Alex…, moi il y a longtemps que j’ai décroché !
:joker:26 août 2011 à 08:01 #51896bebarth
Maître des clésJ’essaie de trouver une connexion wifi dans la journée et donne le script entier ! Sinon il faut que je retape tout sur mon iPhone…
:geek:26 août 2011 à 08:03 #51897alex
ParticipantJuste pour comprendre, ça peut attendre une ou deux semaines bien sûr.
26 août 2011 à 11:03 #51898bebarth
Maître des clésvoici le script tel que je l’ai adapté pour mon document :
console.clear();
console.println(“Processus de creation des liens…”);
for (var p = 0; p < this.numPages; p++)
{
console.clear();
console.println(“Page “+(p+1));
var numWords = this.getPageNumWords(p);
for (var i=0; i{
var ckWord = this.getPageNthWord(p, i, true);
console.println(i+”-Mot trouve : “+ckWord);
if ( ckWord == “page”|ckWord == “pages”)
{
//Analyse du mot suivant
MotSuivant=this.getPageNthWord(p,(i+1),true);
console.println(“Mot suivant trouve, lien a creer : “+MotSuivant);
//Premier caractère est-il un chiffre?
if(MotSuivant.charCodeAt(0)>=48&MotSuivant.charCodeAt(0)<=57)
{
// pp numéro de la page indexee
//conversion en variable numerique
var pp = parseInt(MotSuivant);
// ajout de 30 pages avant la page 1
pp+=30
console.println(“Créer des liens, mot suivant trouve est un chiffre, lien a creer : “+pp);
var q = this.getPageNthWordQuads(p, i+1);
// convert quads in default user space to rotated
// user space used by Links.
m = (new Matrix2D).fromRotated(this,p);
mInv = m.invert()
r = mInv.transform(q)
r=r.toString()
r = r.split(“,”);
l = addLink(p, [r[4], r[5], r[2], r[3]]);
// bords blancs
l.borderColor = color.white
l.borderWidth = 1;
action=”this.pageNum=”+(pp-1);
l.setAction(action);
}
}
}
}je vais lancer pour le document de 1600 pages cette nuit.
est-ce que ce sera plus rapide si j’enlève les commandes “console”.
je voudrais également mettre une commande d’enregistrement en fin de script pour savoir combien de temps cela a pris.
:extra:26 août 2011 à 11:32 #51899alex
ParticipantOui, enlever les commandes console.println(), ou les passer en commentaires.
Ajouter ceci au début:
d0=new Date();
debut=util.printd(“dd-mm HH:MM”,d0)
console.println(“Debut process:”+debut)
Ajouter ceci à la fin:
df=new Date();
fin=util.printd(“dd-mm HH:MM”,df)
console.println(“Fin process:”+fin)
delta=(df.valueOf()-d0.valueOf())/1000/60
console.println(“Duree process:”+delta+” minutes”)26 août 2011 à 14:02 #51900bebarth
Maître des clésÇa marche impec…
:joker:27 août 2011 à 17:57 #51901bebarth
Maître des clésPour info, 350 mn pour 1640 pages !!!
Plus que 2 versions…
:extra:5 septembre 2011 à 13:57 #51902bebarth
Maître des clésJuste pour signaler que lorsque le texte est en italique (et uniquement), seule le premier chiffre est cliquable mais le numéro de page indexé est correct.
cela me convient parfaitement car je n’ai pas beaucoup de texte en italique, mais juste pour info, est-il possible de rechercher un mot (page en l’occurence) dans une police bien précise ?
merci
:oh:5 septembre 2011 à 14:32 #51903alex
ParticipantPour contourner ce problème il faudrait calculer la longueur du rectangle en fonction du numéro de page, au lieu de faire confiance à la taille du WordQuad qui est manifestement erronée (un petit bug dans cette fonction lorsqu’on est en italique). On fera ça la prochaine fois …
5 septembre 2011 à 14:48 #51904bebarth
Maître des clésmerci alex !
ce doit être assez compliqué car en plus du nombre de caractères du numéro de page, il faut certainement aussi prendre en compte la police et le corps utilisé !!!
…et en ce qui concerne la recherche d’un mot dans une police précise, c’est possible ?
??:
- AuteurRéponses
- Vous devez être connecté pour répondre à ce sujet.