объединяя PDF-файлы с ghostscript, как включить оригинальные имена файлов? - PullRequest
8 голосов
/ 18 августа 2011

У меня есть около 250 одностраничных PDF-файлов с такими именами, как:

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

Я использую следующую команду для объединения их в один файл PDF:

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

Отлично работает, комбинируя их в правильном порядке. Тем не менее, когда я смотрю на Finished.pdf, я хочу иметь ссылку, которая говорит мне имя файла оригинала для каждой страницы.

У кого-нибудь есть предложения? Могу ли я добавить имена страниц, ссылающиеся на файлы или что-то в этом роде?

Ответы [ 2 ]

7 голосов
/ 19 августа 2011

Довольно легко поместить имена файлов в список закладок, которые могут отображать многие программы просмотра PDF.

Это делается с помощью PostScript с использованием оператора дистиллятора 'pdfmark'. Например, используйте следующее

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

где control.ps содержит команды PS для печати страниц и вывода закладки (/ OUT) pdfmarks:

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

Обратите внимание, что вы также можете выполнить перечисление с помощью PS для автоматизации всего процесса:

/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

Обратите внимание, что порядок перечисления filenameforall не указан, поэтому вы можете отсортировать список управлять порядком, используя расширение Ghostscript .sort (массив lt .sort lt).

Также подумав об этом, я также понял, что если файл импута содержит более одной страницы, есть лучший способ установить закладку на правильный номер страницы, используя свойство устройства 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

Приведенное выше создает массив строк (копирует их в уникальные строковые объекты, так как filenameforall просто перезаписывает полученную строку), затем сортирует ее и, наконец, обрабатывает массив строк используя оператор Forall. Используя свойство устройства PageCount для получения количества уже созданных страниц, номер страницы (PN) для закладки будет правильным. Я протестировал этот фрагмент как «control.ps».

1 голос
/ 17 ноября 2011

Для отметки имени файла на каждой странице вы можете использовать комбинацию ghostscript и pdftk.Взято из 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
...