ottijp blog

PDFにページ番号を付けるスクリプト

2020-07-09 Tags: PDFpdftktex

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

結果

こんな感じで,ページ下部にページ番号が追加されます.

output

補足

作業用のディレクトリをuuidgenで生成したディレクトリ名にしているのは, Dockerのボリュームマウントがmktempで作成したtempディレクトリにはエラーが出てマウントできなかったためです.

問題

なぜか1ページ目だけ,2ページ目以降よりも,ページ番号がちょっと上に印字されてしまいます・・・(原因不明).

refs


ottijp
Satoshi SAKAO (@ottijp)

都内でアプリケーションエンジニアをしています

...