blob: f72262dee9003d50d3075e813d7a55e8d2d33df0 [file] [log] [blame]
<?xml version="1.0"?>
<!DOCTYPE document SYSTEM "./dtd/document-v10.dtd">
<!--
Copyright 2001-2002 The Apache Software Foundation
Licensed 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.
-->
<!-- ========================================================================= -->
<!-- author tkormann@apache.org -->
<!-- version $Id$ -->
<!-- ========================================================================= -->
<document>
<header>
<title>How to create SVG using DOM</title>
<authors>
<person name="Thierry Kormann" email="tkormann@apache.org"/>
</authors>
</header>
<body>
<!-- ##################################################################### -->
<s1 title="Introduction">
<p>
The <link href="http://www.w3.org/dom/">Document Object Model</link> (DOM)
is an API for XML documents. It defines the logical structure of documents and
the way a document is accessed and manipulated. This paper shows how to create
an SVG document using the DOM API.
</p>
<ul>
<li><link href="#gettingStarted">Getting started</link></li>
<li><link href="#creating">Creating a Document</link></li>
<li><link href="#buildsvgdoc">Building an SVG Document</link></li>
<li><link href="#createdocfromsvgfile">Creating a Document from an SVG file</link></li>
<li><link href="#rendering">Rendering an SVG DOM</link></li>
</ul>
</s1>
<!-- ##################################################################### -->
<anchor id="gettingStarted"/>
<s1 title="Getting started">
<p>
The DOM API defines an interface called <code>DOMImplementation</code> which
represents the boostrap of any DOM implementation. The role of this class is to
bootstrap a particular implementation of the DOM by providing a method to create
a <code>Document</code>. Then, the concrete <code>Document</code> represents an
XML document and also acts like a factory for the various DOM objects such
<code>Element</code>, <code>Attr</code> or XML content.
</p>
<p>
How to get an instance of the <code>DOMImplementation</code> interface depends
on the DOM implementation you are using. In Batik, the DOM implementation is
located in the package <code>org.apache.batik.dom.svg</code> and the class is
named <code>SVGDOMImplementation</code>. The following example shows how to get
a concrete <code>DOMImplementation</code> object.
</p>
<source>
import org.w3c.dom.DOMImplementation;
import org.apache.batik.dom.svg.SVGDOMImplementation;
DOMImplementation impl = SVGDOMImplementation.getDOMImplementation();</source>
<p>
Once you have an instance of a <code>DOMImplementation</code>, you are not
relying on proprietary code anymore and ready to use the DOM API.
</p>
</s1>
<!-- ##################################################################### -->
<anchor id="creating"/>
<s1 title="Creating a Document">
<p>
Using the <code>DOMImplementation</code>, you are now able to create a
<code>Document</code>. The following example illustrates how to create an SVG
document. Note that the Batik's Document Object Model implementation can be
used to represent either an SVG document fragment or any kind of XML
document. The following code shows how to get a concrete <code>Document</code>
object using a <code>DOMImplementation</code>. Note that by choosing the
namespace URI and the local name of the root element of SVG, we are creating an
SVG document.
</p>
<source>
import org.apache.batik.dom.svg.SVGDOMImplementation;
import org.w3c.dom.Document;
DOMImplementation impl = SVGDOMImplementation.getDOMImplementation();
// we are using a constant available on the SVGDOMImplementation
// but we could have used "http://www.w3.org/2000/svg"
String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
<strong>Document doc = impl.createDocument(svgNS, "svg", null);</strong>
</source>
<p>
As we have created an SVG <code>Document</code>, we can cast this document to an
<code>SVGDocument</code> (defined in the <code>org.w3c.dom.svg</code> package)
if needed.
</p>
</s1>
<!-- ##################################################################### -->
<anchor id="buildsvgdoc"/>
<s1 title="Building an SVG Document">
<p>
Finally, using the <code>Document</code> object, we are now able to
construct SVG content. Note that the document created before supports both
generic XML and SVG. Though the DOM implementation of Batik is an SVG DOM
implementation, the SVG part is not fully implemented yet so only the DOM Level
2 core functions should be used. The following example shows how to create a red
rectangle located at (10, 20), with a size of (100, 50) placed in a (400, 450)
SVG canvas.
</p>
<source>
import org.apache.batik.dom.svg.SVGDOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
DOMImplementation impl = SVGDOMImplementation.getDOMImplementation();
String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
Document doc = impl.createDocument(svgNS, "svg", null);
// get the root element (the svg element)
<strong>Element svgRoot = doc.getDocumentElement();</strong>
// set the width and height attribute on the root svg element
<strong>svgRoot.setAttributeNS(null, "width", "400");</strong>
svgRoot.setAttributeNS(null, "height", "450");
// create the rectangle
<strong>Element rectangle = doc.createElementNS(svgNS, "rect");</strong>
rectangle.setAttributeNS(null, "x", "10");
rectangle.setAttributeNS(null, "y", "20");
rectangle.setAttributeNS(null, "width", "100");
rectangle.setAttributeNS(null, "height", "50");
rectangle.setAttributeNS(null, "style", "fill:red");
// attach the rectangle to the svg root element
<strong>svgRoot.appendChild(rectangle);</strong>
</source>
<p>
The example given has the following equivalent SVG.
</p>
<source>
&lt;svg width="400" height="450">
&lt;rect x="10" y="20" width="100" height="50" style="fill:red"/>
&lt;/svg>
</source>
</s1>
<!-- ##################################################################### -->
<anchor id="createdocfromsvgfile"/>
<s1 title="Creating a Document from an SVG file">
<p> With Batik, you can also create an SVG DOM tree from a URI, an
<code>InputStream</code>, or a <code>Reader</code> - using the
<code>SAXSVGDocumentFactory</code>. The following example illustrates how to
create an SVG document. Note that the Batik's Document Object Model
implementation can be used to represent either an SVG document fragment or any
kind of XML document. The following code shows how to get a concrete
<code>Document</code> object using the <code>SAXSVGDocumentFactory</code>.
</p>
<source>
import java.io.IOException;
import org.apache.batik.dom.svg.SAXSVGDocumentFactory;
import org.apache.batik.util.XMLResourceDescriptor;
import org.w3c.dom.Document;
try {
String parser = XMLResourceDescriptor.getXMLParserClassName();
SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parser);
String uri = "http://...";
<strong>Document doc = f.createDocument(uri);</strong>
} catch (IOException ex) {
// ...
}
</source>
<p>
As we have created an SVG <code>Document</code>, we can cast this document to an
<code>SVGDocument</code> (defined in the <code>org.w3c.dom.svg</code> package)
if needed.
</p>
</s1>
<!-- ##################################################################### -->
<anchor id="rendering"/>
<s1 title="Rendering an SVG DOM">
<p>
Batik provides several ways to use an SVG DOM tree. Two modules can be
immediately used to render your SVG document.
</p>
<dl>
<dt>JSVGCanvas</dt>
<dd>
The <code>JSVGCanvas</code> is a swing component that can display SVG
document. A SVG document can be specified using a URI or an SVG DOM tree (using
the <code>setSVGDocument</code> method). For futher informations about the
<code>JSVGCanvas</code>, see the <link href="svgcanvas.html">JSVGCanvas</link> tutorial.
</dd>
<dt>ImageTranscoder</dt>
<dd>
The <code>ImageTranscoder</code> is a transcoder which can take a URI, an
InputStream or an SVG DOM tree and produces a raster image (such JPEG, PNG or Tiff).
By creating a <code>TranscoderInput</code> with the SVG DOM tree, you will
be able to transform your SVG content to a raster image. For futher
informations, see the <link href="rasterizerTutorial.html">Transcoder</link>
tutorial.
</dd>
</dl>
</s1>
</body>
</document>