web-dev-qa-db-fra.com

Renuméroter les pages d'un PDF

Je souhaite modifier 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 appeler: i, ii et iii et les pages 4 à 10, je souhaite appeler les numéros 1 à 7. Je pas veux changer l'ordre actuel des pages.

Y a-t-il un moyen de le faire en utilisant des outils gratuits? et B) Une façon de faire cela "en batch" (donc, sans avoir à renuméroter chaque page manuellement).

24
MarkovCh1

Voici une solution basée sur LaTeX. Il utilise le package pdfpages pour inclure le fichier scanné PDF (appelé ici scan.pdf). Les étiquettes de page PDF que vous souhaitez peuvent être définies à l'aide du package hyperref avec l'option pdfpagelabels activée. Il utilise la macro normale \thepage en tant qu'étiquette pouvant être définie en minuscules chiffres romains. Le compteur de pages est ensuite réinitialisé et rétabli aux numéros 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 comme arguments le nombre de pages numérotées en chiffres romains et le nom du fichier, puis crée un fichier temporaire avec le code ci-dessus, dans lequel le nom et les nombres sont des variables, qui sont ensuite compilés.

22
Martin Scharrer

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 l'entrée /Catalog, puis ajoutez une entrée nommée /PageLabels comme 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 - Étiquettes de page a une spécification détaillée.

9
Akihiro HARAI

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

La page Documentation fournit des instructions pas à pas.

6
CherryBerry

Il existe un outil appelé PDF Mod, un outil gratuit permettant de réorganiser les pages d'un fichier PDF.

Il peut être installé à partir du Centre de 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 de logiciels ( voici comment procéder ) et installez pdfmod à partir du centre de logiciel

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

Bonne chance: D

4
Wilsonzaizai

Je viens de trouver un pointeur indiquant qu'il est possible d'utiliser ghostscript pour cela, ici: pdftk - Ajouter et modifier des signets au format PDF - Unix et Linux - Stack Exchange # 186 ; il fait référence à des liens:

Cependant, ce qui précède concerne les signets, mais pas la pagination logique. Il s’agit de pdfmarkReference.pdf , la "commande" nécessaire est "/Label" (ou "/PAGELABEL") - et fait également référence à PDFReference.pdf chapitre 8.3.1 "Étiquettes de page". Malheureusement, ce chapitre n'explique pas nécessairement comment pdfmarks peut être utilisé avec des étiquettes de page - mais ce post fait:

Le fichier/PAGELABEL pdfmark n’ayant pas de clé/page, vous ne pouvez définir le libellé que pour la page ‘en cours’ (et, par conséquent, pour une seule page à la fois). Comme 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 de pdfmark indique que la dernière prend effet, le résultat de votre 1ère ligne de commande est donc correct. Notez que la touche/page est ignorée.

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

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

Émettez un/PAGELABEL dans 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:

Pour faire ce travail; comme le fichier original est un fichier PDF, vous pouvez exécuter chaque page à partir du fichier individuellement. Vous pouvez ainsi définir le repère de 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.

Etant donné que l'étiquette est (comme SaGS) dit appliquée à la page en cours, cela devrait définir correctement les étiquettes pour chaque page du fichier de sortie PDF. (mise en garde: je n'ai pas réellement essayé cela)

EDIT: juste pour montrer ceci - si vous avez ceci enregistré comme fichier pdfmarks:

[ /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, intitulées -1, 0 et 1 :)

Eh bien, peut-être que cela vous aidera parfois à obtenir un script plus simple gs pour renuméroter des pages :)
À votre santé!

EDIT2: Compris, je pense - utilisez la même commande gs comme ci-dessus - et le contenu du script pdfmarks, qui renumérotera le fichier infile.pdf, commence donc par -1, 0, 1 ... C'est fondamentalement un fichier modifié exemple tiré de la référence PDF (voir les commentaires pour plus d'informations):

% 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
3
sdaau

Openoffice/Libreoffice peut faire l'affaire avec l'extension pdf-import et une macro de pagination.

Ce n’est pas une solution parfaite, mais cela fonctionne pour moi (mis à part l’utilisation de PDF Mod - que je recommanderais fortement).

1
RolandiXor

Il existe un petit script python pouvant 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
1
DG'

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

Text Editing in PDFEdit

0
lazyPower

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

Vous pouvez également consulter PDFtk , bien que je n’aie 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.

0
loevborg