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

J'ai un document pdf que j'ai créé par des moyens non-Acrobat (impression sur pdf, fusion de plusieurs pdfs), mais j'aimerais modifier manuellement les numéros de page (c'est-à-dire que les premières pages ne sont que 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 faire cela?

Pour être clair, je n'essaie pas de modifier les chiffres sur les pages elles-mêmes, mais les numéros de page dans les "métadonnées" que les magasins pdf (les pages elles-mêmes sont déjà numérotées correctement, je veux simplement que "aller à la page 1" À la page 1, qui pourrait être la feuille 7).

Pour ce qu'il vaut, je suis sur Windows, même si j'ai aussi accès aux Mac.

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

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

Il peut contenir des choses plus déroutantes, mais c'est la structure de base. Il n'y a qu'un seul catalogue, donc dans un grand fichier, vous pouvez rechercher le noeud qui contient /Catalog . Maintenant, vous pouvez effectuer les modifications souhaitées en insérant l'entrée /PageLabels :

 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és indices de page . La page 1 a l'index 0 , page 2 l'index 1 et ainsi de suite. Ils décrivent toujours les gammes, de sorte que 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 à la dernière page. Une étiquette pour 0 <<...>> doit toujours être définie.

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

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 me souviens bien que cela n'a pas fonctionné de façon fiable ou totale la dernière fois que j'ai essayé ceci (il y a environ 2 ans).

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