FrameMaker に挿入した画像がリサイズされているかいないかをスクリプトでチェックする方法(途中)
FrameMaker 文書を RoboHelp に変換するときに、 FrameMaker 上の画像がリサイズした状態で挿入されていると たとえそれがEPSであったとしても、RoboHelpで変換後のヘルプの画像品質が 著しく落ちてしまう。
そこで、ヘルプ化するFrameMaker文書に挿入する画像はリサイズなしの100%原寸で 入れていただくよう事前に依頼していたのだが、案の定守られていない。
数100ページもあるマニュアル中のどこが100%で画像挿入されているかいないかの 調査&指示書をつくる必要があるのだが、手作業でチェックできない(する時間がない・予算もないし) ので機械的にスクリプトでチェックを試みました・・・という話。
このエントリーは書きかけです。 mif 中にある情報で、リサイズしていれているかどうか把握できると思っていたのですが、 ここに書いている方法で調べても、すべての画像ファイルが100%で入っているという結果しかでなかった。 どうやら、もとのEPSデータから画像サイズを計算して、mif上に記述されている サイズと比較する必要があるようです・・・
何をどうしたいのか
mif を調べてみると該当部分は以下のようなコードとして出力される。
<ImportObject
<Unique 1130488>
<Fill 7>
<RunaroundType Contour>
<ImportObFileDI `<c\>Parts_05<c\>5-B-PID15.png'>
<ImportObFile `Parts_05/5-B-PID15.png'>
<ImportHint `0001IMAGPNG WIN3 '>
<ImportObUpdater `PNG'>
<ShapeRect 0.35278 mm 0.35278 mm 91.71639 mm 27.6356 mm>
<BRect 0.35278 mm 0.35278 mm 91.71639 mm 27.6356 mm>
<BitMapDpi 96>
<FlipLR No>
> # end of ImportObject
ポイントはここ
<ShapeRect 0.35278 mm 0.35278 mm 91.71639 mm 27.6356 mm>
<BRect 0.35278 mm 0.35278 mm 91.71639 mm 27.6356 mm>
この部分が完全に一致している場合は100%らしい。 異なっていれば、100%で画像挿入されていないと判断できる(らしい)。
その1 illustChker.groovy
まずは、軽くテスト。
MIF上の ImportObject 記述部分だけを抜き出すコード。
package myg
import java.util.regex.*
ENC = 'UTF-8'
def cli = new CliBuilder()
cli.i(argName:'input', required:true ,args:1 , 'input file')
def options=cli.parse(args)
def inputf = new File(options.i)
def text = inputf.getText(ENC)
def regex = '<ImportObject.*?> # end of ImportObject'
def pat = Pattern.compile(regex,Pattern.DOTALL);
def m = pat.matcher(text);
def sb = new StringBuffer()
while( m.find() ){
def targetText = text.substring( m.start(),m.end() )
println '--------------------'
println targetText
}
実行
$ groovy illustChker foo.mif
とすると、ImportObject 部分を標準出力する。
(まだリサイズしているかどうかの判定はしていない。)
その2 illustChkerImproved.groovy
ImportObject 部分だけ出力できたので、 さらにそこから関心のある行だけを抽出してみる。
package myg
import java.util.regex.*
ENC = 'UTF-8'
def cli = new CliBuilder()
cli.i(argName:'input', required:true ,args:1 , 'input file')
def options=cli.parse(args)
def inputf = new File(options.i)
def text = inputf.getText(ENC)
def regex = '<ImportObject.*?> # end of ImportObject'
def pat = Pattern.compile(regex,Pattern.DOTALL);
def m = pat.matcher(text);
def 関心のある行だけを出力する = { line->
if( line =~ /ImportObFile / )
println line
if( line =~ /<ShapeRect/ )
println line
if( line =~ /<BRect/ )
println line
}
while( m.find() ){
def targetText = text.substring( m.start(),m.end() )
println '--------------------'
new StringReader( targetText ).eachLine( 関心のある行だけを出力する )
}
実行
$ groovy illustChkerImproved foo.mif
結果
--------------------
<ImportObFile `fig/1.eps'>
<ShapeRect 0.35278 mm 0.48401 mm 6.94638 mm 1.98543 mm>
<BRect 0.35278 mm 0.48401 mm 6.94638 mm 1.98543 mm>
--------------------
<ImportObFile `fig/2.eps'>
<ShapeRect 0.0 mm 0.0 mm 14.02294 mm 4.23334 mm>
<BRect 0.0 mm 0.0 mm 14.02294 mm 4.23334 mm>
あとは、ShapeRect と BRect の内容を比較すればOK...ゴールが近づいてきた。