Title: Apache(tm) XML Graphics Project - for the creation and maintenance of software for the conversion of XML formats to graphical output

#Apache&trade; XML Graphics Project

The Apache XML Graphics Project is responsible for software licensed to the Apache Software Foundation intended for the creation & maintenance of:

- the conversion of XML formats to graphical output
- related software components

## Apache&trade; XML Graphics Project - Current Projects

The Apache&trade; XML Graphics Project currently consists of the following sub-projects, each focused on a different aspect of XML Graphics:

- [Apache Batik](/batik/) - A toolkit for Scalable Vector Graphics (SVG), based in Java
- [Apache FOP](/fop/) - A print formatter & renderer for XSL-FO (FO=formatting objects), based in Java
- [Apache XML Graphics Commons](/commons/) - A library with various components used by Apache Batik and Apache FOP, written in Java

# Apache&trade; Batik: a Java-based SVG toolkit

Batik is a Java(tm) technology based toolkit for applications or applets that want to use images in the [Scalable Vector Graphics (SVG)](http://www.w3.org/TR/SVG/) format for various purposes, such as viewing, generation or manipulation.

The project's ambition is to give developers a set of [core modules](http://xmlgraphics.apache.org/batik/using/architecture.html#coreComponents) which can be used together or individually to support specific SVG solutions. Here are some examples of [modules](http://xmlgraphics.apache.org/batik/architecture.html).

## Apache&trade; Batik Modules

- the [SVG Parser](/batik/architecture.html#lowLevelComponents)
- the [SVG Generator](/batik/svggen.html)
- the [SVG DOM](/batik/domapi.html)

Another ambition for the Batik project is to make it highly [extensible](/batik/extendingBatik.html) (for example, Batik allows the developer to handle custom SVG tags). Even though the goal of the project is to provide a set of core modules, one of the deliverables is a full fledged [SVG Browser](http://xmlgraphics.apache.org/batik/tools/browser.html) implementation, which validates the various modules and their inter-operability.

Find out more about [Apache Batik](/batik/).

# Apache FOP: a Java-based XSL-FO (Formatting Objects) processor

FOP (Formatting Objects Processor) is the world's first print formatter driven by [XSL formatting objects](http://www.w3.org/TR/xsl/) (XSL-FO) and the world's first output independent formatter. It is a Java application that reads a formatting object (FO) tree and renders the resulting pages to a specified output. The primary output target is PDF but there are other [output formats](/fop/output.html) currently supported.

##Apache&trade; FOP Output Formats

- PDF (Portable Document Format)
- PS (Adobe Postscript)
- PCL (Printer Control Language)
- AFP (MO:DCA)
- SVG (Scalable Vector Graphics)
- XML (area tree representation)
- Print
- AWT/Java2D
- MIF
- RTF (Rich Text Format)
- TXT (text)

Find out more about [Apache FOP](/fop/).

# Apache XML Graphics Commons

Apache XML Graphics Commons is a library that consists of several reusable components used by Apache Batik and Apache FOP. Many of these components can easily be used separately outside the domains of SVG and XSL-FO. You'll find components such as a PDF library, an RTF library, Graphics2D implementations that let you generate PDF and PostScript files and much more.

Apache XML Graphics Commons has only just started. It's in the process of being populated with components coming from Apache Batik and Apache FOP. Stay tuned for exciting treasures made available.

In the Wiki, we have a [plan for building Apache XML Graphics Commons](https://cwiki.apache.org/confluence/display/XMLGRAPHICS/XmlGraphicsCommonComponents). The plan will give you an idea of what you can expect to find here when we're finished migrating components.

Find out more about [Apache XML Graphics Commons](/commons/). (CMS)