JavaでWMFを出力

 高エネルギー物理学用のライブラリFreeHEPにベクトルグラフィクス用のコンポーネントがあり、これを利用するとJavaでWMF(ウィンドウズメタファイル)が出力できる。
 ちょっと、試してみた。
■準備
 FreeHEPの公式サイトから、FreeHEP VectorGraphicsをダウンロードして、クラスパスを設定。
ソースコード
 とりあえず、以下の様なプログラムを書いてみる。

package test;

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.AffineTransform;
import java.awt.geom.Line2D;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import org.freehep.graphics2d.VectorGraphics;
import org.freehep.graphicsio.emf.EMFGraphics2D;

public class WMFTest extends JPanel{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private List<Shape> sp;
	private boolean isPress=false;
	private Point pos0=null;
	private Point pos1=null;
	private BasicStroke stroke=new BasicStroke(2.0f);
	
	public WMFTest() {
		super();
		super.setOpaque(false);
		sp=new ArrayList<Shape>();
		MouseAdapter ma=new MouseAdapter(){
			@Override
			public void mouseDragged(MouseEvent e) {
				if(isPress){
					pos1=e.getPoint();
					updateUI();
				}
			}
			@Override
			public void mousePressed(MouseEvent e) {
				isPress=true;
				pos0=e.getPoint();
			}
			@Override
			public void mouseReleased(MouseEvent e) {
				isPress=false;
				if(pos0!=null&&pos1!=null){
					sp.add(new Line2D.Double(pos0.x,pos0.y,pos1.x,pos1.y));
				}
				pos0=null;
				pos1=null;
			}
			
		};
		addMouseListener(ma);
		addMouseMotionListener(ma);
	}

	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		Graphics2D g2=(Graphics2D)g;
		g2.setStroke(stroke);
		g2.setColor(Color.RED);
		for(int i=0;i<sp.size();i++){
			g2.draw(sp.get(i));
		}
		if(pos0!=null&&pos1!=null){
			g2.drawLine(pos0.x, pos0.y, pos1.x, pos1.y);
		}
	}
	
	void outputWMF(File f){
		Rectangle r=getBounds();
		try{
			VectorGraphics vg=new EMFGraphics2D(f,new Dimension((int)r.getWidth(),(int)r.getHeight()));
			vg.startExport();
			vg.setTransform(AffineTransform.getTranslateInstance(-r.getX(), -r.getY()));
			paintComponent(vg);
			vg.endExport();
		}catch(FileNotFoundException fe){}
	}
	
	public static void main(String[] args){
		JFrame f=new JFrame();
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.getContentPane().setBackground(Color.WHITE);
		f.getContentPane().setLayout(new BorderLayout());
		final WMFTest wt=new WMFTest();
		f.getContentPane().add(wt,BorderLayout.CENTER);
		JMenuBar bar=new JMenuBar();
		JMenu menu=new JMenu("File");
		bar.add(menu);
		JMenuItem out=new JMenuItem("Output WMF");
		menu.add(out);
		out.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent arg0) {
				JFileChooser chooser=new JFileChooser();
				int ret = chooser.showDialog(null, "ファイル選択");
				if (ret != JFileChooser.APPROVE_OPTION) {return;}
				File file=chooser.getSelectedFile();
				wt.outputWMF(file);
			}
		});
		f.setJMenuBar(bar);
		f.setSize(800, 600);
		f.setVisible(true);
	}
}

■結果
  WMFファイルが出力できた。