2009-10-21 150 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