作成時刻やバージョン情報を PDF にスタンプする

作成時刻やバージョン情報を PDF にスタンプするためのスクリプトを作った. LaTeX とか pdftk を使う.

アウトライン

pdfstamp というスクリプト(以下にソース掲載)を使って,時刻やバージョンが刻印されたPDFを作る.このPDFと,スタンプしたいPDFを pdftk で重ねる.

pdfstamp

とりあえずソース
#!/bin/bash
usage="`basename $0` OPTIONS
  OPTIONS:
    -t TEXT
    -o OUTPUT_FILENAME
    [-m|-margin MARGIN](0.1cm)
    [-p|-pos lt|ct|rt|lb|cb|rb](rt)
    [-page PAGE_SIZE](a4j)
    [-f] : force overwrite
    [--] : terminate to parse option
    [-help] : show help"
#--------------------------------------------------

text=
output=
# margin='0.5cm'
margin='0.1cm'
position='rt'
pagesize=a4j
force_overwrite=0

#--------------------------------------------------

while true; do
  case "$1" in
    -t) text="$2"; shift 2 ;;
    -o) output="$2"; shift 2 ;;
    -m|-margin) margin="$2"; shift 2 ;;
    -p|-pos) position=$2; shift 2 ;;
    -page) pagesize=$2; shift 2 ;;
    -help|--help) echo "usage: $usage"; exit 0 ;;
    -f) force_overwrite=1; shift ;;
    ''|--) shift; break ;;
    *) echo "unexpected option '$1'" >&2
        echo ''
        echo "usage: $usage"
        exit 1 ;;
  esac
done

if [ -z "$output" ];then
  echo "error! specify the OUTPUT_FILENAME by -o XXX option."
  echo ''
  echo "usage: $usage"
  exit 1
fi

#--------------------------------------------------

mode=''
case $position in
  lt)
    header="
      \setlength{\headsep}{$margin}
      \setlength{\oddsidemargin}{$margin}
    "
    mode='flushleft'
    ;;
  ct)
    header="
      \setlength{\headsep}{$margin}
      \setlength{\textwidth}{\paperwidth}
    "
    mode='center'
    ;;
  rt)
    header="
      \setlength{\headsep}{$margin}
      \setlength{\textwidth}{\paperwidth-$margin}
    "
    mode='flushright'
    ;;
  lb)
    header="
      \setlength{\textheight}{\paperheight-$margin}
      \setlength{\oddsidemargin}{$margin}
    "
    topspace='\null\vfill'
    mode='flushleft'
    ;;
  cb)
    header="
      \setlength{\textheight}{\paperheight-$margin}
      \setlength{\textwidth}{\paperwidth}
    "
    topspace='\null\vfill'
    mode='center'
    ;;
  rb)
    header="
      \setlength{\textheight}{\paperheight-$margin}
      \setlength{\textwidth}{\paperwidth-$margin}
    "
    topspace='\null\vfill'
    mode='flushright'
    ;;
  *)
    echo "invalid position! : $position"
    echo ''
    echo "usage: $usage"
    exit 1
    ;;
esac

src="
\documentclass[10pt,$pagesize]{jarticle}
\usepackage{calc}
% vertical
\setlength{\topmargin}{0cm}
\setlength{\hoffset}{-1in}
\setlength{\voffset}{-1in}
\setlength{\headheight}{0cm}
\setlength{\footskip}{0cm}
\setlength{\headsep}{0cm}
% horizontal
\setlength{\oddsidemargin} {0cm}
\setlength{\evensidemargin}{0cm}
$header
\begin{document}
\pagestyle{empty}%{plain}
\begin{$mode}
$topspace
\texttt{$text}
\end{$mode}
\end{document}
"

tmpdir=/tmp/pdfstamp_pdf_$$
mkdir $tmpdir
cd $tmpdir
echo "$src" > pdfstamp.tex
platex pdfstamp.tex
dvipdfmx -o pdfstamp.pdf pdfstamp.dvi
cd -
if [ $force_overwrite -eq 1 ];then
  mv -v $tmpdir/pdfstamp.pdf $output
else
  mv -iv $tmpdir/pdfstamp.pdf $output
fi
rm -r $tmpdir
使い方
  pdfstamp -t 'てきすと' -o hoge.pdf

とすると,右上に「てきすと」と書かれた hoge.pdf ができる.

  pdfstamp -t 'てきすと' -p cb -o hoge.pdf

とすれば「てきすと」が中央下に移動.

  pdfstamp -t 'てきすと' -p lt -m 0.5cm -o hoge.pdf

とすれば,左上に広めのマージンで「てきすと」.

「てきすと」は LaTeX で記述できるので,

  pdfstamp -t "\begin{Large}Ver.3.2\end{Large}\\`date -R`" -p lt -m 0.5cm -o hoge.pdf

とすれば,左上に

  Ver.3.2
  Fri, 22 Jan 2010 03:29:53 +0900

と表示される.

ほかのオプションは

  pdfstamp -help

で.

pdftk でスタンプ

  pdftk origin.pdf stamp hoge.pdf output result.pdf

こんな感じで実行すると, origin.pdf に hoge.pdf をスタンプした result.pdf ができあがる.

応用へん

  origin=origin.pdf
  version=2
  revision=12
  paperid='\begin{large}Hatena\end{large}'
  tmpfile1=/tmp/hoge_version_$$.pdf
  tmpfile2=/tmp/hoge_date_$$.pdf
  tmpfile3=/tmp/hoge_pid_$$.pdf
  tmpfile4=/tmp/hoge_draft_$$.pdf
  pdfstamp -t "\begin{Large}ver. $version.$revision\end{Large}" -p rt -f -o $tmpfile1
  pdfstamp -t "`date -R`" -p ct -f -o $tmpfile2
  pdfstamp -t "$paperid" -p lt -f -o $tmpfile3
  pdftk $origin stamp $tmpfile1 output - \
      | pdftk - stamp $tmpfile2 output - \
      | pdftk - stamp $tmpfile3 output $tmpfile4
  mv -v $tmpfile4 hoge.pdf

こんな感じで組み合わせて使うことも可 (pdftk の output を標準出力に,入力ファイルを標準入力にしてつなげるのがポイント).