2011-08-18 11 views
7

Tengo cerca de 250 de una sola página de archivos PDF que tienen nombres como:combinando archivos pdf con ghostscript, ¿cómo incluir nombres de archivos originales?

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 

que estoy usando el siguiente comando para combinarlos en un solo archivo PDF:

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

Funciona perfectamente, combinando ellos en el orden correcto. Sin embargo, cuando miro finished.pdf, quiero tener una referencia que me diga el nombre del archivo orignal para cada página.

¿Alguien tiene alguna sugerencia? ¿Puedo agregar nombres de página que hagan referencia a los archivos o algo así?

+0

El script de Python aquí parece prometedora: http://blog.tremily.us/posts/PDF_bookmarks_with_Ghostscript/ – Geremia

Respuesta

7

Es bastante fácil poner los nombres de los archivos en una lista de Marcadores que muchos lectores de PDF pueden visualizar.

Esto se hace con PostScript utilizando el operador de destilación 'pdfmark'. Por ejemplo, utilice el siguiente

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

donde control.ps contiene los comandos PS para imprimir las páginas de salida y el marcador (entrada/salida) pdfmarks:

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

en cuenta que también puede realizar mediante la enumeración PS para automatizar todo el proceso:

/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 que el orden de enumeración filenameforall no se especifica, por lo que es posible que desee ordenar la lista para con Controle el orden, usando la extensión .sort de Ghostscript (array lt .sort lt).

También después de pensar en esto, también me di cuenta de que si un archivo imput tiene más de una página, hay una mejor manera de establecer el marcador al número de página correcto usando la propiedad 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 

Lo anterior crea una matriz de cadenas (copiarlos en objetos de texto únicos ya filenameforall simplemente sobrescribe la cadena que se da), entonces lo ordena, y finalmente procesa la matriz de cadenas utilizando el operador forall. Al usar la propiedad del dispositivo PageCount para obtener el recuento de páginas ya producidas, el número de página (PN) para el marcador será correcto. He probado este fragmento como 'control.ps'.

+1

Lo siento mucho, pero esto está muy mal redactado. ¿Hay alguna posibilidad de que podamos obtener alguna aclaración sobre qué son 'tiger.eps' o' colorcir.ps' o para qué sirve el '1000'? – puk

1

Para marcar el nombre del archivo en cada página, puede usar una combinación de ghostscript y pdftk. Tomado de 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 
Cuestiones relacionadas