eps を回転するコマンド

epsffit というコマンドを使えば,eps を回転できる.epsffit は少々使い勝手が悪いので,使いやすくするスクリプトを書いてみた.

epsffit は,次のようにすると,反時計周りに90度回転できる.

epsffit -r LLX LLY URX URY INPUT.eps OUTPUT.eps

ここで LLX LLY URX URY は bounding box (すべて整数値).

以下の点が使いにくい:

  • bounding box を手動で指定する必要がある.
  • 回転角が固定.

そこで,オリジナルの eps ファイルから bounding box を自動抽出し,90度刻みの任意の角に回転できるようにするスクリプトを書いた.

epsmanip

#!/bin/bash

function ask
{
  while true; do
    echo -n '  (y|n) > '
    read s
    if [ "$s" == "y" ];then return 0; fi
    if [ "$s" == "n" ];then return 1; fi
  done
}

infile=
outfile=
angle=0

while true; do
  case "$1" in
    -r|-rot)
      case "$2" in
	0)  angle=0 ;;
	90)  angle=1 ;;
	180)  angle=2 ;;
	270)  angle=3 ;;
	-90)  angle=3 ;;
	-180)  angle=2 ;;
	-270)  angle=1 ;;
	*)  echo "choose angle from {-270,-180,-90,0,90,180,270}"; exit 1 ;;
      esac
      shift 2 ;;
    '') shift; break ;;
    *)
      if [ -z "$infile" ];then  infile=$1
      elif [ -z "$outfile" ];then  outfile=$1
      else echo "too many options"; exit 1
      fi
      shift;;
  esac
done

if ! [ -f $infile ];then
  echo "input file does not exist: $infile"
  exit 1
fi
if [ -z "$outfile" ];then outfile=$infile; fi

bbox=`grep '%%BoundingBox' $infile | sed 's/.*BoundingBox\s*:\(\(\s[0-9]\+\)*\)/\1/g'`

cp $infile /tmp/epsmanip$$.1
for ((i=0;i<$angle;i+=1));do
  epsffit -r $bbox /tmp/epsmanip$$.1 /tmp/epsmanip$$.2
  mv /tmp/epsmanip$$.2 /tmp/epsmanip$$.1
done

if [ -f $outfile ];then
  echo "output file exists: $outfile"
  echo "overwrite?"
  if ! ask; then
    rm -f /tmp/epsmanip$$.1
    exit 1;
  fi
fi
mv /tmp/epsmanip$$.1 $outfile

例えば時計周りに90度回転するには,

epsmanip -r -90 INPUT.eps OUTPUT.eps

とする.

注意

参考記事