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}

### 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>
