Rinumerare le pagine di un PDF


25

Voglio modificare i metadati di un PDF scansionato per assegnare numeri di pagina personalizzati a pagine diverse. Ad esempio, quali sono le pagine 1-3 che potrei chiamare i, ii e iii, e quali sono le pagine 4-10, desidero chiamare 1-7. Io non voglio cambiare l'ordine attuale delle pagine.

Esiste A) Un modo per farlo usando tutti gli strumenti gratuiti; e B) Un modo per farlo "in batch" (quindi, senza dover rinumerare ogni pagina manualmente).


1
Saresti felice con una soluzione basata su LaTeX? Sarebbe possibile includere il PDF in un documento altrimenti vuoto e creare i numeri di pagina PDF come preferisci.
Martin Scharrer,

Sarei davvero felice con una soluzione LaTeX. Puoi pubblicare alcuni dettagli qui sotto?
MarkovCh1,

Risposte:


22

Ecco una soluzione basata su LaTeX. Utilizza il pdfpagespacchetto per includere il PDF scansionato (qui chiamato scan.pdf). Le etichette della pagina PDF desiderate possono essere impostate utilizzando il hyperrefpacchetto con l' pdfpagelabelsopzione abilitata. Usa la \thepagemacro normale come un'etichetta che può essere definita in numeri romani minuscoli. Il contatore delle pagine viene quindi ripristinato e riportato ai numeri normali.

\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}

Inserisci il codice sopra in un file (ad esempio scan_mod.tex) e compilarlo con pdflatex:

# pdflatex scan_mod

Questo produrrà scan_mod.pdf. Tuttavia eventuali annotazioni speciali incl. i collegamenti ipertestuali scompariranno. Questo non dovrebbe essere un problema con i PDF scansionati.

Se ne hai bisogno più spesso, potresti scrivere uno script che accetta il numero di pagine numerate romane e il nome del file come argomento e crea un file temporaneo con il codice sopra in cui il nome e i numeri sono variabili, che viene quindi compilato.


Grazie per una risposta così approfondita! Questa è un'ottima soluzione Le uniche altre soluzioni di cui ero a conoscenza includevano .NET o qualcosa di altrettanto orribile, o guadare attraverso le finestre di dialogo in Adobe Acrobat (che comunque non posso permettermi). Questo è persino scriptabile!
MarkovCh1

Bella soluzione! Mi chiedevo la stessa domanda sulla generazione in batch di segnalibri / contorni sul pannello di sinistra con collegamenti ipertestuali all'inizio di ogni sezione / capitolo. È possibile utilizzare anche LaTex? Ecco la mia domanda askubuntu.com/questions/27312/bookmark-pdf-and-djvu-files . Grazie!
Tim

2
@Tim: è possibile creare segnalibri PDF con LaTeX quando si combinano PDF. Vedi la mia risposta a Come posso usare LaTeX per creare un sommario (intestazioni di capitolo, sottosezioni ecc.) Per un set di file pdf che sto unendo in un unico grande PDF? su TeX.SX.
Martin Scharrer,

Questa è una risposta fantastica, l'ho usata e funziona perfettamente.
Andrea Lazzarotto,

1
@TiGR: Sì, è perché le pagine del PDF originale vengono aggiunte a un nuovo PDF e in questo processo i collegamenti ipertestuali e cose simili vengono scartati (per sicurezza, come ricordo). Poiché il PO riguardava i PDF scansionati, questo non era un problema.
Martin Scharrer,

10

Puoi farlo con un editor di testo.

Come dice la risposta, apri un file PDF con un editor di testo, cerca la /Catalogvoce, quindi aggiungi una voce chiamata in /PageLabelsquesto modo:

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

Si noti che gli indici di pagina (numeri di pagina fisici) iniziano con 0.

Di certo, puoi farlo automaticamente usando i linguaggi di scripting.

Standard PDF - Le etichette di pagina hanno specifiche dettagliate.


+1 Questa risposta è molto più semplice e migliore di quella accettata e il collegamento alle specifiche è di grande aiuto.
jja

6

jPDF Tweak è un'utilità grafica Open Source che offre la numerazione delle pagine (il termine corretto è "etichettatura delle pagine") e molte altre funzionalità avanzate di modifica di PDF per principianti. Funziona su Ubuntu e altri sistemi operativi.

La pagina della documentazione fornisce istruzioni dettagliate.


Grazie, questo è ciò che mi ha davvero aiutato, preservando le forme e tutto il resto. jPDF Tweak è una cosa davvero potente, sebbene con un'interfaccia non molto conveniente.
TiGR,

Se la domanda originale non menzionasse i lavori batch, direi che questa risposta merita davvero di essere accettata.
Brian Z

4

C'è uno strumento chiamato PDF Mod che è uno strumento gratuito per riorganizzare le pagine di un PDF.

Può essere installato da Ubuntu Software Center in Ubuntu 10.10 e versioni successive.

Per installare in Ubuntu 9.10 o 10.04:

Per installare Aggiungi il ppa ppa:pdfmod-team/ppaalle tue fonti di software ( Ecco come farlo ) e installa pdfmod dal centro software

Adattato da: http://www.webupd8.org/2011/03/edit-pdf-documents-in-linux-with-pdf.html

Buona fortuna: D


4
Ah, ma la mia domanda non mi chiedeva come riorganizzare le pagine. Doveva cambiare i metadati delle pagine: rietichettare i numeri di pagina (inserire numeri romani come prime pagine, forse saltarne alcuni; i PDF supportano sicuramente il primo).
MarkovCh1

3

Ho appena trovato un puntatore che potrebbe essere possibile utilizzare ghostscriptper questo, qui: pdftk - Aggiungi e modifica i segnalibri in pdf - Unix e Linux - Stack Exchange # 18600 ; si riferisce ai collegamenti:

Tuttavia, quanto sopra riguarda i segnalibri, non l'impaginazione logica. Risulta da pdfmarkReference.pdf , il "comando" necessario è ' /Label' (o ' /PAGELABEL') - e fa inoltre riferimento al capitolo 8.3.1 "Etichette di pagina" di PDFReference.pdf . Sfortunatamente, quel capitolo non spiega necessariamente come usare i pdfmarks con le etichette delle pagine - ma questo post fa:

Il pdfmark / PAGELABEL non ha alcun tasto / Page, quindi è possibile impostare l'etichetta solo per la pagina 'corrente' (e, di conseguenza, solo per una pagina alla volta). Dal momento che lo chiami all'inizio, si prevede di impostare un'etichetta per la prima pagina e solo per essa.

Più / PAGELABEL per la stessa pagina: il riferimento pdfmark indica che l'ultimo ha effetto, quindi il risultato della tua prima riga di comando è OK. Nota il tasto / Pagina viene ignorato.

Come impostare le etichette delle pagine da PostScript? Posso pensare a 2 metodi:

(A) Il modo documentato al 100%:

Emettere un / PAGELABEL come parte di ogni pagina.

(B) Il modo meno documentato: ...

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

... e oltre in quella discussione:

Quanto a farlo funzionare; poiché il file originale è un file PDF, è possibile eseguire ogni pagina dal file singolarmente. Quindi è possibile impostare il PAGELABEL pdfmark per la pagina 1, eseguire la pagina 1 dal file originale, impostare PAGELABEL per la pagina 2, eseguire la pagina 2 dal file originale e così via.

Poiché l'etichetta è (come SaGS) detta applicata alla pagina corrente, questo dovrebbe impostare correttamente le etichette per ogni pagina nel file PDF di output. (avvertenza: non l'ho ancora provato)

EDIT: solo per mostrarlo - se lo hai salvato come pdfmarksfile:

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

... e chiami:

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

... alla fine di tre pagine vuote verranno aggiunte, con l' infile.pdfetichetta -1, 0 e 1 :)

 

Bene, forse questo può aiutare qualche volta a ottenere uno gsscript più semplice per rinumerare le pagine :)
Saluti!

 

EDIT2: Capito, penso - usa lo stesso gscomando sopra - e sotto sono i contenuti dello pdfmarksscript, che rinumererà infile.pdf, quindi inizia con -1, 0, 1 ... È sostanzialmente un esempio modificato da il riferimento PDF (vedi commenti per ulteriori informazioni):

% 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

Grande! Grazie, non scherzare :)
MarkovCh1

3

C'è un piccolo script Python che può fare il lavoro: https://github.com/lovasoa/pagelabels-py

Nel tuo caso chiama:

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

1
Questa è un'ottima soluzione!
mikemtnbikes

1
Funziona come un incantesimo, anche con un enorme risparmio di tempo!
Bastian

1

Openoffice / Libreoffice può fare il trucco con l'estensione di importazione pdf e una macro di paginazione.

Non è una soluzione perfetta, ma funziona per me (a parte l'utilizzo di PDF Mod - che consiglio vivamente).


L'estensione di importazione pdf sembra essere stata eliminata per OpenOffice.org 3.2. L'importazione (in Draw and Writer) genera un "errore I / O".
MarkovCh1,

0

Prova pyPdf , una libreria python per manipolare documenti PDF. Sarebbe necessaria una certa programmazione, ma non molto.

Puoi anche dare un'occhiata a PDFtk , anche se non ho verificato se supporta la modifica del numero di pagina associato alle singole pagine. Entrambi sono disponibili come pacchetti in Ubuntu.


1
Hm, PDFtk non sembra essere in grado di farlo. pyPdf ha molti metodi per estrarre i metadati, ma non sembra essere in grado di riscriverli nel documento.
MarkovCh1,

0

C'è un'altra app là fuori chiamata PDFEdit - è ospitata su forge di origine. Pagina del progetto Source Forge - Tuttavia, questo non aiuta perché non ha le funzionalità richieste

Modifica del testo in PDFEdit


1
In realtà non penso che PDF Edit possa cambiare i numeri di pagina. Ho provato e non ci sono riuscito, in ogni caso.
MarkovCh1

2
@Syzygy - anzi, appena spuntato: pdfeditpuò mostrare Catalog/PageLabelsDict se un documento lo possiede, ma se è selezionato, dice: " Questo dizionario non ha proprietà direttamente modificabili " ... Cin cin!
sdaau,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.