Apache FOPによるSVG→PDFへの変換方法
動作確認OSは、Solaris 9である。
概要
FOPを使うことで、XSL-FOに準拠したXML文書をPDFファイルなどのファイル形式に変換したり、コンピュータの画面やプリンタに直接出力することができる。
ここでは、Javaプログラムにおける、SVGファイルからPDFファイルへの変換方法について説明する。
インストールと設定
インストール
アーカイブを展開する。/home/apache/tools/[任意のディレクトリ] $ gzip -d fop-0.94-src.tar.gz $ tar xvf fop-0.94-src.tar
ライブラリのコンパイル
fop-0.94ディレクトリ下でantを実行し、ライブラリをコンパイルしておく。jarファイルは、buildディレクトリ下に作成される。Javaプログラムのコンパイル時に必要である。$ cd /home/apache/tools/fop-0.94 $ ant ↓jarファイル作成 /home/apache/tools/fop-0.94/build/*.jar
環境変数CLASSPATHの設定
jarファイルは、Javaプログラムの実行時に必要となる。環境変数CLASSPATHの設定に、jarの記述を追加する。.profileの場合 CLASSPATH=.:〜 :/home/apache/tools/fop-0.94/build/fop.jar :/home/apache/tools/fop-0.94/build/fop-transcoder-allinone.jar :/home/apache/tools/fop-0.94/build/fop-transcoder.jar .cshrcの場合 setenv CLASSPATH .:〜 :/home/apache/tools/fop-0.94/build/fop.jar :/home/apache/tools/fop-0.94/build/fop-transcoder-allinone.jar :/home/apache/tools/fop-0.94/build/fop-transcoder.jar
使用方法
Javaプログラム例題(SVG→PDFの変換)
- java実行時のオプション指定
javaプログラム実行時に下記のオプションを指定すること。これは、内部で使用しているbatikがGraphics2D(2Dグラフィックス用の標準Java API)にイメージの生成を要求しており、Graphics2DがX11サーバーを必要とすることに起因している。JDK 1.4以降では、java.awt.headlessプロパティにtrueをセットすることで、いわゆるheadless(画面を出さない)で実行できるようになる。
java -Djava.awt.headless=true
ソース /home/apache/tools/batik-1.7/sources-pdf/SVG2PDF.java コンパイル $ cd /home/apache/tools/batik-1.7/sources-pdf $ ant ↓ classファイルは、classesディレクトリ下に作成される classファイルは、実行用transディレクトリにコピーされる 実行 $ cd ../trans $ go.pdf (java -Djava.awt.headless=true SVG2PDF /home/apache/public_html/trans/GVT.svg /home/apache/public_html/trans/GVT.pdf) ↓ /home/apache/public_html/trans/GVT.pdf
//Java import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; //Batik import org.apache.batik.transcoder.Transcoder; import org.apache.batik.transcoder.TranscoderException; import org.apache.batik.transcoder.TranscoderInput; import org.apache.batik.transcoder.TranscoderOutput; //FOP import org.apache.fop.svg.PDFTranscoder; /** * This class demonstrates the conversion of an SVG file to PDF using FOP. */ public class SVG2PDF { public void convertSVG2PDF(File svg, File pdf) throws IOException, TranscoderException { //Create transcoder Transcoder transcoder = new PDFTranscoder(); //Setup input InputStream in = new java.io.FileInputStream(svg); try { TranscoderInput input = new TranscoderInput(in); //Setup output OutputStream out = new java.io.FileOutputStream(pdf); out = new java.io.BufferedOutputStream(out); try { TranscoderOutput output = new TranscoderOutput(out); //Do the transformation transcoder.transcode(input, output); } finally { in.close(); } } finally { in.close(); } } /** * Main method. * @param args command-line arguments */ public static void main(String[] args) { try { System.out.println("FOP SVG2PDF\n"); //Setup input and output files File svgfile = new File(args[0]); File pdffile = new File(args[1]); System.out.println("Input: SVG (" + svgfile + ")"); System.out.println("Output: PDF (" + pdffile + ")"); System.out.println(); System.out.println("Transforming..."); SVG2PDF app = new SVG2PDF(); app.convertSVG2PDF(svgfile, pdffile); System.out.println("Success!"); } catch (Exception e) { e.printStackTrace(System.err); System.exit(-1); } } }