2012-10-16 11 views
8

Vorrei esportare le etichette di pagina memorizzate in alcuni documenti PDF per semplificare l'analisi. So che potrei scavare nel documento PDF dopo averlo convertito con qpdf, ma questo sembra eccessivo.Esporta etichette di pagine PDF sulla riga di comando

Non esiste uno strumento della riga di comando che stamperà semplicemente l'etichetta della pagina per ogni pagina (o insieme ad altri metadati)? So che PDFSpy esporterà l'etichetta, ma $ 300 non è un'opzione, preferibilmente la soluzione dovrebbe essere libera.

risposta

10

Risposta breve:
Non sono a conoscenza di alcun (gratuito) strumento che può 'semplicemente stampare' l'etichetta di pagina per ogni pagina.

Inoltre, non sarà possibile eludere gli oggetti compressi di espansione e i flussi di oggetti, utilizzando uno strumento come qpdf o uno con funzionalità equivalenti.

Risposta lunga:
Non c'è nessuna tale strumento, perché queste sono le uniche alcune cose che si può tranquillamente fare affidamento su quando si tratta di etichette di pagina. Queste sono le seguenti:

  1. Ogni documento PDF deve contenere un oggetto radice.
  2. L'oggetto root deve essere di /Type /Catalog.
  3. Il trailer del documento mostra dove trovare l'oggetto utilizzando il tasto /Root seguito dal riferimento al numero di oggetto indiretto.
  4. IF un documento PDF utilizza etichette di pagina non standard, quindi la radice del documento oggetto must hanno una voce denominata /PageLabels.

Qui è dove si ferma per essere relativamente facile. Poiché l'oggetto a cui fa riferimento la chiave /PageLabels può essere contenuto in un oggetto compresso stream. Ciò significa che devi espandere quel flusso di oggetti.

Se davvero riuscito ad ottenere la descrizione delle etichette di pagina come ASCII, scoprirete che non è un elenco piatto facile da interpretare (come un dictionary è): si tratta di un albero numero di.

Non entrerò nei dettagli di queste complessità, perché ci vorrebbe un articolo molto lungo per descrivere tutte le possibili variazioni. È meglio leggerlo direttamente nello official ISO PDF-1.7 specification.

Ma invece io ti darò un esempio in codice ASCII PDF:

213 0 obj 
    << /Type /Catalog 
    /PageLabels 
     << 
      /Nums 
       [ 
        0 <<   % start labeling from page no. 1 
         /S /r  % label with lowercase roman numbers 
        >> 
        7 <<   % start new labeling from page no. 8 
         /S /D  % label with standard decimal numbers 
        >> 
        11 <<   % start labeling page no. 12 
         /S /D  % label with decimal numbers... 
         /P (ABCD-) % ...but using label prefix 'ABCD-'... 
         /St 3  % ...followed by '3' as the start decimal. 
        >> 
        ] 
     >> 
    %%........................... 
    %%...more root object keys... 
    %%........................... 
    >> 
endobj 

L'esempio precedente etichettare il numero di pagine 1, 2, 3, ... (ultimo) in questo modo:

i 
ii 
iii 
iv 
v 
vi 
1 
2 
3 
4 
ABCD-3 
ABCD-4 
ABCD-5 
ABCD-6 
...and so on until last page... 

Come si può vedere, il metodo PDF di pagine di etichettatura (numeri di pagina mappatura a nomi di pagina) è completamente non-intuitivo.Puoi capirlo solo studiando le specifiche PDF.

+0

Grazie per questo eccellente riassunto della situazione. Avevo scoperto la maggior parte di questo prima. Mi sono reso conto che sarebbe stato il mio mini-parser, o qualcun altro l'aveva già scritto (cosa che speravo). Sarei felice di calcolarli io stesso dalle informazioni nell'oggetto root, ma sfortunatamente, l'oggetto root non è sempre facile da trovare in una semplice implementazione jscript (che volevo usare). QPDF mi dà facilmente accesso agli oggetti di pagina, ma non c'è modo di chiedergli di restituire direttamente il trailer o l'oggetto root, quindi non c'è modo di sapere dove cercare il catalogo – grovel

+1

Ok, dopo aver scavato ulteriormente, ho in realtà ho trovato una soluzione piuttosto semplice: PDFtk (che avevo già visto prima, ma questa funzionalità è scarsamente documentata). – grovel

+8

'pdftk.exe document.pdf output dump_data report.txt' genererà un file txt che elenca non solo i meta-dati come i segnalibri, ma anche le etichette di pagina. Si sarà simile a questa: 'PageLabelNewIndex: 1 PageLabelStart: 1 PageLabelPrefix: C PageLabelNumStyle: DecimalArabicNumberals PageLabelNewIndex: 3 PageLabelStart: 1 PageLabelNumStyle: LowercaseRomanNumerals PageLabelNewIndex: 15 PageLabelStart: 1 PageLabelNumStyle: DecimalArabicNumerals' ie C1, C2, i, ii, ..., xiii, 1,2, ... Facile da analizzare, esattamente ciò di cui ho bisogno. @ Kurt, grazie comunque, molto apprezzato! – grovel

Problemi correlati