These search terms have been highlighted:[latex]
2010-01-21
作成時刻やバージョン情報を 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 を標準出力に,入力ファイルを標準入力にしてつなげるのがポイント).