2011-08-18 10 views
7

Mam około 250 pojedynczych stron plików PDF, które mają nazwy takie jak:łączenie plików pdf z ghostscript, jak dołączyć oryginalne nazwy plików?

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 

Używam następujące polecenie, aby połączyć je w jednym pliku PDF:

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

działa idealnie, łącząc je we właściwej kolejności. Jednak, gdy patrzę na finished.pdf, chcę mieć odniesienie, które mówi mi orignal filename dla każdej strony.

Czy ktoś ma jakieś sugestie? Czy mogę dodać nazwy stron odnoszące się do plików lub coś takiego?

+0

pytona skryptu tutaj wydaje się obiecujące: http://blog.tremily.us/posts/PDF_bookmarks_with_Ghostscript/ – Geremia

Odpowiedz

7

Jest dość łatwo umieścić nazwy plików na liście zakładek, które mogą wyświetlać przeglądarki PDF.

Odbywa się to za pomocą PostScriptu przy użyciu operatora destylatora "pdfmark". Na przykład można użyć następujących

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

gdzie control.ps zawiera komendy PS, aby wydrukować strony i wyjście zakładka (/ Out) pdfmarks:

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

pamiętać, że można również wykonać za pomocą wyliczenie PS zautomatyzować cały proces:

/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 że kolejność filenameforall wyliczenie nie jest określona, ​​więc może chcesz, aby posortować listę con pilnuj porządku, używając rozszerzenia Ghostscript .sort (array lt .sort lt).

Również po przemyśleniu tego, zdałem sobie również sprawę, że jeśli plik imput ma więcej niż jedną stronę, istnieje lepszy sposób na ustawienie zakładki na prawidłowy numer strony za pomocą właściwości urządzenia "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 

Powyższy tworzy tablicę ciągów (kopiowanie ich do unikalnych przedmiotów łańcuchowych filenameforall prostu nadpisuje ciąg jest podany), a następnie sortuje je i wreszcie przetwarza tablicę ciągów pomocą operatora forall. Korzystając z właściwości urządzenia PageCount, aby uzyskać liczbę już wyprodukowanych stron, numer strony (PN) zakładki będzie prawidłowy. Przetestowałem ten fragment jako "control.ps".

+1

Bardzo mi przykro, ale to jest bardzo źle sformułowany. Czy jest jakaś szansa, aby uzyskać wyjaśnienie, czym są 'tiger.eps' lub' colorcir.ps' lub do czego służy '1000'? – puk

1

Aby nadpisać nazwę pliku na każdej stronie, można użyć kombinacji ghostscript i pdftk. Zrobione z 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