2011-08-18 15 views
7

Ho circa 250 file PDF a pagina singola che hanno nomi come:che combina i file pdf con ghostscript, come includere i nomi dei file originali?

file_1_100.pdf, 
file_1_200.pdf, 
file_1_300.pdf, 
file_2_100.pdf, 
file_2_200.pdf, 
file_2_300.pdf, 
file_3_100.pdf, 
file_3_200.pdf, 
file_3_300.pdf 
...etc 

Sto usando il seguente comando per unirli in un unico file pdf:

gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=finished.pdf file*pdf 

Funziona perfettamente, combinando loro nell'ordine corretto. Tuttavia, quando guardo finished.pdf, voglio avere un riferimento che mi dice il nome file originale per ogni pagina.

Qualcuno ha qualche suggerimento? Posso aggiungere nomi di pagine che fanno riferimento ai file o qualcosa del genere?

+0

sceneggiatura Il Python qui sembra promettente: http://blog.tremily.us/posts/PDF_bookmarks_with_Ghostscript/ – Geremia

risposta

7

È abbastanza facile inserire i nomi dei file in un elenco di segnalibri che possono essere visualizzati da molti visualizzatori PDF.

Questo è fatto con PostScript utilizzando l'operatore di distiller 'pdfmark'. Ad esempio, utilizzare il seguente

gs -sDEVICE=pdfwrite -o finished.pdf control.ps 

dove control.ps contiene i comandi di PS per stampare le pagine e in uscita il segnalibro (/ OUT) pdfmarks:

(examples/tiger.eps) run [ /Page 1 /Title (tiger.eps) /OUT pdfmark 
(examples/colorcir.ps) run [ /Page 2 /Title (colorcir.ps) /OUT pdfmark 

Si noti che è anche possibile eseguire l'enumerazione utilizzando PS per automatizzare l'intero processo:

/PN 1 def 
(file*.pdf) { 
    /FN exch def 
    FN run 
    [ /Page PN /Title FN /OUT pdfmark % do the file and bookmark it by filename 
    /PN PN 1 add def % bump the page number 
} 1000 string filenameforall 

NB che l'ordine di filenameforall enumerazione non è specificato, quindi si consiglia di ordinare l'elenco di con trol l'ordine, usando l'estensione Ghostscript .sort (array lt .sort lt).

Anche dopo aver riflettuto su questo, ho anche capito che se un file di imput ha più di una pagina, c'è un modo migliore per impostare il segnalibro sul numero di pagina corretto usando la proprietà del dispositivo 'PageCount'.

[ 
    (file*.pdf) { dup length string copy } 1000 string filenameforall 
] % create array of filenames 
{ lt } .sort % sort in increasing alphabetic order 
/PN 1 def 
{ /FN exch def 
    /PN currentpagedevice /PageCount get 1 add def % get current page count done (next is one greater) 
    FN run [ /Page PN /Title FN /OUT pdfmark % do the file and bookmark it by filename 
} forall 

È possibile che questo crea un array di stringhe (copiandoli oggetti stringa univoca dal filenameforall solo sovrascrive la stringa è data), quindi ordina di esso, e, infine, elabora la matrice di stringhe usando l'operatore forall. Utilizzando la proprietà del dispositivo PageCount per ottenere il conteggio delle pagine già prodotte, il numero di pagina (PN) per il segnalibro sarà corretto. Ho testato questo frammento come "control.ps".

+1

Mi dispiace, ma questo è estremamente mal formulata. C'è qualche possibilità di ottenere qualche chiarimento su cosa siano 'tiger.eps' o' colorcir.ps' o cosa sia il '1000'? – puk

1

Per stampare il nome file su ciascuna pagina è possibile utilizzare una combinazione di ghostscript e pdftk. Tratto da https://superuser.com/questions/171790/print-pdf-file-with-file-path-in-footer

gs \ 
-o outdir\footer.pdf \ 
-sDEVICE=pdfwrite \ 
-c "5 5 moveto /Helvetica findfont 9 scalefont setfont (foobar-filename.pdf) show" 

pdftk \ 
foobar-filename.pdf \ 
stamp outdir\footer.pdf \ 
output outdir\merged_foobar-filename.pdf 
Problemi correlati