aboutsummaryrefslogtreecommitdiffstats
path: root/src/org/apache/fop/svg/PDFTranscoder.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/org/apache/fop/svg/PDFTranscoder.java')
-rw-r--r--src/org/apache/fop/svg/PDFTranscoder.java659
1 files changed, 659 insertions, 0 deletions
diff --git a/src/org/apache/fop/svg/PDFTranscoder.java b/src/org/apache/fop/svg/PDFTranscoder.java
new file mode 100644
index 000000000..fdf67007c
--- /dev/null
+++ b/src/org/apache/fop/svg/PDFTranscoder.java
@@ -0,0 +1,659 @@
+/*****************************************************************************
+ * Copyright (C) The Apache Software Foundation. All rights reserved. *
+ * ------------------------------------------------------------------------- *
+ * This software is published under the terms of the Apache Software License *
+ * version 1.1, a copy of which has been included with this distribution in *
+ * the LICENSE file. *
+ *****************************************************************************/
+
+package org.apache.fop.svg;
+
+import java.awt.AlphaComposite;
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.Graphics2D;
+import java.awt.Paint;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Shape;
+
+import java.awt.geom.AffineTransform;
+import java.awt.geom.Dimension2D;
+import java.awt.geom.Rectangle2D;
+import java.awt.image.BufferedImage;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.awt.geom.*;
+import java.awt.font.*;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.batik.transcoder.*;
+
+import org.apache.batik.bridge.BridgeContext;
+import org.apache.batik.bridge.BridgeException;
+import org.apache.batik.bridge.GVTBuilder;
+import org.apache.batik.bridge.UserAgent;
+import org.apache.batik.bridge.ViewBox;
+
+import org.apache.batik.dom.svg.DefaultSVGContext;
+import org.apache.batik.dom.svg.SAXSVGDocumentFactory;
+import org.apache.batik.dom.svg.SVGDOMImplementation;
+import org.apache.batik.dom.svg.SVGOMDocument;
+import org.apache.batik.dom.util.DocumentFactory;
+
+import org.apache.batik.ext.awt.image.GraphicsUtil;
+
+import org.apache.batik.gvt.GraphicsNode;
+import org.apache.batik.gvt.GraphicsNodeRenderContext;
+import org.apache.batik.gvt.event.EventDispatcher;
+import org.apache.batik.gvt.renderer.ImageRenderer;
+import org.apache.batik.gvt.renderer.ImageRendererFactory;
+
+import org.apache.batik.transcoder.TranscoderException;
+import org.apache.batik.transcoder.TranscoderOutput;
+import org.apache.batik.transcoder.TranscodingHints;
+import org.apache.batik.transcoder.XMLAbstractTranscoder;
+import org.apache.batik.transcoder.image.resources.Messages;
+
+import org.apache.batik.transcoder.keys.BooleanKey;
+import org.apache.batik.transcoder.keys.FloatKey;
+import org.apache.batik.transcoder.keys.LengthKey;
+import org.apache.batik.transcoder.keys.PaintKey;
+import org.apache.batik.transcoder.keys.PaintKey;
+import org.apache.batik.transcoder.keys.Rectangle2DKey;
+import org.apache.batik.transcoder.keys.StringKey;
+import org.apache.batik.transcoder.*;
+
+import org.apache.batik.util.SVGConstants;
+
+import org.apache.batik.bridge.*;
+import org.apache.batik.swing.svg.*;
+import org.apache.batik.swing.gvt.*;
+import org.apache.batik.gvt.*;
+import org.apache.batik.gvt.renderer.*;
+import org.apache.batik.gvt.filter.*;
+import org.apache.batik.gvt.event.*;
+
+import org.w3c.dom.*;
+import org.w3c.dom.svg.*;
+import org.w3c.dom.css.*;
+import org.w3c.dom.svg.SVGLength;
+
+import org.apache.fop.svg.*;
+
+import org.w3c.dom.DOMException;
+import org.w3c.dom.DOMImplementation;
+import org.w3c.dom.Document;
+import org.w3c.dom.svg.SVGAElement;
+import org.w3c.dom.svg.SVGDocument;
+import org.w3c.dom.svg.SVGSVGElement;
+
+// <!> FIXME : Those import clauses will change with new design
+import org.apache.batik.gvt.renderer.StaticRendererFactory;
+
+/**
+ * This class enables to transcode an input to an image of any format.
+ *
+ * <p>Two transcoding hints (<tt>KEY_WIDTH</tt> and
+ * <tt>KEY_HEIGHT</tt>) can be used to respectively specify the image
+ * width and the image height. If only one of these keys is specified,
+ * the transcoder preserves the aspect ratio of the original image.
+ *
+ * <p>The <tt>KEY_BACKGROUND_COLOR</tt> defines the background color
+ * to use for opaque image formats, or the background color that may
+ * be used for image formats that support alpha channel.
+ *
+ * <p>The <tt>KEY_AOI</tt> represents the area of interest to paint
+ * in device space.
+ *
+ * <p>Three additional transcoding hints that act on the SVG
+ * processor can be specified:
+ *
+ * <p><tt>KEY_LANGUAGE</tt> to set the default language to use (may be
+ * used by a &lt;switch> SVG element for example),
+ * <tt>KEY_USER_STYLESHEET_URI</tt> to fix the URI of a user
+ * stylesheet, and <tt>KEY_PIXEL_TO_MM</tt> to specify the pixel to
+ * millimeter conversion factor.
+ *
+ * @author <a href="mailto:Thierry.Kormann@sophia.inria.fr">Thierry Kormann</a>
+ * @version $Id$
+ */
+public class PDFTranscoder extends XMLAbstractTranscoder {
+
+ /** The user agent dedicated to an <tt>ImageTranscoder</tt>. */
+ protected UserAgent userAgent = new ImageTranscoderUserAgent();
+
+ /**
+ * Constructs a new <tt>ImageTranscoder</tt>.
+ */
+ public PDFTranscoder() {
+ hints.put(KEY_DOCUMENT_ELEMENT_NAMESPACE_URI,
+ SVGConstants.SVG_NAMESPACE_URI);
+ hints.put(KEY_DOCUMENT_ELEMENT,
+ SVGConstants.SVG_SVG_TAG);
+ hints.put(KEY_DOM_IMPLEMENTATION,
+ SVGDOMImplementation.getDOMImplementation());
+ }
+
+ /**
+ * Transcodes the specified Document as an image in the specified output.
+ *
+ * @param document the document to transcode
+ * @param uri the uri of the document or null if any
+ * @param output the ouput where to transcode
+ * @exception TranscoderException if an error occured while transcoding
+ */
+ protected void transcode(Document document,
+ String uri,
+ TranscoderOutput output)
+ throws TranscoderException {
+
+ if (!(document instanceof SVGOMDocument)) {
+ throw new TranscoderException(
+ Messages.formatMessage("notsvg", null));
+ }
+ SVGDocument svgDoc = (SVGDocument)document;
+ SVGSVGElement root = svgDoc.getRootElement();
+ // initialize the SVG document with the appropriate context
+ String parserClassname = (String)hints.get(KEY_XML_PARSER_CLASSNAME);
+ DefaultSVGContext svgCtx = new DefaultSVGContext();
+ svgCtx.setPixelToMM(userAgent.getPixelToMM());
+ ((SVGOMDocument)document).setSVGContext(svgCtx);
+
+ // build the GVT tree
+ GVTBuilder builder = new GVTBuilder();
+ ImageRendererFactory rendFactory = new StaticRendererFactory();
+ GraphicsNodeRenderContext rc = getRenderContext();
+ BridgeContext ctx = new BridgeContext(userAgent, rc);
+ GraphicsNode gvtRoot;
+ try {
+ gvtRoot = builder.build(ctx, svgDoc);
+ } catch (BridgeException ex) {
+ throw new TranscoderException(ex);
+ }
+ // get the 'width' and 'height' attributes of the SVG document
+ float docWidth = (float)ctx.getDocumentSize().getWidth();
+ float docHeight = (float)ctx.getDocumentSize().getHeight();
+ ctx = null;
+ builder = null;
+
+ // compute the image's width and height according the hints
+ float imgWidth = -1;
+ if (hints.containsKey(KEY_WIDTH)) {
+ imgWidth = ((Float)hints.get(KEY_WIDTH)).floatValue();
+ }
+ float imgHeight = -1;
+ if (hints.containsKey(KEY_HEIGHT)) {
+ imgHeight = ((Float)hints.get(KEY_HEIGHT)).floatValue();
+ }
+ float width, height;
+ if (imgWidth > 0 && imgHeight > 0) {
+ width = imgWidth;
+ height = imgHeight;
+ } else if (imgHeight > 0) {
+ width = (docWidth * imgHeight) / docHeight;
+ height = imgHeight;
+ } else if (imgWidth > 0) {
+ width = imgWidth;
+ height = (docHeight * imgWidth) / docWidth;
+ } else {
+ width = docWidth;
+ height = docHeight;
+ }
+ // compute the preserveAspectRatio matrix
+ AffineTransform Px;
+ String ref = null;
+ try {
+ ref = new URL(uri).getRef();
+ } catch (MalformedURLException ex) {
+ // nothing to do, catched previously
+ }
+
+ try {
+ Px = ViewBox.getViewTransform(ref, root, width, height);
+ } catch (BridgeException ex) {
+ throw new TranscoderException(ex);
+ }
+
+ if (Px.isIdentity() && (width != docWidth || height != docHeight)) {
+ // The document has no viewBox, we need to resize it by hand.
+ // we want to keep the document size ratio
+ float d = Math.max(docWidth, docHeight);
+ float dd = Math.max(width, height);
+ float scale = dd/d;
+ Px = AffineTransform.getScaleInstance(scale, scale);
+ }
+ // take the AOI into account if any
+ if (hints.containsKey(KEY_AOI)) {
+ Rectangle2D aoi = (Rectangle2D)hints.get(KEY_AOI);
+ // transform the AOI into the image's coordinate system
+ aoi = Px.createTransformedShape(aoi).getBounds2D();
+ AffineTransform Mx = new AffineTransform();
+ double sx = width / aoi.getWidth();
+ double sy = height / aoi.getHeight();
+ Mx.scale(sx, sy);
+ double tx = -aoi.getX();
+ double ty = -aoi.getY();
+ Mx.translate(tx, ty);
+ // take the AOI transformation matrix into account
+ // we apply first the preserveAspectRatio matrix
+ Px.preConcatenate(Mx);
+ }
+ // prepare the image to be painted
+ int w = (int)width;
+ int h = (int)height;
+
+ PDFDocumentGraphics2D graphics = new PDFDocumentGraphics2D(true, output.getOutputStream(), w, h);
+ // GraphicsNodeRenderContext rc = getRenderContext();
+ graphics.setGraphicContext(new org.apache.batik.ext.awt.g2d.GraphicContext());
+ graphics.setRenderingHints(rc.getRenderingHints());
+
+ gvtRoot.paint(graphics, rc);
+
+ try {
+ graphics.finish();
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ throw new TranscoderException(ex);
+ }
+ /*
+ // paint the SVG document using the bridge package
+ // create the appropriate renderer
+ ImageRenderer renderer = rendFactory.createImageRenderer();
+ renderer.updateOffScreen(w, h);
+ renderer.setTransform(Px);
+ renderer.setTree(gvtRoot);
+ gvtRoot = null; // We're done with it...
+
+ try {
+ // now we are sure that the aoi is the image size
+ Shape raoi = new Rectangle2D.Float(0, 0, width, height);
+ // Warning: the renderer's AOI must be in user space
+ renderer.repaint(Px.createInverse().createTransformedShape(raoi));
+ BufferedImage rend = renderer.getOffScreen();
+ renderer = null; // We're done with it...
+
+ // BufferedImage dest = createImage(w, h);
+
+ //Graphics2D g2d = GraphicsUtil.createGraphics(dest);
+
+ //g2d.drawRenderedImage(rend, new AffineTransform());
+ } catch (Exception ex) {
+ throw new TranscoderException(ex);
+ }
+ */
+ }
+
+ public GraphicsNodeRenderContext getRenderContext() {
+ GraphicsNodeRenderContext nodeRenderContext = null;
+ if (nodeRenderContext == null) {
+ RenderingHints hints = new RenderingHints(null);
+ hints.put(RenderingHints.KEY_ANTIALIASING,
+ RenderingHints.VALUE_ANTIALIAS_ON);
+
+ hints.put(RenderingHints.KEY_INTERPOLATION,
+ RenderingHints.VALUE_INTERPOLATION_BILINEAR);
+
+ FontRenderContext fontRenderContext =
+ new FontRenderContext(new AffineTransform(), true, true);
+
+ TextPainter textPainter = new StrokingTextPainter();
+
+ GraphicsNodeRableFactory gnrFactory =
+ new ConcreteGraphicsNodeRableFactory();
+
+ nodeRenderContext =
+ new GraphicsNodeRenderContext(new AffineTransform(),
+ null,
+ hints,
+ fontRenderContext,
+ textPainter,
+ gnrFactory);
+ nodeRenderContext.setTextPainter(textPainter);
+ }
+
+ return nodeRenderContext;
+ }
+
+ /**
+ * Creates a <tt>DocumentFactory</tt> that is used to create an SVG DOM
+ * tree. The specified DOM Implementation is ignored and the Batik
+ * SVG DOM Implementation is automatically used.
+ *
+ * @param domImpl the DOM Implementation (not used)
+ * @param parserClassname the XML parser classname
+ */
+ protected DocumentFactory createDocumentFactory(DOMImplementation domImpl,
+ String parserClassname) {
+ return new SAXSVGDocumentFactory(parserClassname);
+ }
+
+ // --------------------------------------------------------------------
+ // UserAgent implementation
+ // --------------------------------------------------------------------
+
+ /**
+ * A user agent implementation for <tt>ImageTranscoder</tt>.
+ */
+ protected class ImageTranscoderUserAgent implements UserAgent {
+
+ /**
+ * Returns the default size of this user agent (400x400).
+ */
+ public Dimension2D getViewportSize() {
+ return new Dimension(400, 400);
+ }
+
+ /**
+ * Displays the specified error message using the <tt>ErrorHandler</tt>.
+ */
+ public void displayError(String message) {
+ try {
+ getErrorHandler().error(new TranscoderException(message));
+ } catch (TranscoderException ex) {
+ throw new RuntimeException();
+ }
+ }
+
+ /**
+ * Displays the specified error using the <tt>ErrorHandler</tt>.
+ */
+ public void displayError(Exception e) {
+ try {
+ getErrorHandler().error(new TranscoderException(e));
+ } catch (TranscoderException ex) {
+ throw new RuntimeException();
+ }
+ }
+
+ /**
+ * Displays the specified message using the <tt>ErrorHandler</tt>.
+ */
+ public void displayMessage(String message) {
+ try {
+ getErrorHandler().warning(new TranscoderException(message));
+ } catch (TranscoderException ex) {
+ throw new RuntimeException();
+ }
+ }
+
+ /**
+ * Returns the pixel to millimeter conversion factor specified in the
+ * <tt>TranscodingHints</tt> or 0.3528 if any.
+ */
+ public float getPixelToMM() {
+ if (getTranscodingHints().containsKey(KEY_PIXEL_TO_MM)) {
+ return ((Float)getTranscodingHints().get(KEY_PIXEL_TO_MM)).floatValue();
+ } else {
+ // return 0.3528f; // 72 dpi
+ return 0.26458333333333333333333333333333f; // 96dpi
+ }
+ }
+
+ /**
+ * Returns the user language specified in the
+ * <tt>TranscodingHints</tt> or "en" (english) if any.
+ */
+ public String getLanguages() {
+ if (getTranscodingHints().containsKey(KEY_LANGUAGE)) {
+ return (String)getTranscodingHints().get(KEY_LANGUAGE);
+ } else {
+ return "en";
+ }
+ }
+
+ /**
+ * Returns the user stylesheet specified in the
+ * <tt>TranscodingHints</tt> or null if any.
+ */
+ public String getUserStyleSheetURI() {
+ return (String)getTranscodingHints().get(KEY_USER_STYLESHEET_URI);
+ }
+
+ /**
+ * Returns the XML parser to use from the TranscodingHints.
+ */
+ public String getXMLParserClassName() {
+ return (String)getTranscodingHints().get(KEY_XML_PARSER_CLASSNAME);
+ }
+
+ /**
+ * Unsupported operation.
+ */
+ public EventDispatcher getEventDispatcher() {
+ return null;
+ }
+
+ /**
+ * Unsupported operation.
+ */
+ public void openLink(SVGAElement elt) { }
+
+ /**
+ * Unsupported operation.
+ */
+ public void setSVGCursor(Cursor cursor) { }
+
+ /**
+ * Unsupported operation.
+ */
+ public void runThread(Thread t) { }
+
+ /**
+ * Unsupported operation.
+ */
+ public AffineTransform getTransform() {
+ return null;
+ }
+
+ /**
+ * Unsupported operation.
+ */
+ public Point getClientAreaLocationOnScreen() {
+ return new Point();
+ }
+
+ /**
+ * Tells whether the given feature is supported by this
+ * user agent.
+ */
+ public boolean hasFeature(String s) {
+ return FEATURES.contains(s);
+ }
+
+ /**
+ * Tells whether the given extension is supported by this
+ * user agent.
+ */
+ public boolean supportExtension(String s) {
+ return false;
+ }
+
+ public void registerExtension(BridgeExtension be)
+ {
+ }
+ }
+
+ protected final static Set FEATURES = new HashSet();
+ static {
+ FEATURES.add(SVGConstants.SVG_ORG_W3C_SVG_FEATURE);
+ FEATURES.add(SVGConstants.SVG_ORG_W3C_SVG_LANG_FEATURE);
+ FEATURES.add(SVGConstants.SVG_ORG_W3C_SVG_STATIC_FEATURE);
+ }
+
+ // --------------------------------------------------------------------
+ // Keys definition
+ // --------------------------------------------------------------------
+
+ /**
+ * The image width key.
+ * <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="1">
+ * <TR>
+ * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Key: </TH>
+ * <TD VALIGN="TOP">KEY_WIDTH</TD></TR>
+ * <TR>
+ * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Value: </TH>
+ * <TD VALIGN="TOP">Float</TD></TR>
+ * <TR>
+ * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Default: </TH>
+ * <TD VALIGN="TOP">The width of the top most svg element</TD></TR>
+ * <TR>
+ * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Required: </TH>
+ * <TD VALIGN="TOP">No</TD></TR>
+ * <TR>
+ * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Description: </TH>
+ * <TD VALIGN="TOP">Specify the width of the image to create.</TD></TR>
+ * </TABLE> */
+ public static final TranscodingHints.Key KEY_WIDTH
+ = new LengthKey();
+
+ /**
+ * The image height key.
+ * <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="1">
+ * <TR>
+ * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Key: </TH>
+ * <TD VALIGN="TOP">KEY_HEIGHT</TD></TR>
+ * <TR>
+ * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Value: </TH>
+ * <TD VALIGN="TOP">Float</TD></TR>
+ * <TR>
+ * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Default: </TH>
+ * <TD VALIGN="TOP">The height of the top most svg element</TD></TR>
+ * <TR>
+ * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Required: </TH>
+ * <TD VALIGN="TOP">No</TD></TR>
+ * <TR>
+ * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Description: </TH>
+ * <TD VALIGN="TOP">Specify the height of the image to create.</TD></TR>
+ * </TABLE> */
+ public static final TranscodingHints.Key KEY_HEIGHT
+ = new LengthKey();
+
+ /**
+ * The area of interest key.
+ * <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="1">
+ * <TR>
+ * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Key: </TH>
+ * <TD VALIGN="TOP">KEY_AOI</TD></TR>
+ * <TR>
+ * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Value: </TH>
+ * <TD VALIGN="TOP">Rectangle2D</TD></TR>
+ * <TR>
+ * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Default: </TH>
+ * <TD VALIGN="TOP">The document's size</TD></TR>
+ * <TR>
+ * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Required: </TH>
+ * <TD VALIGN="TOP">No</TD></TR>
+ * <TR>
+ * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Description: </TH>
+ * <TD VALIGN="TOP">Specify the area of interest to render. The
+ * rectangle coordinates must be specified in pixels and in the
+ * document coordinates system.</TD></TR>
+ * </TABLE>
+ */
+ public static final TranscodingHints.Key KEY_AOI
+ = new Rectangle2DKey();
+
+ /**
+ * The language key.
+ * <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="1">
+ * <TR>
+ * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Key: </TH>
+ * <TD VALIGN="TOP">KEY_LANGUAGE</TD></TR>
+ * <TR>
+ * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Value: </TH>
+ * <TD VALIGN="TOP">String</TD></TR>
+ * <TR>
+ * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Default: </TH>
+ * <TD VALIGN="TOP">"en"</TD></TR>
+ * <TR>
+ * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Required: </TH>
+ * <TD VALIGN="TOP">No</TD></TR>
+ * <TR>
+ * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Description: </TH>
+ * <TD VALIGN="TOP">Specify the preferred language of the document.
+ * </TD></TR>
+ * </TABLE>
+ */
+ public static final TranscodingHints.Key KEY_LANGUAGE
+ = new StringKey();
+
+ /**
+ * The user stylesheet URI key.
+ * <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="1">
+ * <TR>
+ * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Key: </TH>
+ * <TD VALIGN="TOP">KEY_USER_STYLESHEET_URI</TD></TR>
+ * <TR>
+ * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Value: </TH>
+ * <TD VALIGN="TOP">String</TD></TR>
+ * <TR>
+ * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Default: </TH>
+ * <TD VALIGN="TOP">null</TD></TR>
+ * <TR>
+ * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Required: </TH>
+ * <TD VALIGN="TOP">No</TD></TR>
+ * <TR>
+ * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Description: </TH>
+ * <TD VALIGN="TOP">Specify the user style sheet.</TD></TR>
+ * </TABLE>
+ */
+ public static final TranscodingHints.Key KEY_USER_STYLESHEET_URI
+ = new StringKey();
+
+ /**
+ * The pixel to millimeter conversion factor key.
+ * <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="1">
+ * <TR>
+ * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Key: </TH>
+ * <TD VALIGN="TOP">KEY_PIXEL_TO_MM</TD></TR>
+ * <TR>
+ * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Value: </TH>
+ * <TD VALIGN="TOP">Float</TD></TR>
+ * <TR>
+ * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Default: </TH>
+ * <TD VALIGN="TOP">0.33</TD></TR>
+ * <TR>
+ * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Required: </TH>
+ * <TD VALIGN="TOP">No</TD></TR>
+ * <TR>
+ * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Description: </TH>
+ * <TD VALIGN="TOP">Specify the pixel to millimeter conversion factor.
+ * </TD></TR>
+ * </TABLE>
+ */
+ public static final TranscodingHints.Key KEY_PIXEL_TO_MM
+ = new FloatKey();
+
+ /**
+ * The image background paint key.
+ * <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="1">
+ * <TR>
+ * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Key: </TH>
+ * <TD VALIGN="TOP">KEY_BACKGROUND_COLOR</TD></TR>
+ * <TR>
+ * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Value: </TH>
+ * <TD VALIGN="TOP">Paint</TD></TR>
+ * <TR>
+ * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Default: </TH>
+ * <TD VALIGN="TOP">null</TD></TR>
+ * <TR>
+ * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Required: </TH>
+ * <TD VALIGN="TOP">No</TD></TR>
+ * <TR>
+ * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Description: </TH>
+ * <TD VALIGN="TOP">Specify the background color to use.
+ * The color is required by opaque image formats and is used by
+ * image formats that support alpha channel.</TD></TR>
+ * </TABLE>
+ */
+ public static final TranscodingHints.Key KEY_BACKGROUND_COLOR
+ = new PaintKey();
+
+}