Title: Apache(tm) XML Graphics Commons

#Apache&trade; XML Graphics Commons


## Overview { #Overview}

Apache&trade; XML Graphics Commons is a library that consists of several reusable components used by [Apache Batik](http://xmlgraphics.apache.org/batik/) and [Apache FOP](http://xmlgraphics.apache.org/fop/). Many of these components can easily be used separately outside the domains of SVG and XSL-FO. You will find components such as a PDF library, an RTF library, Graphics2D implementations that let you generate PDF & PostScript files, and much more.

The Apache&trade; XML Graphics Commons project is part of the [Apache&trade;](https://www.apache.org) Software Foundation, which is a wider community of users and developers of open source projects.

In the Wiki, we have a [Roadmap for Apache XML Graphics Commons](https://cwiki.apache.org/confluence/display/xmlgraphics/XmlGraphicsCommonComponents). This roadmap is the place to describe new ideas for the project.

## Features { #features}

Components which have been ported from [Apache Batik](/batik/) and [Apache FOP](/fop/) include:

| Description | Package | Provenance |
|-------------|---------|------------|
| Image codecs for PNG and TIFF | `org.apache.xmlgraphics.image.codec` | Batik |
| Bitmap image writer abstraction with implementation for the above codecs and for the Image I/O API. | `org.apache.xmlgraphics.image.writer` | [Batik](/batik/) |
| Java2D helper classes | `org.apache.xmlgraphics.image.rendered` and `org.apache.xmlgraphics.java2d` | [Batik](/batik/) |
| Image loader framework (format detection, conversion and unified handling for bitmap and vector images). | `org.apache.xmlgraphics.image.loader` | new |
| Graphics2D implementation that produces PostScript and EPS | `org.apache.xmlgraphics.java2d.ps` | [FOP](/fop/) |
| Helper classes for PostScript code production | `org.apache.xmlgraphics.ps` | [FOP](/fop/) |
| Parser/Processor for DSC-compliant PostScript files (DSC = [Document Structuring Conventions](http://partners.adobe.com/public/developer/en/ps/5001.DSC_Spec.pdf)) | `org.apache.xmlgraphics.ps.dsc` | new |
|  [XMP metadata](http://www.adobe.com/products/xmp/index.html) framework | `org.apache.xmlgraphics.xmp` | new |
| Various I/O classes, encoders and decoders for various formats | `org.apache.xmlgraphics.util.io` | [Batik](/batik/)/[FOP](/fop/) |

## News { #News}

### 20 Jan 2021: Version 2.6 Released
Minor changes to support FOP 2.6 release

### 5 Nov 2019: Version 2.4 Released
Minor changes to support FOP 2.4 release

### 23 May 2018: Version 2.3 Released
Minor changes to support FOP 2.3 release

### 24 Mar 2017: Version 2.2 Released
Minor changes to support FOP 2.2 release

### 14 Jan 2016: Version 2.1 Released
Minor changes to support FOP 2.1 release

### 3 Jun 2015: Version 2.0.1 Released
Minor changes to support FOP 2.0 release

### 3 Oct 2014: Version 2.0 Released
The main new feature is the introduction of a URI resolution framework that
makes it easier to control resource access in a cloud environment. Because of
changes to the API, the version number has been bumped to 2.0.

This release also contains a number of bug fixes.

### 20 Oct 2012: Version 1.5 Released { #news-2012-10-20}
<item date="2012-10-20" title="Version 1.5 Released">
This release consists primarily of bug fixes, improved code practices, and improved coverage of CCITTFax Group 3 image formats. For details, please see [Changes](changes.html#version_1.5).
</item>
### 2 Jul 2012: Version 1.5-RC1 Released { #news-2012-07-02}
<item date="2012-07-02" title="Version 1.5rc1 Available">
This is a candidate release for an upcoming Version 1.5 (stable) release, consisting primarily of bug fixes, improved code practices, and improved coverage of CCITTFax Group 3 image formats. For details, please see [Changes](changes.html#version_1.5rc1).
</item>
### 7 Jul 2010: Version 1.4 Released { #news-2010-07-07}
<item date="2010-07-07" title="Version 1.4 Released">
This release adds the option to generate smaller PostScript files, support for the AdobeStandardCyrillic encoding, RefinedImageFlavor, TexturePaint support for PSGraphics2D (PostScript tiling patterns), improvements to the XMP framework, optimization for PostScript state handling in (E)PSDocumentGraphics2D, and more. In addition it contains a number of bug fixes. For details, please see the [Changes](changes.html#version_1.4) page.

We are pleased to note that many new features were contributed from outside the team of committers. Such broader interest ensures the healthy further development of the project.
</item>
### 11 Jun 2008: Version 1.3.1 Released { #news-2008-06-11}
<item date="2008-06-11" title="Version 1.3.1 Released">
This release is mostly a bugfix release for the image loading framework that has been introduced in version 1.3. For details, please see the [Changes](changes.html#version_1.3.1) page.
</item>
### 7 Mar 2008: Version 1.3 Released { #news-2008-03-07}
<item date="2008-03-07" title="Version 1.3 Released">
The most important addition in this release is an image loading framework which supports all sorts of different image formats (bitmap and vector) and is highly extensible.

Besides that there were a larger number of smaller additions and bugfixes.

Support for Java 1.3 has been dropped. Java 1.4 or later is required now.
</item>
### 21 Jul 2007: Version 1.2 Released { #news-2007-07-21}
<item date="2007-07-21" title="Version 1.2 Released">
This release mainly adds support for CMYK and GRAY color spaces for PSGenerator. For details about other fixes, please see the [Changes](changes.html#version_1.2) page.
</item>
### 22 Dec 2006: Version 1.1 Released { #news-2006-12-22}
<item date="2006-12-22" title="Version 1.1 Released">
This release adds an XMP metadata framework and brings improvements for the ImageWriter package plus some minor fixes mainly in the PostScript area.
</item>
### 17 Apr 2006: Version 1.0 Released { #news-2006-04-17}
<item date="2006-04-17" title="Version 1.0 Released">
This is the first release of Apache XML Graphics Commons. There are currently no known issues with the code.
</item>
