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

  • PDF変換プログラムの例題の実行

  • ソース
      /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);
            }
        }
    }