Mon, March 9, 2009
テキストファイル中の文字列 png を eps に置き換えるコード
現在、DocBookデータを構造化FrameMakerに流し込む・・・という仕事をしているのだが、 そのとき、DocBookはoxygenで編集しているが、oxygenはepsデータを表示できないため、 いったん png に置き換えてDocBook作成作業をしている。
しかし、FrameMakerに取り込む段階になって、拡張子を eps に戻してやる必要がある。 sedとかawkなんかでごく簡単に処理できるのではないかと思いつつも、とりあえず慣れているJavaで 取り急ぎ変換コードを作成したので、メモしておきます。
ご注意
行単位で処理しているのですが、一行に2回以上置き換えの必要が生じる場合に、最初だけしか置き換えられません。 たぶん簡単に改良できるはずですが、いまのところ、そんな不具合あります。
png を eps に置き換えたい
DocBook中で以下のような記述になっている png ファイルの拡張子を...
<graphic fileref="fig/foo.png" />
以下のように、eps に置き換えたい。
<inlinegraphic fileref="fig/foo.eps" />
実際のところ SED を使って...
s/\.png"/.eps"/gで置き換えても実用上ほとんど問題ないとは思いますが。
コード
なるべく厳密に該当する png拡張子部分 にマッチするように、 以下のPatternオブジェクトの正規表現を実情に合わせて書き換える必要があります。
static private Pattern pat = Pattern.compile("(^.*fig.*)(png)(.*\".*$)");
PngToEps.java
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PngToEps {
static private String ENC="UTF-8";
//static private Pattern pat = Pattern.compile("(fig.*)(png)(.*\\/>)");
static private Pattern pat = Pattern.compile("(^.*fig.*)(png)(.*\".*$)");
private static String replace(String line){
String r=null;
Matcher m=pat.matcher(line);
if( m.find() ){
//System.out.println(line);
String g1=m.group(1);
String g2=m.group(2);
String g3=m.group(3);
//System.out.println(" --> "+g1+"eps"+g3);
r=g1+"eps"+g3;
}
else{
r=line;
}
return r;
}
public PngToEps(File inf,File outf){
super();
try{
PrintWriter pw=new PrintWriter(new OutputStreamWriter( new FileOutputStream(outf),ENC));
BufferedReader br=new BufferedReader( new InputStreamReader( new FileInputStream(inf),ENC ));
String line=null;
while( (line=br.readLine())!=null ){
line=replace(line);
pw.println(line);//sb.toString());
}
br.close();
pw.close();
}
catch(Exception ex){
ex.printStackTrace();
}
}
public static void main(String[] a) {
if(a.length==2){
File inf=new File(a[0]);
File outf=new File(a[1]);
new PngToEps(inf,outf);
}
}
}
実行方法
$ javac PngToEps.java
$ java PngToEps foo.xml result.xml