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


37

J'ai un document pdf que j'ai créé par des moyens non-Acrobat (impression en pdf, puis fusion d'un tas de pdfs), mais je voudrais 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 étiqueté "page 1" est vraiment la 7ème feuille du pdf). Quelle est la manière la plus simple (et idéalement gratuite) de procéder?

Pour être clair, je n'essaie pas de changer les numéros sur les 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 "aller à la page 1" pour aller à la page intitulée 1, qui pourrait être la feuille 7).

Pour ce que ça vaut, je suis sur Windows, même si j'ai également accès aux Mac.


Je ne suis pas sûr de bien comprendre votre description + vos exigences. Pouvez-vous fournir un lien vers un exemple de PDF que vous souhaitez modifier?
Kurt Pfeifle

existe-t-il un outil en ligne de commande pour le faire, par exemple sur un gros fichier pdf sans réellement ouvrir le fichier txt?
jj_p

comme par exemple pdftk?
jj_p

Réponses:


39

Ce que vous voulez s'appelle en effet des étiquettes de page et peut facilement être ajouté directement dans le code source du PDF. Renommez l'extension de fichier de pdfà txtet ouvrez le fichier dans un éditeur de texte (cela peut être lent, selon la taille du fichier, soyez patient). Les informations sur les étiquettes de page sont stockées dans un nœud appelé catalogue de documents qui ressemble à ceci:

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

Il peut contenir des éléments plus confus, mais c'est la structure de base. Il n'y a qu'un seul catalogue, donc dans un gros fichier, vous pouvez rechercher le nœud qui contient /Catalog. Vous pouvez maintenant apporter les modifications souhaitées en insérant l' /PageLabelsentré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 nombres, appelées index de page . La page 1 a l'index 0, la page 2 l'index 1et ainsi de suite. Ils décrivent toujours les plages, donc la ligne avec 1 <<...>>s'applique à toutes les pages de l'index 1 à 5 et la ligne avec 6 <<...>>s'applique à toutes les pages de 6 jusqu'à la dernière page. Une étiquette pour 0 <<...>>doit toujours être définie.

Vous pouvez trouver plus d'informations sur les étiquettes de page et le code source PDF dans la norme PDF ou dans un wiki sur les normes PDF.


4
Merveilleux! C'est le seul endroit sur le Web où j'ai trouvé des informations aussi directes et utiles. Nous n'avons pas tous Acrobat Reader, après tout.
Noldorin

3
Avec l'exemple /St 8ou /St 2, vous définissez un point de départ pour l'étiquette affichée; mais choisissez n'importe quel nombre au lieu de 8 (ou 2), qui doit être> = 1. Par exemple, 1 << /S /r /St 12 >>numérotera les pages de (en fait) 2-6 comme (affichées) xii-xvii - parce que '12' correspond à 'xii'.
n611x007

1
merci pour la réponse, mais d'après mon expérience, cette méthode fonctionne parfois et parfois non; aussi, il m'est arrivé de trouver plus d'un catalogue: comment expliquez-vous cela?
jj_p

1
Grande information. Voici un lien vers une autre source utile: Spécification d'une numérotation cohérente des pages pour les documents PDF à partir du W3C.
Adam Mackler

2
Êtes-vous sûr que cela fonctionne comme ça? En regardant le contenu brut de certains fichiers PDF, il semblait que certains numéros d'index qui pointent vers des positions dans le fichier après que le catalogue devrait être mis à jour si la longueur du contenu précédent change.
OR Mapper

6

Si je vous comprends bien, voici comment cela devrait fonctionner:

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 semble me souvenir que cela n'a pas fonctionné de manière fiable ou complète la dernière fois que j'ai essayé cela (il y a environ 2 ans).

MISE À JOUR: Ma mémoire ne me manquait pas. J'ai à nouveau essayé et déposé un rapport de bogue pour Ghostscript ( bogue 691889 ) à ce sujet. Suivez le lien vers le rapport de bug pour voir les détails.


5

REMARQUE 1: La réponse acceptée est encore généralement correcte, mais présente quelques lacunes. Il manque dans la mesure où de nombreux fichiers PDF ne sont pas directement modifiables sous forme de texte. Même lorsqu'ils le sont, une telle modification peut parfois endommager le PDF et le rendre illisible. Une solution, qui fonctionnera pour Unix et Microsoft Windows, est qpdf qui peut traduire des fichiers PDF en "QDF", un formulaire modifiable en texte qui est toujours un fichier PDF valide. Le qpdfpackage est livré avec fix-qdfqui recalcule les décalages après qu'un fichier QDF a été modifié pour corriger tout dommage.

REMARQUE 2: mal à l'aise avec les éditeurs de texte? Essayez d'abord d'utiliser un éditeur GUI tel que jpdftweak . Parfois, les éditeurs de PDF GUI fonctionnent, auquel cas, oui, 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, veuillez ne pas voter contre ma réponse pour être moins qu'élégant.


Comment modifier les numéros de page PDF à l'aide de Qpdf

Sommaire:

  1. qpdf -qdf foo.pdf foo.qdf
  2. modifier 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.

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

qpdf -qdf foo.pdf foo.qdf

Remarque: Si vous n'avez pas encore installé qpdf, les exécutables Microsoft Windows peuvent être téléchargés depuis https://github.com/qpdf/qpdf/releases Les systèmes Unix, tels que Ubuntu et Debian GNU / Linux peuvent l'installer en tapantapt install qpdf .

Étape 2.

Modifiez le document QDF à l'aide d'un éditeur de texte tel que notepad ++, emacs ou gedit. Recherchez le mot /Cataloget notez les << crochets angulaires >> à l'intérieur. À proximité, vous trouverez le courant /PageLabels(le cas échéant ).

Nous ajouterons chaque section qui devrait être numérotée différemment au /PageLabels. Le format est start-page<< style>>. Notez que l'espace blanc n'a pas d'importance et que la première page du document l'est 0. Sauf indication contraire, une nouvelle section commence toujours par numéroter les pages à partir de 1.

Exemples

Voici un exemple complet de l'apparence de 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 d'étiquettes de page, ajoutez-les après /Type /Catalog. Par exemple, on pourrait changer,

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

dans,

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

FACULTATIF: À PARTIR D'UN DIFFÉRENT NUMÉRO AVEC /St

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

FACULTATIF: UTILISER UN STYLE DIFFÉRENT AVEC /S

L' /Sopérateur prend un argument qui vous permet de choisir le style de numérotation,

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

Si l'on omet l' /Sopérateur, alors cette section de pages n'aura pas de numérotation. Par exemple:

0 << >>         % No label for cover

FACULTATIF: AJOUTER 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
  >>

La spécification d'un préfixe sans style ( /S) vous donnera des pages qui n'ont que le mot sans nombre. Cela peut être utile, par exemple, si vous souhaitez qu'une page de couverture ait simplement le libellé "Couverture".

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

Étape 3.

Exécutez fix-qdfpour rendre vos modifications PDF valides et mettez la sortie dans bar.qdf.

fix-qdf foo.qdf > bar.qdf

Étape 4.

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

Étape 5.

Convertissez le fichier QDF en un PDF normal, comme ceci:

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.


4

Il y a un petit script python, 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

Cela a fait le travail exactement comme j'avais besoin. Merci!
telotortium

3

jPdf Tweak est un utilitaire graphique Open Source qui vous permet de modifier les étiquettes de page dans des fichiers PDF. La page de documentation fournit des instructions pas à pas.


Je l'ai utilisé pour ajouter mes étiquettes de page personnalisées au format "vide" avec du texte comme préfixe. A bien fonctionné!
Matt Sephton

C'est une bien meilleure réponse que l'édition de texte à la main
endolith

Veuillez ajouter les instructions étape par étape ici au lieu de vous fier à un lien externe. Merci!
hackerb9

1

Pour supprimer les anciens, la méthode multiplateforme la plus simple consiste probablement à rogner les anciens. Vous pouvez le faire, par exemple, avec BRISS.

Ajouter les nouveaux à l'aide d'outils gratuits est plus délicat. Personnellement, je le ferais probablement avec pdflatex, comme dans cette réponse StackExchange , bien que cela puisse être une solution plutôt impliquée, sauf si vous avez d'autres utilisations pour pdflatex.

Je pense que cela peut être fait, mais avec jPdfTweak à la place.


1

La méthode donnée par Dane H. fonctionne avec Acrobat Reader (ou, pour être précis, la version actuelle d' Adobe Reader). Un point mineur à noter: le champ en haut n'acceptera que 8 caractères, vous ne pouvez donc pas entrer quelque chose comme «index de sujet» si une telle étiquette a été utilisée. Mais vous pouvez utiliser à la place l'élément de menu Affichage> Navigation de page> Aller à ..., ou l'équivalent clé.

Une autre astuce: la spécification pdf attribue toujours les numéros de page consécutivement, donc dans le cas d'un document produit en scannant des paires de pages, les deux ensembles de numéros sont déphasés (sauf si vous numérotez laborieusement chaque page individuellement). Mais vous pouvez sans effort configurer votre document afin que la convention «aller à la page n vous amène aux pages 2n et 2n + 1» s'applique.


1

La réponse des Danois est la meilleure, les formats ont un peu changé maintenant, cela pourrait être utile:

%PDF-1.6

29241 0 obj

<</Metadata 1685 0 R/Outlines 29461 0 R/PageLabels<</Nums[0<</S/D>>3<</S/D/St 6>>4<</S/D/St 10>>5<</S/D/St 12>>15<</S/D/St 70>>16<</S/D/St 72>>17<</S/D/St 80>>18<</S/D/St 82>>19<</S/D/St 90>>23<</S/D/St 96>>25<</S/D/St 99>>29<</S/D/St 110>>31<</S/D/St 130>>32<</S/D/St 133>>35<</S/D/St 137>>36<</S/D/St 140>>37<</S/D/St 145>>39<</S/D/St 150>>40<</S/D/St 152>>42<</S/D/St 155>>43<</S/D/St 160>>46<</S/D/St 165>>47<</S/D/St 167>>48<</S/D/St 170>>49<</S/D/St 180>>50<</S/D/St 190>>52<</S/D/St 300>>53<</S/D/St 305>>54<</S/D/St 319>>56<</S/D/St 380>>57<</S/D/St 390>>58<</S/D/St 500>>67<</S/D/St 515>>68<</S/D/St 525>>70<</S/D/St 550>>71<</S/D/St 553>>72<</S/D/St 560>>73<</S/D/St 600>>76<</S/D/St 620>>78<</S/D/St 650>>82<</S/D/St 670>>85<</S/D/St 700>>95<</S/D/St 714>>117<</S/D/St 900>>162<</S/D/St 1000>>178<</S/D/St 1200>>209<</S/D/St 1500>>263<</S/D/St 1555>>270<</S/D/St 1563>>389<</S/D/St 1681>>522<</S/D/St 1813>>]>> /PageMode/UseOutlines/Pages 29177 0 R/Type/Catalog>>

endobj

1

J'ai trouvé que l'édition directe du fichier (non compressé par pdftk) ne fonctionnait pas s'il y avait déjà '/ title' dans la région '/ outlines'. La technique de montage direct décrite dans un article ci-dessus est démontrée sur Youtube: https://www.youtube.com/watch?v=zoH1Z_hSpak

Mais la fonction «mise à jour» de pdftk peut être plus intuitive (et plus fiable lorsque «/ titres» existe déjà dans la région «/ contours» du fichier PDF) en modifiant le fichier «doc_data.txt» utilisé ici: https: / /www.pdflabs.com/blog/export-and-import-pdf-bookmarks/


1
Salut @Bob, les réponses Link-only sont de mauvaise qualité. Ils seront inutiles si le site cible se déplace ou disparaît. Veuillez modifier votre réponse et citer la partie pertinente de la solution ici.
C0deDaedalus

0

BeCyPDFMetaEdit http://www.becyhome.de/becypdfmetaedit/description_eng.htm

Vous pouvez ajouter / supprimer / modifier le schéma de numéros de page interne dans l'onglet "pages" de cet outil gratuit.

Et soyez prudent, la visionneuse PDF xchange n'affiche pas le schéma des numéros de page, et foxitreader a un bon résultat. Je n'ai pas testé le lecteur Acrobat.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.