作成時刻やバージョン情報を 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 を標準出力に,入力ファイルを標準入力にしてつなげるのがポイント).