Renuméroter les pages d'un PDF

25

Je souhaite modifier les métadonnées d'un PDF numérisé pour attribuer des numéros de page personnalisés à différentes pages. Par exemple, quelles sont maintenant les pages 1-3 que je pourrais vouloir appeler i, ii et iii, et quelles sont les pages 4-10, je veux appeler 1-7. Je ne pas souhaite modifier l'ordre réel des pages.

Existe-t-il A) un moyen de le faire en utilisant des outils gratuits; et B) Un moyen de le faire "en lot" (donc, sans avoir à renuméroter chaque page manuellement).

MarkovCh1
la source
1
Seriez-vous satisfait d'une solution basée sur LaTeX? Il serait possible d'inclure le PDF dans un document autrement vide et de créer les numéros de page PDF à votre guise.
Martin Scharrer
Je serais en effet satisfait d'une solution LaTeX. Pouvez-vous publier quelques détails ci-dessous?
MarkovCh1

Réponses:

22

Voici une solution basée sur LaTeX. Il utilise le pdfpagespackage pour inclure le PDF numérisé (appelé ici scan.pdf). Les étiquettes de page PDF que vous souhaitez peuvent être définies à l'aide du hyperrefpackage avec l' pdfpagelabelsoption activée. Il utilise la \thepagemacro normale comme une étiquette qui peut être définie pour les nombres romains en minuscules. Le compteur de pages est ensuite réinitialisé et remis à des nombres normaux.

\documentclass[a4paper]{article}% or use 'letterpaper'
\usepackage{pdfpages}
\usepackage[pdfpagelabels]{hyperref}
\begin{document}
% Set lower case roman numbers (\Roman would be upper case):
\renewcommand{\thepage}{\roman{page}}
\includepdf[pages=1-3]{scan.pdf}
% Back to normal (arabic) numbers:
\renewcommand{\thepage}{\arabic{page}}
% Reset page counter to 1:
\setcounter{page}{1}
\includepdf[pages=4-]{scan.pdf}
\end{document}

Placez le code ci-dessus dans un fichier (par exemple scan_mod.tex) et compilez-le avec pdflatex:

# pdflatex scan_mod

Cela produira scan_mod.pdf. Cependant, toutes les annotations spéciales incl. les hyperliens disparaîtront. Cela ne devrait pas poser de problème avec les PDF numérisés.

Si vous en avez besoin plus souvent, vous pouvez écrire un script qui accepte le nombre de pages numérotées romaines et le (s) nom (s) de fichier comme arguments et crée un fichier temporaire avec le code ci-dessus où le nom et les nombres sont des variables, qui est ensuite compilé.

Martin Scharrer
la source
Merci pour une réponse si complète! C'est une excellente solution. Les seules autres solutions que je connaissais incluaient .NET ou quelque chose d'aussi horrible, ou patauger dans des dialogues dans Adobe Acrobat (que je ne peux pas me permettre de toute façon). C'est même scriptable!
MarkovCh1
Bonne solution! Je m'interrogeais sur la même question de la génération par lots de signets / contours sur le panneau de gauche avec des hyperliens vers le début de chaque section / chapitre. Est-il également possible d'utiliser LaTex? Voici ma question askubuntu.com/questions/27312/bookmark-pdf-and-djvu-files . Merci!
Tim
2
@Tim: Vous pouvez créer des signets PDF avec LaTeX lors de la combinaison de PDF. Voir ma réponse à Comment utiliser LaTeX pour créer une table des matières (en-têtes de chapitre, sous-sections, etc.) pour un ensemble de fichiers pdf que je fusionne en un seul grand PDF? sur TeX.SX.
Martin Scharrer
Ceci est une réponse fantastique, je l'ai utilisé et cela fonctionne parfaitement.
Andrea Lazzarotto
1
@TiGR: Oui, c'est parce que les pages du PDF original sont ajoutées à un nouveau PDF et dans ce processus, les hyperliens et autres choses similaires sont supprimés (pour la sécurité si je me souviens bien). Parce que l'OP concernait un PDF numérisé, ce n'était pas un problème.
Martin Scharrer
10

Vous pouvez le faire avec un éditeur de texte.

Comme le dit la réponse, ouvrez un fichier PDF avec un éditeur de texte, recherchez une /Catalogentrée, puis ajoutez une entrée nommée /PageLabelscomme ceci:

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

Notez que les index de page (numéros de page physiques) commencent par 0.

Bien sûr, vous pouvez le faire automatiquement en utilisant des langages de script.

Normes PDF - Les étiquettes de page ont des spécifications détaillées.

Akihiro HARAI
la source
+1 Cette réponse est beaucoup plus simple et meilleure que celle acceptée, et le lien vers la spécification est d'une grande aide.
2016
6

jPDF Tweak est un utilitaire graphique Open Source qui offre la numérotation des pages (le terme correct est "étiquetage des pages") et de nombreuses autres fonctionnalités d'édition PDF de niveau débutant à avancé. Il fonctionne sur Ubuntu et d'autres systèmes d'exploitation.

La page Documentation fournit des instructions pas à pas.

CherryBerry
la source
Merci, c'est ce qui m'a vraiment aidé, en préservant les formes et tout. jPDF Tweak est une chose vraiment puissante, mais avec une interface pas très pratique.
TiGR
Si la question d'origine ne mentionnait pas les travaux par lots, je dirais que cette réponse mérite vraiment d'être acceptée.
Brian Z
4

Il existe un outil appelé PDF Mod qui est un outil gratuit pour réorganiser les pages d'un PDF.

Il peut être installé à partir du Centre logiciel Ubuntu dans Ubuntu 10.10 et supérieur.

Pour installer dans Ubuntu 9.10 ou 10.04:

Pour installer Ajoutez le ppa ppa:pdfmod-team/ppaà vos sources logicielles ( voici comment faire ) et installez pdfmod depuis le centre logiciel

Adapté de: http://www.webupd8.org/2011/03/edit-pdf-documents-in-linux-with-pdf.html

Bonne chance: D

Wilsonzaizai
la source
4
Ah, mais ma question ne demandait pas comment réorganiser les pages. Il s'agissait de changer les métadonnées des pages: réétiqueter les numéros de page (insérer des chiffres romains dans les premières pages, peut-être en sauter quelques-uns; les PDF prennent certainement en charge les premières).
MarkovCh1
3

Je viens de trouver un pointeur qu'il pourrait être possible d'utiliser ghostscriptpour cela, ici: pdftk - Ajouter et modifier des signets en pdf - Unix et Linux - Stack Exchange # 18600 ; il s'agit de liens:

Cependant, ce qui précède concerne les signets - pas la pagination logique. Il résulte de pdfmarkReference.pdf , la "commande" nécessaire est ' /Label' (ou ' /PAGELABEL') - et il se réfère en outre au chapitre 8.3.1 "Etiquettes de page" de PDFReference.pdf . Malheureusement, ce chapitre n'explique pas nécessairement comment les pdfmarks pourraient être utilisés avec les étiquettes de page - mais ce post fait:

Le pdfmark / PAGELABEL n'a pas de touche / Page, donc on ne peut définir le label que pour la page 'actuelle' (et, par conséquent, seulement pour une page à la fois). Puisque vous l'appelez au tout début, il est prévu de définir une étiquette pour la 1ère page et uniquement pour elle.

Plusieurs / PAGELABELs pour la même page: la référence pdfmark indique que la dernière prend effet, donc le résultat de votre 1ère ligne de commande est OK. Notez que la touche / Page est ignorée.

Comment définir des étiquettes de page à partir de PostScript? Je peux penser à 2 méthodes:

(A) La manière 100% documentée:

Émettez un / PAGELABEL dans le cadre de chaque page.

(B) La manière la moins documentée: ...

gswin32c -sDEVICE=pdfwrite -sOutputFile=50pages.pdf -dNOPAUSE

GS>[/_objdef {pl} /type /dict /OBJ pdfmark
GS>[{pl} <</Nums [0 <</P (Page ) /S /r /St 10>> 2 <<>>]>> /PUT pdfmark
GS>[{Catalog} <</PageLabels {pl}>> /PUT pdfmark
GS>50 { showpage } repeat
GS>quit

... et plus loin dans ce fil:

Quant à faire ce travail; comme le fichier d'origine est un fichier PDF, vous pouvez exécuter chaque page à partir du fichier individuellement. Vous pouvez donc définir le pdfmark PAGELABEL pour la page 1, exécuter la page 1 à partir du fichier d'origine, définir le PAGELABEL pour la page 2, exécuter la page 2 à partir du fichier d'origine, etc.

Étant donné que l'étiquette est (comme SaGS) dite appliquée à la page en cours, cela devrait correctement définir les étiquettes pour chaque page dans le fichier PDF de sortie. (mise en garde: je n'ai pas vraiment essayé cela)

EDIT: juste pour montrer ceci - si vous l'avez enregistré en tant que pdfmarksfichier:

[ /Label (-1) /PAGELABEL pdfmark
showpage
[ /Label (0) /PAGELABEL pdfmark
showpage
[ /Label (1) /PAGELABEL pdfmark
showpage

... et vous appelez:

gs -q -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=outfile.pdf infile.pdf pdfmarks

... alors vous obtiendrez trois pages vides ajoutées à la fin de infile.pdf, étiquetées -1, 0 et 1 :)

 

Eh bien, peut-être que cela aide parfois à obtenir un gsscript plus simple pour renuméroter les pages :) A
bientôt!

 

EDIT2: J'ai compris, je pense - utilisez la même gscommande que ci-dessus - et ci-dessous le contenu du pdfmarksscript, qui renumérotera le fichier infile.pdf, il commence donc par -1, 0, 1 ... Il s'agit essentiellement d'un exemple modifié de la référence PDF (voir les commentaires pour plus):

% Type name (Optional) The type of PDF object that this dictionary describes; if present, must be PageLabel for a page label dictionary.
% S name (Optional) The numbering style to be used for the numeric portion of each page label:
%       D Decimal arabic numerals
%       R Uppercase roman numerals
%       r Lowercase roman numerals
%       A Uppercase letters (A to Z for the first 26 pages, AA to ZZ for the next 26, and so on)
%       a Lowercase letters (a to z for the first 26 pages, aa to zz for the next 26, and so on)
% P text string (Optional) The label prefix for page labels in this range.
% St integer (Optional) The value of the numeric portion for the first page label in the range. Subsequent pages will be numbered sequentially from this value, which must be greater than or equal to 1. Default value: 1.

% renumber first 25 pages - push each by 10, and add prefix:
% [/_objdef {pl} /type /dict /OBJ pdfmark
% [{pl} <</Nums [0 <</P (Page ) /S /D /St 10>> 25 <<>>]>> /PUT pdfmark
% [{Catalog} <</PageLabels {pl}>> /PUT pdfmark

[/_objdef {pl} /type /dict /OBJ pdfmark
[{pl} <</Nums [ 0 << /P (-1) >>         % just label -1 (no style) for pg 0;
                1 << /P (0) >>          % just label  0 (no style) for pg 1;
                2 << /S /D /St 1 >>     % decimal style, start from 1, for pg2 and on.
                ]>> /PUT pdfmark
[{Catalog} <</PageLabels {pl}>> /PUT pdfmark
sdaau
la source
Génial! Merci, vous ne plaisantez pas :)
MarkovCh1
3

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

Dans votre cas, appelez:

./addpagelabels.py --delete file.pdf
./addpagelabels.py --startpage 1 --type 'roman lowercase' file.pdf
./addpagelabels.py --startpage 4 --type arabic file.pdf
DG »
la source
1
C'est une excellente solution!
mikemtnbikes
1
Cela fonctionne comme un charme, un énorme gain de temps aussi!
Bastian Il y a
1

Openoffice / Libreoffice peut faire l'affaire avec l'extension d'importation PDF et une macro de pagination.

Ce n'est pas une solution parfaite, mais cela fonctionne pour moi (à part l'utilisation de PDF Mod - que je suggérerais fortement).

RolandiXor
la source
L'extension pdf-import semble rompue pour OpenOffice.org 3.2. L'importation (dans Draw et Writer) donne une "erreur d'E / S".
MarkovCh1
0

Essayez pyPdf , une bibliothèque python pour manipuler des documents PDF. Une programmation, mais pas beaucoup, serait nécessaire.

Vous pouvez également jeter un œil à PDFtk , même si je n'ai pas vérifié s'il prend en charge la modification du numéro de page associé à des pages individuelles. Les deux sont disponibles sous forme de packages dans Ubuntu.

Loevborg
la source
1
Hm, PDFtk ne semble pas pouvoir le faire. pyPdf a de nombreuses méthodes pour extraire les métadonnées, mais ne semble pas pouvoir les réécrire dans le document.
MarkovCh1
0

Il existe une autre application appelée PDFEdit - hébergée sur la forge source. Page du projet Source Forge - Cependant, cela n'aide pas car il n'a pas les fonctionnalités dont vous avez besoin

Édition de texte dans PDFEdit

lazyPower
la source
1
Je ne pense pas que PDF Edit puisse changer les numéros de page. J'ai essayé et je n'ai pas réussi, en tout cas.
MarkovCh1
2
@Syzygy - en effet, juste vérifié: pdfeditpeut montrer Catalog/PageLabelsDict si un document en a un, mais s'il est sélectionné, il dit: " Ce dictionnaire n'a pas de propriétés directement modifiables " ... Bravo!
sdaau