Donnez vie à vos documents numériques !
 

Indexation des renvois de page dans document PDF. – RÉSOLU

abracadabraPDF Forums PDF – Général Indexation des renvois de page dans document PDF. – RÉSOLU

  • Ce sujet est vide.
  • Créateur
    Sujet
  • #43983
    bebarth
    Maître des clés

    Bonjour,

    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.
    bebarth

    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 == “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/&#8217;);”);
    }
    }
    }

Affichage de 39 réponses de 1 à 39 (sur un total de 39)
  • Auteur
    Réponses
  • #51866
    bebarth
    Maître des clés

    Bonjour,
    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.
    bebarth

    #51867
    bebarth
    Maître des clés

    J’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#msg5151

    #51868
    Merlin
    Maître des clés

    Salut,

    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 ?
    :)

    #51869
    bebarth
    Maître des clés

    Bonjour 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…)
    bebarth

    #51870
    Merlin
    Maître des clés

    C’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

    #51871
    bebarth
    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:

    #51872
    bebarth
    Maître des clés

    Merlin,
    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:

    #51873
    Merlin
    Maître des clés

    On 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:

    #51874
    bebarth
    Maître des clés

    Pour 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 !
    :???:

    #51875
    bebarth
    Maître des clés

    Bon, 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);”);
    }
    }
    }
    }

    #51876
    alex
    Participant

    Si 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
    }
    }
    }
    }

    #51877
    Merlin
    Maître des clés

    :bravo:

    #51878
    bebarth
    Maître des clés

    je 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:

    #51879
    alex
    Participant

    A 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 !

    #51880
    Merlin
    Maître des clés

    A tester quand même avec un document volumineux !

    Ca sature la console et ça prend un temps fou !
    ;)

    #51881
    alex
    Participant

    Pour 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.

    #51882
    bebarth
    Maître des clés

    J’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 !

    #51883
    Merlin
    Maître des clés

    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…

    Il s’agit de la console d’Acrobat : Pomme + J (ou CRTL + J sur PC).
    ;)

    #51884
    bebarth
    Maître des clés

    Il 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:

    #51885
    alex
    Participant

    Il 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.

    #51886
    Merlin
    Maître des clés

    Le JavaScript pour les nuls, ça existe:[/color]
    http://www.amazon.fr/JavaScript-pour-nuls-Emily-VanderVeer/dp/2844277160

    Est-ce que ça existe en DVD ?

    #51887
    alex
    Participant

    Tu 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/

    #51888
    bebarth
    Maître des clés

    Merci 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:

    #51889
    alex
    Participant

    Si 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);

    #51890
    Merlin
    Maître des clés

    http://javascript.developpez.com/cours/

    Merci, ce site à l’air intéressant et plein de ressources.
    :bravo:

    #51891
    bebarth
    Maître des clés

    Pareil… 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:

    #51892
    alex
    Participant

    La 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);

    #51893
    bebarth
    Maître des clés

    Les 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
    :D

    #51894
    alex
    Participant

    Je ne comprend pas, peux-tu donner l’ensemble du code ?

    #51895
    Merlin
    Maître des clés

    Merci Alex et Merlin

    Remercie surtout Alex…, moi il y a longtemps que j’ai décroché !
    :joker:

    #51896
    bebarth
    Maître des clés

    J’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:

    #51897
    alex
    Participant

    Juste pour comprendre, ça peut attendre une ou deux semaines bien sûr.

    #51898
    bebarth
    Maître des clés

    voici 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:

    #51899
    alex
    Participant

    Oui, 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”)

    #51900
    bebarth
    Maître des clés

    Ça marche impec…
    :joker:

    #51901
    bebarth
    Maître des clés

    Pour info, 350 mn pour 1640 pages !!!
    Plus que 2 versions…
    :extra:

    #51902
    bebarth
    Maître des clés

    Juste 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:

    #51903
    alex
    Participant

    Pour 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 …

    #51904
    bebarth
    Maître des clés

    merci 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 ?
    :???:

Affichage de 39 réponses de 1 à 39 (sur un total de 39)
  • Vous devez être connecté pour répondre à ce sujet.