Apache FOP – FOファイルをPDFファイルに変換するには


Apache FOPは、コマンドラインからも実行することが出来ますが、
今回は、Javaプログラムから呼び出し、FOファイルをPDFファイルに変換してみます。

PDFファイルに変換するFOファイル(SampleFO2PDF.fo)には、以下を使用します。

<?xml version="1.0" encoding="UTF-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
  <fo:layout-master-set>
    <fo:simple-page-master master-name="simpleA4" page-height="29.7cm" page-width="21cm" margin-top="2cm" margin-bottom="2cm" margin-left="2cm" margin-right="2cm">
      <fo:region-body/>
    </fo:simple-page-master>
  </fo:layout-master-set>
  <fo:page-sequence master-reference="simpleA4">
    <fo:flow flow-name="xsl-region-body">
      <fo:block>Hello World!</fo:block>
    </fo:flow>
  </fo:page-sequence>
</fo:root>

FOファイルをPDFファイルに変換するサンプルプログラムです。

package net.tk_factory.example.apache.fop;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.Source;
import javax.xml.transform.Result;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.sax.SAXResult;

import net.tk_factory.example.AbstractExample;

import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FOPException;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.apps.MimeConstants;
import org.apache.log4j.Logger;

/**
 * Apache FOPを使用したサンプルプログラムです。<br/>
 * <br/>
 * <b>内容</b>
 * <ol type="1">
 * <li>FOファイルをPDFファイルに変換します。</li>
 * </ol>
 * @author Takafumi Kondo (TK Factory)
 */
public class ExampleFO2PDF extends AbstractExample
{
    /** クラス名 */
    private static final String CLASS_NAME =
            ExampleFO2PDF.class.getSimpleName();

    /** ロガー */
    private static final Logger LOGGER =
            Logger.getLogger(ExampleFO2PDF.class.getName());

    /** FOファイル */
    private static final String FO_FILE_NAME =
            EXAMPLE_FILE_DIRECTORY + CLASS_NAME + ".fo";

    /** PDFファイル */
    private static final String PDF_FILE_NAME =
            EXAMPLE_FILE_DIRECTORY + CLASS_NAME + ".pdf";

    /**
     * ExampleFO2PDFオブジェクトを構築すると、
     * UnsupportedOperationExceptionがスローされます。<br/>
     */
    protected ExampleFO2PDF()
    {
        throw new UnsupportedOperationException();
    }

    /**
     * mainメソッドです。<br/>
     *
     * @param args 引数
     */
    public static void main(String[] args)
    {
        LOGGER.info("[START]" + CLASS_NAME);

        OutputStream out = null;

        try
        {
            //すでにPDFファイルが存在している場合は削除する
            deleteExistsFile(PDF_FILE_NAME);

            //出力するPDFファイル
            out = new FileOutputStream(PDF_FILE_NAME);

            //変換元のFOファイル
            Source fo = new StreamSource(FO_FILE_NAME);

            //FOPをセットアップする
            FopFactory fopFactory = FopFactory.newInstance();
            FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
            Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF,
                    foUserAgent,
                    out);

            //XSL FO⇒PDFに変換する
            Result result = new SAXResult(fop.getDefaultHandler());
            TransformerFactory factory = TransformerFactory.newInstance();
            Transformer transformer = factory.newTransformer();
            transformer.transform(fo, result);
        }
        catch (IOException ioex)
        {
            LOGGER.error(getStackTrace(ioex));
        }
        catch (FOPException fope)
        {
            LOGGER.error(getStackTrace(fope));
        }
        catch (TransformerConfigurationException tce)
        {
            LOGGER.error(getStackTrace(tce));
        }
        catch (TransformerException te)
        {
            LOGGER.error(getStackTrace(te));
        }
        finally
        {
            try
            {
                if (out != null)
                {
                    out.close();
                }
            }
            catch (IOException ioex)
            {
                LOGGER.error(getStackTrace(ioex));
            }

            LOGGER.info("[E N D]" + CLASS_NAME);
        }
    }
}

上記のサンプルプログラムを実行して生成されたPDFファイルを開くと、以下のような感じになります。
ExampleFO2PDF.pdf

参考

関連記事

  1. コメント 0

  1. トラックバック 0

return top