web-dev-qa-db-ja.com

Postscript / PDFにページ番号を追加する方法

Postscriptに大きなドキュメント(500ページ以上)があり、ページ番号を追加したい場合、誰かがこれを行う方法を知っていますか?

28
Brian M. Hunt

これは解決策かもしれません:

  1. ps2pdfを使用してポストスクリプトをPDFに変換します
  2. laTeXファイルを作成し、pdfpagesパッケージ(\includepdf)を使用してページを挿入します
  3. pagecommand={\thispagestyle{plain}}の引数に\includepdfまたはfancyhdrパッケージの何かを使用します
  4. ポストスクリプト出力が必要な場合は、pdf2psを介してpdflatex出力をポストスクリプトに変換し直します
13
rcs

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}
22
Brian M. Hunt

あなたは単に使用することができます

pspdftool

この方法では:

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

これらの2つの例を参照してください(番号なしおよび番号付きpdfとpspdftool)

番号なしpdf

http://ge.tt/7ctUFfj2

番号付きpdf

http://ge.tt/7ctUFfj2

これを最初のコマンドライン引数として:

number(start=1, size=40, x=297.5 pt, y=10 pt)
15
Dingo

私は、受け入れられた回答のように、ラテックスを使用して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
13
Dario Seidl

キャプテンコミックのソリューションに加えて、任意のページでのページ番号の開始をサポートするように拡張しました。

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ページからページ番号が始まります。表紙、タイトルページ、目次などがある場合に便利です。

残念なことに、enscriptの--footerオプションが壊れているため、このメソッドを使用して下部のページ番号を取得することはできません。

5
Bob

ああ、私がpostscriptを使用してから長い時間が経ちましたが、青い本をざっと見てみるとわかります:) www-cdf.fnal.gov/offline/PostScript/BLUEBOOK.PDF

一方、Adobe Acrobatと少しのjavascriptも不思議に思うでしょう;)

あるいは、私はこれを見つけました: http://www.ghostscript.com/pipermail/gs-devel/2005-May/006956.html 、これは法案に適合しているようです(私は試しませんでしたそれ)

2
brinxmat

pspdftoolman page )を使用するというアイデアが好きでしたが、私が求めていたのはpage x out of 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
Johnny Baloney

Pspdftoolを試しました( http://sourceforge.net/projects/pspdftool )。

最終的には機能するようになりましたが、最初は次のエラーが発生しました。

pspdftool: xreftable read error

ソースファイルはpdfjamのpdfjoinで作成され、EpsonWorkforceからのスキャンと生成されたタグページが含まれていました。外部参照テーブルを修正する方法がわからなかったので、pdf2psでpsに変換し、pdf2psでpdfに戻しました。次に、これを使用して、右下隅にある素敵なページ番号を取得できます。

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

残念ながら、これは、テキストがps変換でラスタライズされたため、テキストで検索可能なページが検索できなくなったことを意味します。幸いなことに、私の場合は問題ではありません。

検索可能なページを失うことなく、PDFファイルの外部参照テーブルを修正または空にする方法はありますか?

2
Mark Hedges

私は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
corpsman

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

入力によっては、ifブロックの最初/最後でgsave/grestoreを使用する必要がある場合があります。

1
Jakob

PSベースのソリューションをお探しだと思います。 PSには、これを可能にするページレベルの演算子はありません。各ページのPageSetupセクションにフッターを追加する必要があります。どんなスクリプト言語でもあなたを助けることができるはずです。

1
dirkgently

たぶんpstops( psutils の一部)をこれに使用できますか?

0
Filip Korling