PDFにページ番号を付けるスクリプト
HTMLで帳票を作ろうと試行錯誤しているのですが, HTML/CSS/JSだけでは,どうやってもChromeでのPDF印刷時にページ番号を付けることができなかったので, 一旦ページ番号なしで作成したPDFにページ番号を付番するためのスクリプトを書きました.
環境
- macOS: 10.15.3 (Catalina)
- pdftk: 2.02
- platex
- e-pTeX 3.1415926-p3.4-110825-2.6 (utf8.euc) (TeX Live 2013/Debian)
- kpathsea version 6.1.1
- ptexenc version 1.3.1
インストール
Texの環境構築が結構めんどうそうだったので,pdftkもplatexも公開されているDockerイメージを使いました. 以下のコマンドでpullできますが,スクリプトの初回実行時にpullされるので,やらなくてもよいです.
$ docker pull mnuessler/pdftk
$ docker pull sotetsuk/platex
スクリプト
こんなやつを作りました. platexでページ番号だけのPDFを作り,pdftkで対象PDFともどもページ単位に分割し,スタンプとして合成し,最後に1ファイルに結合しています.
add-pdf-page-number.sh
#!/bin/bash
if [ $# -lt 2 ] ; then
echo usage: $0 src.pdf dest.pdf
exit 1
fi
srcpdf="$1"
dstpdf="$2"
tempdir=$(uuidgen)
mkdir $tempdir
echo tempdir: $tempdir
cp "$srcpdf" numbers.template.tex $tempdir
cd $tempdir
pdfplatex="docker run --rm -v $PWD:/latex sotetsuk/platex build"
pdftk="docker run --rm -v $PWD:/work mnuessler/pdftk"
# devide original PDF
$pdftk "$srcpdf" burst output original_%04d.pdf
# create stamp PDF
pagecount=$(find . -name "original_*.pdf" | wc -l | tr -d " ")
sed 's/##pagecount##/'$pagecount'/' numbers.template.tex > numbers.tex
$pdfplatex numbers.tex
$pdftk numbers.pdf burst output number_%04d.pdf
# add page number
for i in $(seq -f %04g 1 $pagecount)
do
$pdftk original_$i.pdf stamp number_$i.pdf output original_numbered_$i.pdf
done
# combine numbered PDF
$pdftk original_numbered_????.pdf output "$dstpdf"
mv "$dstpdf" ..
# cleanup
cd ..
rm -r $tempdir
numbers.template.tex
\documentclass[12pt,a4paper]{article}
\usepackage[hmargin=.8cm,vmargin=1.5cm,nohead,nofoot]{geometry}
\usepackage{multido}
\usepackage{fancyhdr}
\usepackage{lastpage}
\pagestyle{fancy}
\fancyfoot[C]{page {\thepage} of \pageref{LastPage}}
\renewcommand{\headrulewidth}{0pt}
\begin{document}
\multido{}{##pagecount##}{\phantom{x}\newpage}
\end{document}
実行方法
元のPDFファイルパスと出力ファイルパスを指定して起動します. Dockerのボリュームマウントをカレントディレクトリにしているので,カレントディレクトリ以下のファイルしか指定できません.
$ ./add-pdf-page-number.sh input.pdf output.pdf
結果
こんな感じで,ページ下部にページ番号が追加されます.
補足
作業用のディレクトリをuuidgen
で生成したディレクトリ名にしているのは,
Dockerのボリュームマウントがmktemp
で作成したtempディレクトリにはエラーが出てマウントできなかったためです.
問題
なぜか1ページ目だけ,2ページ目以降よりも,ページ番号がちょっと上に印字されてしまいます・・・(原因不明).