Как добавить номера страниц в Postscript / PDF - PullRequest
27 голосов
/ 22 октября 2009

Если у вас есть большой документ (500 страниц +) в Postscript и вы хотите добавить номера страниц, кто-нибудь знает, как это сделать?

Ответы [ 12 ]

22 голосов
/ 22 октября 2009

На основании предложенного решения rcs я сделал следующее:

Преобразовал документ в example.pdf и запустил pdflatex addpages, где addpages.tex читает:

\documentclass[8pt]{article}
\usepackage[final]{pdfpages}
\usepackage{fancyhdr}

\topmargin 70pt
\oddsidemargin 70pt

\pagestyle{fancy}
\rfoot{\Large\thepage}
\cfoot{}
\renewcommand {\headrulewidth}{0pt}
\renewcommand {\footrulewidth}{0pt}

\begin{document}
\includepdfset{pagecommand=\thispagestyle{fancy}}
\includepdf[fitpaper=true,scale=0.98,pages=-]{example.pdf}
% fitpaper & scale aren't always necessary - depends on the paper being submitted.
\end{document}

или, в качестве альтернативы, для двусторонних страниц (т. Е. С номером страницы последовательно снаружи):

\documentclass[8pt]{book}
\usepackage[final]{pdfpages}
\usepackage{fancyhdr}

\topmargin 70pt
\oddsidemargin 150pt
\evensidemargin -40pt

\pagestyle{fancy}
\fancyhead{} 
\fancyfoot{} 
\fancyfoot[LE,RO]{\Large\thepage}

\renewcommand{\headrulewidth}{0pt}
\renewcommand{\footrulewidth}{0pt}

\begin{document}
\includepdfset{pages=-,pagecommand=\thispagestyle{fancy}}
\includepdf{target.pdf}
\end{document}

Простой способ изменить поля заголовка:

% set margins for headers, won't shrink included pdfs
% you can remove the topmargin/oddsidemargin/evensidemargin lines
\usepackage[margin=1in,includehead,includefoot]{geometry}
15 голосов
/ 27 января 2012

Вы можете просто использовать

pspdftool

таким образом:

pspdftool 'number(x=-1pt,y=-1pt,start=1,size=10)' input.pdf output.pdf

см. Эти два примера (без номера и с номером pdf с pspdftool)

без номера pdf

http://ge.tt/7ctUFfj2

пронумеровано pdf

http://ge.tt/7ctUFfj2

с первым аргументом командной строки:

number(start=1, size=40, x=297.5 pt, y=10 pt)
13 голосов
/ 27 января 2012

Раньше я добавлял номера страниц в свой pdf, используя латекс, как в принятом ответе.

Теперь я нашел более простой способ: Используйте enscript для создания пустых страниц с заголовком, содержащим номер страницы, а затем используйте pdftk с опцией multistamp, чтобы поместить заголовок в ваш файл.

Этот bash-скрипт ожидает файл pdf как единственный параметр:

#!/bin/bash
input="$1"
output="${1%.pdf}-header.pdf"
pagenum=$(pdftk "$input" dump_data | grep "NumberOfPages" | cut -d":" -f2)
enscript -L1 --header='||Page $% of $=' --output - < <(for i in $(seq "$pagenum"); do echo; done) | ps2pdf - | pdftk "$input" multistamp - output $output
13 голосов
/ 22 октября 2009

Это может быть решением:

  1. конвертировать postscript в pdf используя ps2pdf
  2. создайте файл LaTeX и вставьте страницы, используя пакет pdfpages (\includepdf)
  3. используйте pagecommand={\thispagestyle{plain}} или что-то из пакета fancyhdr в аргументах \includepdf
  4. если требуется вывод postscript, преобразуйте вывод pdflatex обратно в postscript с помощью pdf2ps
5 голосов
/ 26 апреля 2012

В дополнение к решению captaincomic, я расширил его, чтобы поддержать запуск нумерации страниц на любой странице.

Требуется enscript, pdftk 1.43 или выше и pdfjam (для утилиты pdfjoin)

#!/bin/bash
input="$1"
count=$2
blank=$((count - 1))
output="${1%.pdf}-header.pdf"
pagenum=$(pdftk "$input" dump_data | grep "NumberOfPages" | cut -d":" -f2)
(for i in $(seq "$blank"); do echo; done) | enscript -L1 -B --output - | ps2pdf - > /tmp/pa$$.pdf
(for i in $(seq "$pagenum"); do echo; done) | enscript -a ${count}- -L1 -F Helvetica@10 --header='||Page $% of $=' --output - | ps2pdf - > /tmp/pb$$.pdf
pdfjoin --paper letter --outfile /tmp/join$$.pdf /tmp/pa$$.pdf /tmp/pb$$.pdf &>/dev/null
cat /tmp/join$$.pdf | pdftk "$input" multistamp - output "$output"
rm /tmp/pa$$.pdf
rm /tmp/pb$$.pdf
rm /tmp/join$$.pdf

Например .. поместите это в /usr/local/bin/pagestamp.sh и выполните как:

pagestamp.sh doc.pdf 3

Это запустит номер страницы на странице 3 ... полезно, когда у вас есть титульные листы, титульные страницы, оглавление и т. Д.

К сожалению, опция --footer в enscript не работает, поэтому вы не можете получить нумерацию страниц снизу, используя этот метод.

2 голосов
/ 26 января 2016

Мне понравилась идея использования pspdftool ( man page ), но после этого я получил страницу x из формата y и стиль шрифта, соответствующий остальная часть страницы.

Чтобы узнать об именах шрифтов, используемых в документе:

$ strings input.pdf | grep Font

Чтобы получить количество страниц:

$ pdfinfo input.pdf | grep "Pages:" | tr -s ' ' | cut -d" " -f2

Склейте его вместе с помощью нескольких pspdftool команд:

$ in=input.pdf; \
out=output.pdf; \
indent=30; \
pageNumberIndent=49; \
pageCountIndent=56; \
font=LiberationSerif-Italic; \
fontSize=9; \
bottomMargin=40; \
pageCount=`pdfinfo $in | grep "Pages:" | tr -s ' ' | cut -d" " -f2`; \
pspdftool "number(x=$pageNumberIndent pt, y=$bottomMargin pt, start=1, size=$fontSize, font=\"$font\")" $in tmp.pdf; \
pspdftool "text(x=$indent pt, y=$bottomMargin pt, size=$fontSize, font=\"$font\", text=\"page \")" tmp.pdf tmp.pdf; \
pspdftool "text(x=$pageCountIndent pt, y=$bottomMargin pt, size=$fontSize, font=\"$font\", text=\"out of $pageCount\")" tmp.pdf $out; \
rm tmp.pdf;

Вот результат:

enter image description here

2 голосов
/ 03 июня 2013

Я пробовал pspdftool (http://sourceforge.net/projects/pspdftool).

Я в конце концов заставил его работать, но сначала я получил эту ошибку:

pspdftool: xreftable read error

Исходный файл был создан с помощью pdfjoin из pdfjam и содержал кучу сканов с моей рабочей силы Epson, а также сгенерированные страницы тегов. Я не мог найти способ исправить таблицу внешних ссылок, поэтому я преобразовал в ps с pdf2ps и обратно в pdf с pdf2ps. Тогда я мог бы использовать это, чтобы получить хорошие номера страниц в правом нижнем углу:

pspdftool 'number(start=1, size=20, x=550 pt, y=10 pt)' input.pdf output.pdf

К сожалению, это означает, что любые текстовые страницы больше не доступны для поиска, потому что текст был растеризован при преобразовании ps. К счастью, в моем случае это не имеет значения.

Есть ли способ исправить или очистить таблицу внешних ссылок файла PDF, не теряя при этом страницы, доступные для поиска?

2 голосов
/ 22 октября 2009

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

С другой стороны, Adobe Acrobat и немного javascript тоже будут творить чудеса;)

В качестве альтернативы я нашел это: http://www.ghostscript.com/pipermail/gs-devel/2005-May/006956.html,, что, кажется, соответствует требованиям (я не пробовал)

1 голос
/ 06 июня 2015

Я написал следующий скрипт shell, чтобы решить эту проблему для слайдов в стиле LaTeX beamer, созданных с помощью inkscape (I pdftk cat слайды вместе в окончательную презентацию PDF, а затем добавьте номера слайдов, используя скрипт ниже):

#!/bin/sh

# create working directory
tmpdir=$(mktemp --directory)

# read un-numbered beamer slides PDF from STDIN & create temporary copy
cat > $tmpdir/input.pdf

# get total number of pages
pagenum=$(pdftk $tmpdir/input.pdf dump_data | awk '/NumberOfPages/{print $NF}')

# generate latex beamer document with the desired number of empty but numbered slides
printf '%s' '
\documentclass{beamer}
\usenavigationsymbolstemplate{}
\setbeamertemplate{footline}[frame number]
\usepackage{forloop}
\begin{document}
 \newcounter{thepage}
  \forloop{thepage}{0}{\value{thepage} < '$pagenum'}{
    \begin{frame}
    \end{frame}
  }
\end{document}
' > $tmpdir/numbers.tex

# compile latex file into PDF (2nd run needed for total number of pages) & redirect output to STDERR
pdflatex -output-directory=$tmpdir numbers.tex >&2 && pdflatex -output-directory=$tmpdir numbers.tex >&2

# add empty numbered PDF slides as background to (transparent background) input slides (page by
# page) & write results to STDOUT
pdftk $tmpdir/input.pdf multibackground $tmpdir/numbers.pdf output -

# remove temporary working directory with all intermediate files
rm -r $tmpdir >&2

Сценарий читает STDIN и записывает STDOUT печать диагностики pdflatex вывод на STDERR.

Так что просто скопируйте и вставьте приведенный выше код в текстовый файл, скажем enumerate_slides.sh, сделайте его исполняемым (chmod +x enumerate_slides.sh) и назовите его так:

./enumerate_slides.sh < input.pdf > output.pdf [2>/dev/null]

Должно быть легко настроить это для любого другого типа документа, настроив шаблон LaTeX для использования правильных documentclass, формата и стиля бумаги.

редактирование: Я заменил echo на $(which echo), поскольку в ubuntu символические ссылки /bin/sh на dash, которые переопределяют команду echo внутренней интерпретацией escape-последовательностей оболочки по умолчанию, и не предоставляют параметр -E для переопределения этого поведения , Обратите внимание, что в качестве альтернативы вы можете экранировать все \ в шаблоне LaTeX как \\.

редактирование: Я заменил $(which echo) на printf '%s', поскольку в zsh, which echo возвращает echo: shell built-in command вместо /bin/echo. См. этот вопрос , чтобы узнать, почему я решил использовать printf в конце.

1 голос
/ 08 мая 2015

Я воспользовался решением Captaincomic и добавил поддержку имен файлов, содержащих пробелы, а также предоставил дополнительную информацию о прогрессе

#!/bin/bash
clear
echo
echo This skript adds pagenumbers to a given .pdf file.
echo 
echo This skript needs the packages pdftk and enscript
echo if not installed the script will fail.
echo use the command sudo apt-get install pdftk enscript
echo to install.
echo 
input="$1"
output="${1%.pdf}-header.pdf"
echo input file is $input
echo output file will be $output
echo 
pagenum=$(pdftk "$input" dump_data | grep "NumberOfPages" | cut -d":" -f2)
enscript -L1 --header='||Page $% of $=' --output - < <(for i in $(seq "$pagenum"); do echo; done) | ps2pdf - | pdftk "$input" multistamp - output "$output"
echo done.
...