50 votes

Comment modifier les numéros de page internes dans les métadonnées d'un PDF ?

J'ai un document pdf que j'ai créé par des moyens autres qu'Acrobat (impression en pdf, puis fusion de plusieurs pdf), mais j'aimerais changer manuellement les numéros de page (c'est-à-dire que les premières pages sont simplement des pages de titre, la page qui est la page de titre est la page de titre). étiqueté La "page 1" est en réalité la 7ème feuille du pdf). Quel est le moyen le plus simple (et idéalement gratuit) de faire cela ?

Pour être clair, je n'essaie pas de modifier les numéros des pages elles-mêmes, mais les numéros de page dans les "métadonnées" que le pdf stocke (les pages elles-mêmes sont déjà numérotées correctement ; je veux juste que "aller à la page 1" aille à la page étiqueté 1, qui pourrait être la feuille 7).

Pour ce que ça vaut, je suis sous Windows, mais j'ai aussi accès à des Mac.

51voto

Ce que vous voulez s'appelle en effet étiquettes de page et peuvent facilement être ajoutés directement dans le code source du PDF. Renommer l'extension de fichier de pdf à txt et ouvrez le fichier dans un éditeur de texte (cette opération peut être lente, en fonction de la taille du fichier, soyez patient). Les informations relatives aux étiquettes de page sont stockées dans un nœud appelé catalogue de documents qui se présente comme suit :

3 0 obj
<< /Type /Catalog
   /Pages 1 0 R
>>
endobj

Il peut contenir des éléments plus confus, mais il s'agit de la structure de base. Il n'y a qu'un seul catalogue, de sorte que dans un fichier volumineux, vous pouvez rechercher le nœud qui contient /Catalog . Vous pouvez à présent apporter les modifications souhaitées en insérant le fichier /PageLabels entrée :

3 0 obj
<< /Type /Catalog
   /Pages 1 0 R
   /PageLabels << /Nums [ 0 << /P (cover) >>
                          % labels 1st page with the string "cover"
                          1 << /S /r >>
                          % numbers pages 2-6 in small roman numerals
                          6 << /S /D >>
                          % numbers pages 7-x in decimal arabic numerals
                        ]
               >>
>>
endobj

Il y a 3 lignes commençant par des chiffres, appelées index des pages . La page 1 contient l'index 0 page 2 l'index 1 et ainsi de suite. Ils décrivent toujours des fourchettes, de sorte que la ligne avec 1 <<...>> s'applique à toutes les pages des index 1 à 5 et la ligne avec 6 <<...>> s'applique à toutes les pages à partir de 6 jusqu'à la dernière page. Une étiquette pour 0 <<...>> doit toujours être défini.

Vous trouverez plus d'informations sur les étiquettes de page et le code source des PDF dans la rubrique PDF standard ou dans un wiki sur les normes PDF.

15voto

hackerb9 Points 789

NOTE 1 : La réponse acceptée est encore en grande partie correcte, mais présente quelques lacunes. Elle présente des lacunes dans la mesure où de nombreux fichiers PDF ne sont pas directement modifiables en tant que texte. Même lorsqu'ils le sont, ces modifications peuvent parfois endommager le PDF et le rendre illisible. Une solution, qui fonctionne à la fois sous Unix et sous Microsoft Windows, est la suivante qpdf qui permet de traduire les fichiers PDF en "QDF", une forme de texte éditable qui reste un fichier PDF valide. Le qpdf Le paquet comprend fix-qdf qui recalcule les décalages après qu'un fichier QDF a été édité pour corriger les dommages éventuels.

NOTE 2 : Vous n'êtes pas à l'aise avec les éditeurs de texte ? Essayez d'utiliser un éditeur graphique tel que jpdftweak premier. Parfois, les éditeurs pdf à interface graphique fonctionnent, auquel cas, vous avez terminé. Cependant, lorsqu'ils échouent, comme cela a souvent été le cas pour moi, vous pouvez essayer cette alternative plus robuste. Quoi qu'il en soit, ne votez pas contre ma réponse parce qu'elle n'est pas très élégante.


COMMENT ÉDITER LES NUMÉROS DE PAGE DU PDF à l'aide de Qpdf

Résumé :

  1. qpdf -qdf foo.pdf foo.qdf

  2. éditer foo.qdf

     0 << >>           % No label on first pages
     6 << /S /D >>     % Start numbering from 7th page.
  3. fix-qdf foo.qdf >bar.qdf

  4. test bar.qdf

  5. qpdf bar.qdf bar.pdf


Étapes détaillées

Étape 1.

Convertir le document au format QDF, facilement éditable. Exécutez qpdf à partir de la ligne de commande comme suit :

qpdf -qdf foo.pdf foo.qdf

Remarque : Si qpdf n'est pas déjà installé, les exécutables pour Microsoft Windows peuvent être téléchargés à l'adresse suivante https://github.com/qpdf/qpdf/releases Les systèmes Unix, tels qu'Ubuntu et Debian GNU/Linux, peuvent l'installer en tapant apt install qpdf .

Étape 2.

Modifiez le document QDF à l'aide d'un éditeur de texte tel que notepad++, emacs ou gedit. Recherchez le mot /Catalog et notez les <<angle brackets>> qu'il contient. À proximité, vous trouverez l'actuel /PageLabels ( le cas échéant ).

Nous ajouterons chaque section qui doit être numérotée différemment à la rubrique /PageLabels . Le format est le suivant start-page << style >>. Notez que les espaces blancs n'ont pas d'importance et que la première page du document est 0 . Sauf indication contraire, les pages d'une nouvelle section sont toujours numérotées à partir de 1.

Exemples

Voici un exemple complet de ce à quoi peuvent ressembler les PageLabels, avec des commentaires ajoutés :

/Type /Catalog
/PageLabels <<
  /Nums [
    0           % From the first page of the document,
      <<
        /S /r   % ...use the lowercase roman numeral style.
      >>
    6           % From seventh page onward,
      <<
        /S /D   % ...use ordinary digits (arabic numerals)
      >>
  ]
>>

Si le fichier n'a pas de PageLabels, ajoutez-les après /Type /Catalog . Par exemple, on peut changer,

1 0 obj
<<
  …
  /Type /Catalog
>>
endobj

en,

1 0 obj
<<
  … 
  /Type /Catalog
  /PageLabels
      << /Nums [
    0 << >>                 % No label for cover
    1 << /S /r >>           % i, ii for index
    3 << /S /D /St 15 >>    % 15, 16, 17, ... for article
    31 << /S /D /P (A-) >>  % A-1, A-2, A-3... for appendix
       ]
  >>
>>
endobj

OPTIONNEL : COMMENCER À PARTIR D'UN AUTRE NUMÉRO AVEC /St

Chaque section reprend la numérotation à 1, sauf indication contraire de votre part à l'aide de /St . Remarquez que dans l'exemple ci-dessus, la quatrième page commence à 15.

OPTIONNEL : UTILISATION D'UN STYLE DIFFÉRENT AVEC /S

のことです。 /S prend un argument qui vous permet de choisir le style de numérotation,

  • /Chiffres D (1, 2, 3...)
  • /R majuscule romaine (I, II, III...)
  • /r minuscule romain (i, ii, iii...)
  • /A majuscule alphabétique (A, B, C, ...., X, Y, Z, AA, AB, AC,...)
  • /a minuscule alphabétique (a, b, c, ...., x, y, z, aa, ab, ac,...)

Si l'on omet le /S cette section de pages n'aura pas de numérotation. Par exemple :

0 << >>         % No label for cover

OPTIONNEL : AJOUT D'UN PRÉFIXE À CHAQUE PAGE AVEC /P

Vous pouvez afficher n'importe quelle chaîne de texte avant le numéro de page en spécifiant un mot entre parenthèses après /P :

  31
  <<
    /S /D
    /P (A-)     % label appendix pages A-1, A-2, A-3
  >>

Spécifier un préfixe sans style ( /S ), vous donnera des pages qui ne contiennent que le mot sans aucun numéro. Cela peut être utile, par exemple, si vous souhaitez qu'une page de couverture porte simplement la mention "Couverture".

     0 << /P (Cover) >>        % No number, just "Cover"

Étape 3.

Exécuter fix-qdf pour rendre vos modifications valides en PDF et placer le résultat dans bar.qdf.

fix-qdf foo.qdf > bar.qdf

Étape 4.

Ouvrez le fichier bar.qdf dans votre programme de visualisation PDF et vérifiez qu'il est correctement numéroté.

Étape 5.

Reconvertissez le fichier QDF en un PDF normal, comme suit :

qpdf bar.qdf bar.pdf

Ta da. Vous avez terminé. Vous avez maintenant un document avec des numéros de page correctement étiquetés dans bar.pdf.

6voto

Kurt Pfeifle Points 11465

Si je vous comprends bien, voici comment cela se passe devrait travail :

gs \
  -o modified-pagelabels-50pages.pdf \
  -sDEVICE=pdfwrite \
  -c "[ /Page 1 /Label (i)     /PAGELABEL pdfmark" \
  -c "[ /Page 2 /Label (ii)    /PAGELABEL pdfmark" \
  -c "[ /Page 3 /Label (III)   /PAGELABEL pdfmark" \
  -c "[ /Page 4 /Label (four)  /PAGELABEL pdfmark" \
  -c "[ /Page 5 /Label (v)     /PAGELABEL pdfmark" \
  -c "[ /Page 6 /Label (|||||) /PAGELABEL pdfmark" \
  -f 50pages.pdf

Cependant, je sembler de se rappeler que cela n'a pas fonctionné de manière fiable ou complète la dernière fois que j'ai essayé (il y a environ 2 ans).

UPDATE : Ma mémoire ne me faisait pas défaut. J'ai réessayé et j'ai déposé un rapport de bogue pour Ghostscript. ( bug 691889 ) à ce sujet. Suivez le lien vers le rapport de bogue pour voir les détails.

5voto

CherryBerry Points 101

jPdf Tweak est un utilitaire graphique Open Source qui vous permet d'éditer des étiquettes de page dans les fichiers PDF. L'utilitaire la documentation fournit des instructions étape par étape.

5voto

DG' Points 589

Il existe un petit script Python script, qui peut faire le travail : https://github.com/lovasoa/pagelabels-py

Dans votre cas, appelez quelque chose comme :

./addpagelabels.py --delete file.pdf
./addpagelabels.py --startpage 1 --type 'roman lowercase' file.pdf
./addpagelabels.py --startpage 7 --type arabic file.pdf

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X