Come modificare i numeri di pagina interni nei metadati di un PDF?


37

Ho un documento pdf che ho creato con mezzi non Acrobat (stampa in pdf, quindi unendo un sacco di pdf), ma vorrei cambiare manualmente i numeri di pagina (cioè le prime parecchie pagine sono semplicemente pagine del titolo, la pagina che è etichettato "pagina 1" è davvero il 7 ° foglio del pdf). Qual è il modo più semplice (e idealmente, gratuito) per farlo?

Per essere chiari, non sto cercando di cambiare i numeri sulle pagine stesse, ma i numeri di pagina nei "metadati" che i pdf memorizzano (le pagine stesse sono già numerate correttamente; voglio solo "vai a pagina 1" per andare alla pagina etichettata 1, che potrebbe essere il foglio 7).

Per quello che vale, sono su Windows, anche se ho accesso anche ai Mac.


Non sono sicuro di aver compreso completamente la tua descrizione + requisito. Potete fornire un collegamento a un PDF di esempio che si desidera modificare?
Kurt Pfeifle,

esiste uno strumento da riga di comando per farlo, ad esempio su un grande file pdf senza aprire effettivamente il file txt?
jj_p,

come ad esempio pdftk?
jj_p,

Risposte:


39

Quello che vuoi è in effetti chiamato etichette di pagina e può essere facilmente aggiunto direttamente nel codice sorgente del PDF. Rinominare l'estensione del file da pdfa txte aprire il file in un editor di testo (questo può essere lento, a seconda della dimensione del file, attendere). Le informazioni sulle etichette delle pagine sono memorizzate in un nodo chiamato catalogo documenti che assomiglia a questo:

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

Può contenere materiale più confuso, ma questa è la struttura di base. Esiste un solo catalogo, quindi in un file di grandi dimensioni è possibile cercare il nodo che contiene /Catalog. Ora puoi apportare le modifiche desiderate inserendo la /PageLabelsvoce:

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

Ci sono 3 righe che iniziano con i numeri, chiamati indici di pagina . La pagina 1 ha l'indice 0, la pagina 2 l'indice 1e così via. Descrivono sempre gli intervalli, quindi la riga con si 1 <<...>>applica a tutte le pagine dall'indice da 1 a 5 e la riga con si 6 <<...>>applica a tutte le pagine da 6 fino all'ultima pagina. Un'etichetta per 0 <<...>>deve essere sempre definita.

Puoi trovare ulteriori informazioni sulle etichette delle pagine e sul codice sorgente PDF nello standard PDF o in un wiki sugli standard PDF.


4
Meravigliosa! Questo è l'unico posto sul web in cui ho trovato informazioni così dirette e utili. Dopo tutto, non tutti abbiamo Acrobat Reader.
Noldorin,

3
Con esempio /St 8o /St 2, si imposta un punto iniziale per l'etichetta visualizzata; ma scegli un numero qualsiasi al posto di 8 (o 2), che deve essere> = 1. Ad esempio, 1 << /S /r /St 12 >>numererà le pagine da (effettivamente) 2-6 come (visualizzate) xii-xvii - perché '12' corrisponde a 'xii'.
n611x007,

1
grazie per la risposta, ma nella mia esperienza questo metodo a volte funziona e talvolta no; inoltre, mi è capitato di trovare più di un catalogo: come lo spieghi?
jj_p,

1
Ottima informazione Ecco un collegamento a un'altra fonte utile: specificare una numerazione delle pagine coerente per i documenti PDF dal W3C.
Adam Mackler,

2
Sei sicuro che funzioni così? Dall'esame del contenuto non elaborato di alcuni file PDF è sembrato che alcuni numeri indice indicassero le posizioni nel file dopo che il catalogo avrebbe dovuto essere aggiornato se la lunghezza del contenuto precedente cambia.
OR Mapper

6

Se ti capisco correttamente, ecco come dovrebbe funzionare:

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

Tuttavia, mi sembra di ricordare che questo non ha funzionato in modo affidabile o completo l'ultima volta che l'ho provato (circa 2 anni fa).

AGGIORNAMENTO: La mia memoria non mi stava deludendo. Ora ho riprovato e ho presentato una segnalazione di bug per Ghostscript ( bug 691889 ) a riguardo. Segui il link alla segnalazione di bug per vedere i dettagli.


5

NOTA 1: la risposta accettata è ancora per lo più corretta, ma presenta alcune lacune. Manca che molti file PDF non siano direttamente modificabili come testo. Anche quando lo sono, tale modifica a volte può danneggiare il PDF rendendolo illeggibile. Una soluzione che funzionerà sia per Unix che per Microsoft Windows è qpdf che può tradurre i file PDF in "QDF", un modulo modificabile dal testo che è ancora un file PDF valido. Il qpdfpacchetto viene fornito con il fix-qdfricalcolo degli offset dopo che un file QDF è stato modificato per correggere eventuali danni.

NOTA 2: a disagio con gli editor di testo? Prova a utilizzare prima un editor GUI come jpdftweak . A volte gli editor PDF della GUI funzionano, nel qual caso, sì, il gioco è fatto. Tuttavia, quando falliscono, come è stato spesso il caso per me, puoi provare questa alternativa più solida. Ad ogni modo, per favore non votare in basso la mia risposta per essere meno elegante.


COME MODIFICARE I NUMERI DI PAGINA PDF usando Qpdf

Sommario:

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

Passaggi dettagliati

Passo 1.

Converti il ​​documento nel formato QDF facilmente modificabile. Esegui qpdf dalla riga di comando in questo modo:

qpdf -qdf foo.pdf foo.qdf

Nota: se qpdf non è già installato, gli eseguibili di Microsoft Windows possono essere scaricati da https://github.com/qpdf/qpdf/releases sistemi Unix, come Ubuntu e Debian GNU / Linux, possono installarlo digitandoapt install qpdf .

Passo 2.

Modifica il documento QDF usando un editor di testo come notepad ++, emacs o gedit. Cerca la parola /Cataloge osserva le << parentesi angolari >> è all'interno. Nelle vicinanze, troverai l'attuale /PageLabels( se presente ).

Aggiungeremo ogni sezione che dovrebbe essere numerata in modo diverso al /PageLabels. Il formato è start-page<< style>>. Si noti che gli spazi bianchi non contano e che la prima pagina del documento è 0. Se non diversamente specificato, una nuova sezione inizia sempre numerando le pagine da 1.

Esempi

Ecco un esempio completo dell'aspetto di PageLabels, con l'aggiunta di commenti:

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

Se il file non ha PageLabels, aggiungerli dopo /Type /Catalog. Ad esempio, si potrebbe cambiare,

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

in,

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

OPZIONALE: A PARTIRE DA UN DIVERSO NUMERO CON /St

Ogni sezione riavvia la numerazione su 1, a meno che non venga indicato diversamente utilizzando /St. Notare come nell'esempio sopra, la quarta pagina inizia alle 15.

OPZIONALE: USARE UNO STILE DIVERSO CON /S

L' /Soperatore accetta un argomento che ti consente di scegliere lo stile di numerazione,

  • / Cifre D (1, 2, 3 ...)
  • / R maiuscolo romano (I, II, III ...)
  • / r minuscolo romano (i, ii, iii ...)
  • / A alfabetico maiuscolo (A, B, C, ...., X, Y, Z, AA, AB, AC, ...)
  • / a alfabetico minuscolo (a, b, c, ...., x, y, z, aa, ab, ac, ...)

Se si omette l' /Soperatore, quella sezione di pagine non avrà numerazione. Per esempio:

0 << >>         % No label for cover

OPZIONALE: AGGIUNTA DI UN PREFISSO A OGNI PAGINA CON /P

Puoi mostrare qualsiasi stringa di testo prima del numero di pagina specificando una parola tra parentesi dopo /P:

  31
  <<
    /S /D
    /P (A-)     % label appendix pages A-1, A-2, A-3
  >>

Se specifichi un prefisso senza uno stile ( /S), otterrai pagine che contengono solo la parola senza alcun numero. Questo può essere utile, ad esempio, se desideri che una copertina abbia semplicemente l'etichetta "Copertina".

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

Passaggio 3.

Esegui fix-qdfper rendere le tue modifiche PDF valide e metti l'output in bar.qdf.

fix-qdf foo.qdf > bar.qdf

Passaggio 4.

Apri bar.qdf nel tuo programma di visualizzazione PDF e verifica che sia numerato correttamente.

Passaggio 5.

Converti il ​​file QDF in un normale PDF, in questo modo:

qpdf bar.qdf bar.pdf

Ta da. Hai finito. Ora hai un documento con i numeri di pagina correttamente etichettati in bar.pdf.


4

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

Nel tuo caso chiama qualcosa del tipo:

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

Questo ha fatto il lavoro esattamente come mi serviva. Grazie!
Telotortium,

3

jPdf Tweak è un'utilità grafica Open Source che ti consente di modificare le etichette delle pagine in file PDF. La pagina della documentazione fornisce istruzioni dettagliate.


Ho usato questo per aggiungere le etichette della mia pagina personalizzata come formato "vuoto" con testo come prefisso. Ha funzionato bene!
Matt Sephton,

Questa è una risposta molto migliore rispetto alle cose di modifica del testo a mano
endolith

Aggiungi qui le istruzioni dettagliate invece di fare affidamento su un link esterno. Grazie!
hackerb9

1

Per rimuovere quelli vecchi, probabilmente il modo più semplice multipiattaforma è solo quello di ritagliare quelli vecchi. Puoi farlo, ad esempio, con BRISS.

Aggiungere i nuovi utilizzando strumenti gratuiti è più complicato. Personalmente probabilmente lo farei con pdflatex, come in questa risposta StackExchange , anche se potrebbe essere una soluzione piuttosto complicata a meno che tu non abbia altri usi per pdflatex.

Penso che possa essere fatto, tuttavia con jPdfTweak invece.


1

Il metodo fornito da Dane H. funziona con Acrobat Reader (o, per essere precisi, l'attuale versione di Adobe Reader). Un piccolo punto da notare: il campo in alto accetta solo 8 caratteri, quindi non puoi inserire qualcosa come 'indice soggetto' se una tale etichetta è stata utilizzata. Puoi invece utilizzare la voce di menu Visualizza> Navigazione pagina> Vai a ... o l'equivalente chiave.

Un altro suggerimento: le specifiche pdf assegnano sempre i numeri di pagina consecutivamente, quindi nel caso di un documento prodotto dalla scansione di coppie di pagine i due gruppi di numeri escono di passo (a meno che non si numerino laboriosamente ciascuna pagina singolarmente). Ma puoi facilmente impostare il tuo documento in modo che si applichi la convenzione "vai a pagina n ti porta alle pagine 2n e 2n + 1".


1

La risposta di Danes è la migliore, i formati sono cambiati un po 'ora, questo potrebbe essere 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

Ho scoperto che la modifica diretta del file (come non compresso da pdftk) non funziona se ci sono già '/ titoli' impostati nella regione '/ contorni'. La tecnica di modifica diretta descritta in un post sopra è dimostrata su Youtube: https://www.youtube.com/watch?v=zoH1Z_hSpak

Ma la funzione 'aggiornamento' di pdftk può essere più intuitiva (e più affidabile quando '/ titoli' esistono già nell'area '/ outlines' del file PDF) modificando il file 'doc_data.txt' usato qui: https: / /www.pdflabs.com/blog/export-and-import-pdf-bookmarks/


1
Ciao @Bob, le risposte solo link sono di bassa qualità. Saranno inutili se il sito target si sposta o scompare. Modifica la tua risposta e cita qui la parte pertinente della soluzione.
C0deDedalo

0

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

Puoi aggiungere / rimuovere / cambiare lo schema dei numeri di pagina interna nella scheda "pagine" di questo strumento freeware.

E attenzione, il visualizzatore di xchange PDF non mostra lo schema dei numeri di pagina e foxitreader ha un risultato giusto. Non ho testato il lettore Acrobat.

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.