2009-10-21 98 views
27

如果您在Postscript中有一个大文档(500页+)并且想要添加页码,是否有人知道如何操作?如何将页码添加到Postscript/PDF

+0

将[showpage]运算符重写为[本答案](http://stackoverflow.com/a/6620599/477035)中的本质上的[重复问题](http://stackoverflow.com/ q/4766755/477035) – RedGrittyBrick

+0

请参阅[Alan Munn在TeX SE上非常好的解决方案](https://tex.stackexchange.com/a/18762/3406)。 –

回答

13

这可能是一个解决方案:

    使用 ps2pdf
  1. 创建一个LaTeX文件,然后使用pdfpages包(\includepdf
  2. 使用pagecommand={\thispagestyle{plain}}或东西从fancyhdr包,如果的\includepdf
  3. 参数插入网页
  4. 转换后记为pdf需要postscript输出,通过pdf2ps
+0

我认为这是一个好主意,但是我没有得到它的工作。页码不会在\ includepdf页面上插入*。 –

+0

您是否使用过类似'\ includepdf [pages = - ,pagecommand = {\ thispagestyle {plain}}] {document.pdf}'? – rcs

+1

这实际上是Alan Munn在[他的解决方案](https://tex.stackexchange.com/a/18762/3406)中所做的,减去PS的东西。 –

0

也许pstops(psutils的一部分)可用于此?

+0

我花了不少时间在上面,似乎psutils不会这样做 - 除非我错过了一些东西。 –

2

哦,这是因为我使用后记很长一段时间,但快速下跌到蓝皮书会告诉你:) www-cdf.fnal.gov/offline/PostScript/BLUEBOOK.PDF

另另一方面,Adobe Acrobat和一个JavaScript代码也将做奇事。)

另外,我发现这一点:http://www.ghostscript.com/pipermail/gs-devel/2005-May/006956.html,这似乎符合这个要求(我没有尝试)

1

将pdflatex输出转换回postscript我假设你是寻找基于PS的解决方案。 PS中没有页面级别的操作符可以让您执行此操作。您需要在每个页面的PageSetup部分中添加一个页脚类的东西。任何脚本语言都应该能够帮助你。

+0

我在其他用户的http://www.osti.gov/bridge/product.biblio.jsp?query_id=0&page=0&osti_id=666084 –

21

基于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} 
12

我曾经使用乳胶像在接受的答案中添加页码到我的pdf。

现在,我发现了一个更简单的方法:使用 enscript创建包含页码头空页,然后用pdftkmultistamp选项把标题上您的文件。

这个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 
+1

警告中看到了使用Perl的解决方案:仅在build 1.43 pdftk具有* multistamp *功能之后 - 关于代码,我可以建议输出=“$ {1%03d.pdf} -header.pdf”以实现零均衡 – Dingo

+0

Multistamp非常棒。然而,Enscript对于这个用例并不是非常灵活 - 我试图让页码在页脚的中心位置,以及我想要的字体等等......我最终做的是用我的文字处理器创建1000页,自动生成行号在页脚中。然后,我只是将它放在我的文件上。 –

+0

它不适合我。 Bucle不会迭代,我尝试了hardcoding $ pagenum的值,但没有。 – xsubira

12

,你可以简单地使用

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) 
+0

这很好,但它打破了内部和外部链接 – jdewit

+1

说到断开的链接,这些示例.pdf超链接被打破。 – foobarbecue

+0

对不起,我会努力尽快更换 – Dingo

5

继captaincomic的解决方案,我已经扩展它支持页码的开始,在任何页面。

要求ENSCRIPT,PDFTK 1.43或更大和pdfjam(对于pdfjoin实用程序)在/usr/local/bin/pagestamp.sh

#!/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 

例如..地方这并执行这样的:

pagestamp.sh doc.pdf 3 

这将在第3页开始的页码..有用的,当你有罩层,扉页和目录等

不幸的是,ENSCRIPT的--footer选项打破了,所以你不能使用这种方法得到底部的页码。

1

我试过pspdftool(http://sourceforge.net/projects/pspdftool)。

我终于得到它的工作,但一开始我得到这个错误:

pspdftool: xreftable read error 

源文件与来自pdfjam pdfjoin创建,并为产生包含了一堆从我的爱普生劳动力扫描以及标签页。我找不到解决xref表的方法,所以我用pdf2ps转换为ps并用pdf2ps转换回pdf。然后,我可以使用它来在右下角得到很好的页码:

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

不幸的是,这意味着任何文本搜索的页面不再能够搜索,因为文本是在PS转换光栅化。幸运的是,就我而言并不重要。

有什么办法可以修复或清空pdf文件的外部参照表而不会丢失可搜索的页面吗?

1

我把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. 
1

我写了下面shell脚本来解决这个与inkscape生产LaTeXbeamer风格的幻灯片(我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,纸张大小&样式选项。

编辑: 我通过$(which echo)取代echo由于ubuntu符号链接到/bin/shdash它默认&不提供-E选项来覆盖此行为由壳内部口译转义序列覆盖echo命令。请注意,或者您可以在LaTeX模板中将所有\转义为\\

编辑: 我换成$(which echo)通过printf '%s'zshwhich echo回报echo: shell built-in command,而不是/bin/echo。 有关详细信息,请参阅this question为什么我最终决定使用printf

2

我喜欢使用pspdftoolman page)的想法,但我是什么后,页Y中取X格式和字体样式的页面的其余部分匹配。

要了解该文档中使用的字体名称:与几个pspdftool命令一起

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

胶水:

$ strings input.pdf | grep Font 

要获取的页数

$ 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