/*

   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

 */
package org.apache.batik.transcoder;

import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

import org.apache.batik.anim.dom.SVGDOMImplementation;
import org.apache.batik.svggen.SVGGraphics2D;
import org.apache.batik.transcoder.keys.BooleanKey;
import org.apache.batik.transcoder.keys.FloatKey;
import org.apache.batik.transcoder.keys.IntegerKey;
import org.apache.batik.util.Platform;
import org.apache.batik.util.SVGConstants;

import org.xml.sax.XMLFilter;

import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

This class allows to simplify the creation of a transcoder which transcodes to SVG content. To use this class, you just have to implement the transcode method of the AbstractTranscoder class : first get the associated Document from the TranscoderOutput : createDocument(TranscoderOutput), then create a new SVGGraphics2D with this Document
   Document doc = this.createDocument(output);
   svgGenerator = new SVGGraphics2D(doc);
 
Perform the effective transcoding, using the SVGGraphics2D previously created then call the writeSVGToOutput(SVGGraphics2D, Element, TranscoderOutput) to create the effective output file (if the output is set to be a File or URI)
   Element svgRoot = svgGenerator.getRoot();
   writeSVGToOutput(svgGenerator, svgRoot, output);
 

Several transcoding hints are defined for this abstract transcoder, but no default implementation is provided. Subclasses must implement which keys are relevant to them :

  • KEY_INPUT_WIDTH, KEY_INPUT_HEIGHT, KEY_XOFFSET, KEY_YOFFSET : this Integer keys allows to set the portion of the image to transcode, defined by the width, height, and offset of this portion in Metafile units.
  • KEY_ESCAPED : this Boolean ley allow to escape XML characters in the output
    transcoder.addTranscodingHint(ToSVGAbstractTranscoder.KEY_INPUT_WIDTH, Integer.valueOf(input_width));
 
KEY_WIDTH, KEY_HEIGHT : this Float values allows to force the width and height of the output:
    transcoder.addTranscodingHint(ToSVGAbstractTranscoder.KEY_WIDTH, Float.valueOf(width));
 
Version:$Id: ToSVGAbstractTranscoder.java 1831630 2018-05-15 12:56:55Z ssteiner $
/** This class allows to simplify the creation of a transcoder which transcodes to * SVG content. * To use this class, you just have to implement the <i>transcode</i> method of * the <i>AbstractTranscoder</i> class : * first get the associated Document from the <i>TranscoderOutput</i> : * {@link #createDocument(TranscoderOutput)}, then create a new * {@link org.apache.batik.svggen.SVGGraphics2D} with this Document * <pre> * Document doc = this.createDocument(output); * svgGenerator = new SVGGraphics2D(doc); * </pre> * Perform the effective transcoding, using the * {@link org.apache.batik.svggen.SVGGraphics2D} previously created * then call the * {@link #writeSVGToOutput(SVGGraphics2D, Element, TranscoderOutput)} to create the * effective output file (if the output is set to be a File or URI) * <pre> * Element svgRoot = svgGenerator.getRoot(); * writeSVGToOutput(svgGenerator, svgRoot, output); * </pre> * * <p>Several transcoding hints are defined for this abstract transcoder, but no default * implementation is provided. Subclasses must implement which keys are relevant to them :</p> * <ul> * <li>KEY_INPUT_WIDTH, KEY_INPUT_HEIGHT, KEY_XOFFSET, KEY_YOFFSET : this Integer keys allows to * set the portion of the image to transcode, defined by the width, height, and offset * of this portion in Metafile units.</li> * <li>KEY_ESCAPED : this Boolean ley allow to escape XML characters in the output</li> * </ul> * <pre> * transcoder.addTranscodingHint(ToSVGAbstractTranscoder.KEY_INPUT_WIDTH, Integer.valueOf(input_width)); * </pre> * * KEY_WIDTH, KEY_HEIGHT : this Float values allows to force the width and height of the output: * * <pre> * transcoder.addTranscodingHint(ToSVGAbstractTranscoder.KEY_WIDTH, Float.valueOf(width)); * </pre> * * @version $Id: ToSVGAbstractTranscoder.java 1831630 2018-05-15 12:56:55Z ssteiner $ */
public abstract class ToSVGAbstractTranscoder extends AbstractTranscoder implements SVGConstants { public static float PIXEL_TO_MILLIMETERS; public static float PIXEL_PER_INCH; static { PIXEL_TO_MILLIMETERS = 25.4f / Platform.getScreenResolution(); PIXEL_PER_INCH = Platform.getScreenResolution(); } public static final int TRANSCODER_ERROR_BASE = 0xff00; public static final int ERROR_NULL_INPUT = TRANSCODER_ERROR_BASE + 0; public static final int ERROR_INCOMPATIBLE_INPUT_TYPE = TRANSCODER_ERROR_BASE + 1; public static final int ERROR_INCOMPATIBLE_OUTPUT_TYPE = TRANSCODER_ERROR_BASE + 2; /* Keys definition : width value for the output (in pixels). */ public static final TranscodingHints.Key KEY_WIDTH = new FloatKey(); /* Keys definition : height value for the output (in pixels). */ public static final TranscodingHints.Key KEY_HEIGHT = new FloatKey(); /* Keys definition : width value for the input (in pixels). */ public static final TranscodingHints.Key KEY_INPUT_WIDTH = new IntegerKey(); /* Keys definition : height value for the input (in pixels). */ public static final TranscodingHints.Key KEY_INPUT_HEIGHT = new IntegerKey(); /* Keys definition : x offset value for the output (in pixels). */ public static final TranscodingHints.Key KEY_XOFFSET = new IntegerKey(); /* Keys definition : y offset value for the output (in pixels). */ public static final TranscodingHints.Key KEY_YOFFSET = new IntegerKey(); /* Keys definition : Define if the characters will be escaped in the output. */ public static final TranscodingHints.Key KEY_ESCAPED = new BooleanKey(); protected SVGGraphics2D svgGenerator;
Create an empty Document from a TranscoderOutput.
  • If the TranscoderOutput already contains an empty Document : returns this Document
  • else create a new empty DOM Document
/** Create an empty Document from a TranscoderOutput. * <ul> * <li>If the TranscoderOutput already contains an empty Document : returns this * Document</li> * <li>else create a new empty DOM Document</li> * </ul> */
protected Document createDocument(TranscoderOutput output) { // Use SVGGraphics2D to generate SVG content Document doc; if (output.getDocument() == null) { DOMImplementation domImpl = SVGDOMImplementation.getDOMImplementation(); doc = domImpl.createDocument(SVG_NAMESPACE_URI, SVG_SVG_TAG, null); } else { doc = output.getDocument(); } return doc; }
Get the SVGGraphics2D associated with this transcoder.
/** Get the {@link org.apache.batik.svggen.SVGGraphics2D} associated * with this transcoder. */
public SVGGraphics2D getGraphics2D() { return svgGenerator; }
Writes the SVG content held by the svgGenerator to the TranscoderOutput. This method does nothing if the output already contains a Document.
/** Writes the SVG content held by the svgGenerator to the * <code>TranscoderOutput</code>. This method does nothing if the output already * contains a Document. */
protected void writeSVGToOutput(SVGGraphics2D svgGenerator, Element svgRoot, TranscoderOutput output) throws TranscoderException { Document doc = output.getDocument(); if (doc != null) return; // XMLFilter XMLFilter xmlFilter = output.getXMLFilter(); if (xmlFilter != null) { handler.fatalError(new TranscoderException("" + ERROR_INCOMPATIBLE_OUTPUT_TYPE)); } try { boolean escaped = false; if (hints.containsKey(KEY_ESCAPED)) { escaped = (Boolean) hints.get(KEY_ESCAPED); } // Output stream OutputStream os = output.getOutputStream(); if (os != null) { svgGenerator.stream(svgRoot, new OutputStreamWriter(os), false, escaped); return; } // Writer Writer wr = output.getWriter(); if (wr != null) { svgGenerator.stream(svgRoot, wr, false, escaped); return; } // URI String uri = output.getURI(); if ( uri != null ){ try{ URL url = new URL(uri); URLConnection urlCnx = url.openConnection(); os = urlCnx.getOutputStream(); svgGenerator.stream(svgRoot, new OutputStreamWriter(os), false, escaped); return; } catch (MalformedURLException e){ handler.fatalError(new TranscoderException(e)); } catch (IOException e){ handler.fatalError(new TranscoderException(e)); } } } catch(IOException e){ throw new TranscoderException(e); } throw new TranscoderException("" + ERROR_INCOMPATIBLE_OUTPUT_TYPE); } }