Если у вас есть большой документ (500 страниц +) в Postscript и вы хотите добавить номера страниц, кто-нибудь знает, как это сделать?
Как добавить номера страниц в Postscript/PDF
Ответ 1
Это может быть решение:
- конвертировать postscript в pdf с помощью
ps2pdf
- создайте файл LaTeX и вставьте страницы, используя пакет pdfpages (
\includepdf
) - используйте
pagecommand={\thispagestyle{plain}}
или что-то из пакета fancyhdr в аргументах\includepdf
- Если требуется вывод postscript, преобразуйте вывод pdflatex обратно в постскриптум через
pdf2ps
Ответ 2
Основываясь на предлагаемом решении 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}
Ответ 3
Вы можете просто использовать
pspdftool
в этом случае:
pspdftool 'number(x=-1pt,y=-1pt,start=1,size=10)' input.pdf output.pdf
см. эти два примера (ненумерованный и пронумерованный pdf с pspdftool)
ненумерованный pdf
пронумерованный pdf
с этим в качестве первого аргумента командной строки:
number(start=1, size=40, x=297.5 pt, y=10 pt)
Ответ 4
Раньше я добавлял номера страниц в мой pdf, используя латекс, как в принятом ответе.
Теперь я нашел более простой способ:
Используйте enscript
для создания пустых страниц с заголовком, содержащим номер страницы, а затем используйте pdftk
с опцией multistamp
, чтобы поместить заголовок в ваш файл.
Этот bash script ожидает, что файл 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
Ответ 5
В дополнение к капитантехническому решению я расширил его, чтобы поддерживать начало нумерации страниц на любой странице.
Требуется текст, 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 [email protected] --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. Полезно, если у вас есть обложки, титульные страницы и оглавление и т.д.
Несчастная вещь заключается в том, что опция enccript --footer нарушена, поэтому вы не можете получить нумерацию страниц внизу с помощью этого метода.
Ответ 6
О, это долгое время с тех пор, как я использовал постскриптум, но быстрое погружение в синюю книгу расскажет вам:) www-cdf.fnal.gov/offline/PostScript/BLUEBOOK.PDF
С другой стороны, Adobe Acrobat и немного javascript также будут творить чудеса;)
В качестве альтернативы я нашел следующее: http://www.ghostscript.com/pipermail/gs-devel/2005-May/006956.html, который, похоже, соответствует счету (я не пробовал)
Ответ 7
Я пробовал pspdftool (http://sourceforge.net/projects/pspdftool).
В конце концов я получил его на работу, но сначала я получил эту ошибку:
pspdftool: xreftable read error
Исходный файл был создан с pdfjoin из pdfjam и содержал кучу сканирований из моей рабочей силы Epson, а также сгенерировал теги. Я не мог найти способ исправить таблицу xref, поэтому я перешел на ps с pdf2ps и обратно в pdf с pdf2ps. Тогда я мог бы использовать это, чтобы получить хорошие номера страниц в правом нижнем углу:
pspdftool 'number(start=1, size=20, x=550 pt, y=10 pt)' input.pdf output.pdf
К сожалению, это означает, что любые страницы с поиском текста больше не доступны для поиска, потому что текст был растрирован в преобразовании ps. К счастью, в моем случае это не имеет значения.
Есть ли способ исправить или очистить таблицу xref файла pdf без потери того, какие страницы доступны для поиска?
Ответ 8
Мне понравилась идея использования pspdftool (человек страница), но то, что я получил, было страница 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;
Вот результат:
Ответ 9
Я предполагаю, что вы ищете решение на базе PS. В PS нет оператора уровня страницы, который позволит вам это сделать. Вам нужно добавить нижний колонтитул в разделе PageSetup
для каждой страницы. Любой скриптовый язык должен помочь вам.
Ответ 10
Я принял капитановое решение и добавил поддержку имен файлов, содержащих пробелы, а также дал дополнительную информацию о ходе
#!/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.
Ответ 11
Я написал следующий shell
script, чтобы решить это для стилей стиля LaTeX
beamer
, созданных с помощью inkscape
(I pdftk cat
слайды вместе в финальную презентацию PDF
, а затем добавьте номера слайдов используя script ниже):
#!/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
script читает 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
symlinks /bin/sh
до dash
, который по умолчанию переопределяет команду echo
внутренними интерпретационными последовательностями интерпретации оболочки и не предоставляет параметр -E
для переопределения этого поведения, Обратите внимание, что в качестве альтернативы вы можете избежать всех \
в шаблоне LaTeX как \\
.
изменить
Я заменил $(which echo)
на printf '%s'
, так как в zsh
, which echo
возвращает echo: shell built-in command
вместо /bin/echo
.
См. этот вопрос для деталей, почему я решил использовать printf
в конце.
Ответ 12
Я искал решение только для PostScript, используя ghostscript. Мне нужно было это объединить несколько PDF файлов и поставить счетчик на каждой странице. Единственным решением, которое я нашел, была старая публикация gs-devel, которую я сильно упростил:
%!PS
% add page numbers document bottom right (20 units spacing , harcoded below)
% Note: Page dimensions are expressed in units of the default user space (72nds of an inch).
% inspired by https://www.ghostscript.com/pipermail/gs-devel/2005-May/006956.html
globaldict /MyPageCount 1 put % initialize page counter
% executed at the end of each page. Before calling the procedure, the interpreter
% pushes two integers on the operand stack:
% 1. a count of previous showpage executions for this device
% 2. a reason code indicating the circumstances under which this call is being made:
% 0: During showpage or (LanguageLevel 3) copypage
% 1: During copypage (LanguageLevel 2 only)
% 2: At device deactivation
% The procedure must return a boolean value specifying whether to transmit the page image to the
% physical output device.
<< /EndPage {
exch pop % remove showpage counter (unused)
0 eq dup { % only run and return true for showpage
/Helvetica 12 selectfont % select font and size for following operations
MyPageCount =string cvs % get page counter as string
dup % need it twice (width determination and actual show)
stringwidth pop % get width of page counter string ...
currentpagedevice /PageSize get 0 get % get width from PageSize on stack
exch sub 20 sub % pagewidth - stringwidth - some extra space
20 moveto % move to calculated x and y=20 (0/0 is the bottom left corner)
show % finally show the page counter
globaldict /MyPageCount MyPageCount 1 add put % increment page counter
} if
} bind >> setpagedevice
Если вы сохраните это в файл с именем pagecount.ps
вы можете использовать его в командной строке следующим образом:
gs \
-dBATCH -dNOPAUSE \
-sDEVICE=pdfwrite -dPDFSETTINGS=/prepress \
-sOutputFile=/path/to/merged.pdf \
-f pagecount.ps -f input1.pdf -f input2.pdf
Обратите внимание, что pagecount.ps должен быть указан первым (технически, прямо перед входным файлом, с которого должен начинаться подсчет страниц).
Если вы не хотите использовать дополнительный файл .ps
, вы также можете использовать свернутую форму, например:
gs \
-dBATCH -dNOPAUSE \
-sDEVICE=pdfwrite -dPDFSETTINGS=/prepress \
-sOutputFile=/path/to/merged.pdf \
-c 'globaldict /MyPageCount 1 put << /EndPage {exch pop 0 eq dup {/Helvetica 12 selectfont MyPageCount =string cvs dup stringwidth pop currentpagedevice /PageSize get 0 get exch sub 20 sub 20 moveto show globaldict /MyPageCount MyPageCount 1 add put } if } bind >> setpagedevice'
-f input1.pdf -f input2.pdf
В зависимости от вашего ввода вам, возможно, придется использовать gsave
/grestore
в начале/конце блока if.
Ответ 13
Может быть, pstops (часть psutils) можно использовать для этого?