Package org.apache.fop.apps

Source Code of org.apache.fop.apps.PDFOutputHandler

/*
* $Id: PDFOutputHandler.java,v 1.7 2001/08/20 11:19:22 keiron Exp $
* Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
* For details on use and redistribution please refer to the
* LICENSE file included with these sources.
*/

package org.apache.fop.apps;

import org.xml.sax.*;
import com.jclark.xsl.sax.*;
import java.io.*;

// FOP
import org.apache.fop.fo.XTFOTreeBuilder;
import org.apache.fop.fo.XTElementMapping;
import org.apache.fop.layout.AreaTree;
import org.apache.fop.layout.FontInfo;
import org.apache.fop.render.Renderer;
import org.apache.fop.messaging.MessageHandler;

// ////////////////////////////////////////////////////////////////////////////////////

/**
* A DocumentHandler that writes a PDF representation to an OutputStream.
*
* Use with James Clark's XT. Just put FOP on your class path and add
* <xsl:output method="fop:org.apache.fop.apps.PDFOutputHandler"
* xmlns:fop="http://www.jclark.com/xt/java"/>
* to your stylesheet. Now XT will automatically call FOP.
*
*/
public class PDFOutputHandler extends XTFOTreeBuilder
    implements OutputDocumentHandler {

    /**
     * the area tree that is the result of formatting the FO tree
     */
    protected AreaTree areaTree;

    /**
     * the renderer to use to output the area tree
     */
    protected Renderer renderer;

    /**
     * the PrintWriter to use to output the results of the renderer
     */
    protected PrintWriter writer;

    /**
     * the stream to use to output the results of the renderer
     */
    protected OutputStream stream;

    private boolean keepOpen;

    // ////////////////////////////////////////////////////////////////////////////////////

    /**
     */
    public PDFOutputHandler() {}

    // ////////////////////////////////////////////////////////////////////////////////////

    /**
     */
    public PDFOutputHandler(OutputStream out) {
        this();
        this.stream = out;
    }

    // ////////////////////////////////////////////////////////////////////////////////////

    /**
     */
    public DocumentHandler init(Destination dest,
                                AttributeList atts) throws IOException {
        this.stream = dest.getOutputStream("application/pdf", null);
        this.keepOpen = dest.keepOpen();

        String version = org.apache.fop.apps.Version.getVersion();
        setRenderer("org.apache.fop.render.pdf.PDFRenderer", version);
        addElementMapping("org.apache.fop.fo.StandardElementMapping");
        addElementMapping("org.apache.fop.svg.SVGElementMapping");
        return this;
    }

    // ////////////////////////////////////////////////////////////////////////////////////

    /**
     * set the class name of the Renderer to use as well as the
     * producer string for those renderers that can make use of it
     */
    public void setRenderer(String rendererClassName, String producer) {
        this.renderer = createRenderer(rendererClassName);
        this.renderer.setProducer(producer);
    }

    // ////////////////////////////////////////////////////////////////////////////////////

    /**
     * SAX passthrough, finish rendering the document
     */
    public void endDocument() throws SAXException {
        super.endDocument();

        try {
            doFormat();
            doRender();
        } catch (IOException io) {
            throw new SAXException(io);
        } catch (FOPException fop) {
            throw new SAXException(fop);
        }
        writer.flush();
    }

    // ////////////////////////////////////////////////////////////////////////////////////

    /**
     * format the formatting object tree into an area tree
     */
    public void doFormat() throws FOPException {
        FontInfo fontInfo = new FontInfo();
        this.renderer.setupFontInfo(fontInfo);

//        this.areaTree = new AreaTree();
        this.areaTree.setFontInfo(fontInfo);

        format(areaTree);
    }

    // ////////////////////////////////////////////////////////////////////////////////////

    /**
     * render the area tree to the output form
     */
    public void doRender() throws IOException, FOPException {
        //this.renderer.render(areaTree, this.stream);
    }

    // ////////////////////////////////////////////////////////////////////////////////////

    /**
     * add the given element mapping.
     *
     * an element mapping maps element names to Java classes
     */
    public void addElementMapping(XTElementMapping mapping) {
        mapping.addToBuilder(this);
    }

    // ////////////////////////////////////////////////////////////////////////////////////

    /**
     * add the element mapping with the given class name
     */
    public void addElementMapping(String mappingClassName) {
        createElementMapping(mappingClassName).addToBuilder(this);
    }

    // ////////////////////////////////////////////////////////////////////////////////////

    /**
     * protected method used by addElementMapping(String) to
     * instantiate element mapping class
     */
    protected XTElementMapping createElementMapping(String mappingClassName) {
        MessageHandler.logln("using element mapping " + mappingClassName);

        try {
            return (XTElementMapping)Class.forName(mappingClassName).newInstance();
        } catch (ClassNotFoundException e) {
            MessageHandler.errorln("Could not find " + mappingClassName);
        } catch (InstantiationException e) {
            MessageHandler.errorln("Could not instantiate "
                                   + mappingClassName);
        } catch (IllegalAccessException e) {
            MessageHandler.errorln("Could not access " + mappingClassName);
        } catch (ClassCastException e) {
            MessageHandler.errorln(mappingClassName
                                   + " is not an element mapping");
        }
        return null;
    }

    // ////////////////////////////////////////////////////////////////////////////////////

    /**
     * protected method used by setRenderer(String, String) to
     * instantiate the Renderer class
     */
    protected Renderer createRenderer(String rendererClassName) {
        MessageHandler.logln("using renderer " + rendererClassName);

        try {
            return (Renderer)Class.forName(rendererClassName).newInstance();
        } catch (ClassNotFoundException e) {
            MessageHandler.errorln("Could not find " + rendererClassName);
        } catch (InstantiationException e) {
            MessageHandler.errorln("Could not instantiate "
                                   + rendererClassName);
        } catch (IllegalAccessException e) {
            MessageHandler.errorln("Could not access " + rendererClassName);
        } catch (ClassCastException e) {
            MessageHandler.errorln(rendererClassName + " is not a renderer");
        }
        return null;
    }

}
TOP

Related Classes of org.apache.fop.apps.PDFOutputHandler

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.