|
|
@@ -0,0 +1,317 @@ |
|
|
|
/* |
|
|
|
* $Id$ |
|
|
|
* ============================================================================ |
|
|
|
* The Apache Software License, Version 1.1 |
|
|
|
* ============================================================================ |
|
|
|
* |
|
|
|
* Copyright (C) 1999-2003 The Apache Software Foundation. All rights reserved. |
|
|
|
* |
|
|
|
* Redistribution and use in source and binary forms, with or without modifica- |
|
|
|
* tion, are permitted provided that the following conditions are met: |
|
|
|
* |
|
|
|
* 1. Redistributions of source code must retain the above copyright notice, |
|
|
|
* this list of conditions and the following disclaimer. |
|
|
|
* |
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright notice, |
|
|
|
* this list of conditions and the following disclaimer in the documentation |
|
|
|
* and/or other materials provided with the distribution. |
|
|
|
* |
|
|
|
* 3. The end-user documentation included with the redistribution, if any, must |
|
|
|
* include the following acknowledgment: "This product includes software |
|
|
|
* developed by the Apache Software Foundation (http://www.apache.org/)." |
|
|
|
* Alternately, this acknowledgment may appear in the software itself, if |
|
|
|
* and wherever such third-party acknowledgments normally appear. |
|
|
|
* |
|
|
|
* 4. The names "FOP" and "Apache Software Foundation" must not be used to |
|
|
|
* endorse or promote products derived from this software without prior |
|
|
|
* written permission. For written permission, please contact |
|
|
|
* apache@apache.org. |
|
|
|
* |
|
|
|
* 5. Products derived from this software may not be called "Apache", nor may |
|
|
|
* "Apache" appear in their name, without prior written permission of the |
|
|
|
* Apache Software Foundation. |
|
|
|
* |
|
|
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, |
|
|
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND |
|
|
|
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE |
|
|
|
* APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, |
|
|
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU- |
|
|
|
* DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS |
|
|
|
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON |
|
|
|
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
|
|
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
|
|
* ============================================================================ |
|
|
|
* |
|
|
|
* This software consists of voluntary contributions made by many individuals |
|
|
|
* on behalf of the Apache Software Foundation and was originally created by |
|
|
|
* James Tauber <jtauber@jtauber.com>. For more information on the Apache |
|
|
|
* Software Foundation, please see <http://www.apache.org/>. |
|
|
|
*/ |
|
|
|
package org.apache.fop.svg; |
|
|
|
|
|
|
|
import java.awt.Dimension; |
|
|
|
import java.awt.geom.AffineTransform; |
|
|
|
import java.awt.geom.Dimension2D; |
|
|
|
|
|
|
|
import org.xml.sax.EntityResolver; |
|
|
|
|
|
|
|
import org.apache.avalon.framework.logger.ConsoleLogger; |
|
|
|
import org.apache.avalon.framework.logger.LogEnabled; |
|
|
|
import org.apache.avalon.framework.logger.Logger; |
|
|
|
import org.apache.batik.bridge.UserAgent; |
|
|
|
import org.apache.batik.bridge.UserAgentAdapter; |
|
|
|
import org.apache.batik.dom.svg.SVGDOMImplementation; |
|
|
|
import org.apache.batik.dom.util.DocumentFactory; |
|
|
|
import org.apache.batik.transcoder.ErrorHandler; |
|
|
|
import org.apache.batik.transcoder.TranscoderException; |
|
|
|
import org.apache.batik.transcoder.XMLAbstractTranscoder; |
|
|
|
import org.apache.batik.transcoder.image.ImageTranscoder; |
|
|
|
import org.apache.batik.util.SVGConstants; |
|
|
|
import org.apache.batik.util.XMLResourceDescriptor; |
|
|
|
import org.w3c.dom.DOMImplementation; |
|
|
|
|
|
|
|
/** |
|
|
|
* This is the common base class of all of FOP's transcoders. |
|
|
|
*/ |
|
|
|
public abstract class AbstractFOPTranscoder extends XMLAbstractTranscoder |
|
|
|
implements LogEnabled { |
|
|
|
|
|
|
|
/** |
|
|
|
* The user agent dedicated to this Transcoder. |
|
|
|
*/ |
|
|
|
protected UserAgent userAgent = createUserAgent(); |
|
|
|
|
|
|
|
private Logger logger; |
|
|
|
private EntityResolver resolver; |
|
|
|
|
|
|
|
/** |
|
|
|
* Constructs a new FOP-style transcoder. |
|
|
|
*/ |
|
|
|
public AbstractFOPTranscoder() { |
|
|
|
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()); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Creates and returns the default user agent for this transcoder. Override |
|
|
|
* this method if you need non-default behaviour. |
|
|
|
* @return UserAgent the newly created user agent |
|
|
|
*/ |
|
|
|
protected UserAgent createUserAgent() { |
|
|
|
return new FOPTranscoderUserAgent(); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* @see org.apache.avalon.framework.logger.LogEnabled#enableLogging(Logger) |
|
|
|
*/ |
|
|
|
public void enableLogging(Logger logger) { |
|
|
|
this.logger = logger; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Sets the EntityResolver that should be used when building SVG documents. |
|
|
|
* @param resolver the resolver |
|
|
|
*/ |
|
|
|
public void setEntityResolver(EntityResolver resolver) { |
|
|
|
this.resolver = resolver; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Returns the logger associated with this transcoder. It returns a |
|
|
|
* ConsoleLogger if no logger has been explicitly set. |
|
|
|
* @return Logger the logger for the transcoder. |
|
|
|
*/ |
|
|
|
protected final Logger getLogger() { |
|
|
|
if (this.logger == null) { |
|
|
|
this.logger = new ConsoleLogger(ConsoleLogger.LEVEL_INFO); |
|
|
|
} |
|
|
|
return this.logger; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 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 |
|
|
|
* @return the document factory |
|
|
|
*/ |
|
|
|
protected DocumentFactory createDocumentFactory(DOMImplementation domImpl, |
|
|
|
String parserClassname) { |
|
|
|
final FOPSAXSVGDocumentFactory factory = |
|
|
|
new FOPSAXSVGDocumentFactory(parserClassname); |
|
|
|
if (this.resolver != null) { |
|
|
|
factory.setAdditionalEntityResolver(this.resolver); |
|
|
|
} |
|
|
|
return factory; |
|
|
|
} |
|
|
|
|
|
|
|
// -------------------------------------------------------------------- |
|
|
|
// FOP's default error handler (for transcoders) |
|
|
|
// -------------------------------------------------------------------- |
|
|
|
|
|
|
|
/** |
|
|
|
* This is the default transcoder error handler for FOP. It logs error |
|
|
|
* to an Avalon Logger instead of to System.out. The remaining behaviour |
|
|
|
* is the same as Batik's DefaultErrorHandler. |
|
|
|
*/ |
|
|
|
protected class FOPErrorHandler implements ErrorHandler { |
|
|
|
|
|
|
|
/** |
|
|
|
* @see org.apache.batik.transcoder.ErrorHandler#error(TranscoderException) |
|
|
|
*/ |
|
|
|
public void error(TranscoderException te) |
|
|
|
throws TranscoderException { |
|
|
|
getLogger().error(te.getMessage()); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* @see org.apache.batik.transcoder.ErrorHandler#fatalError(TranscoderException) |
|
|
|
*/ |
|
|
|
public void fatalError(TranscoderException te) |
|
|
|
throws TranscoderException { |
|
|
|
throw te; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* @see org.apache.batik.transcoder.ErrorHandler#warning(TranscoderException) |
|
|
|
*/ |
|
|
|
public void warning(TranscoderException te) |
|
|
|
throws TranscoderException { |
|
|
|
getLogger().warn(te.getMessage()); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
// -------------------------------------------------------------------- |
|
|
|
// UserAgent implementation |
|
|
|
// -------------------------------------------------------------------- |
|
|
|
|
|
|
|
/** |
|
|
|
* A user agent implementation for FOP's Transcoders. |
|
|
|
*/ |
|
|
|
protected class FOPTranscoderUserAgent extends UserAgentAdapter { |
|
|
|
|
|
|
|
/** |
|
|
|
* Returns the default size of this user agent (400x400). |
|
|
|
* @return the default viewport size |
|
|
|
*/ |
|
|
|
public Dimension2D getViewportSize() { |
|
|
|
return new Dimension(400, 400); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Displays the specified error message using the <tt>ErrorHandler</tt>. |
|
|
|
* @param message the message to display |
|
|
|
*/ |
|
|
|
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>. |
|
|
|
* @param e the exception to display |
|
|
|
*/ |
|
|
|
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>. |
|
|
|
* @param message the message to display |
|
|
|
*/ |
|
|
|
public void displayMessage(String message) { |
|
|
|
getLogger().info(message); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Returns the pixel to millimeter conversion factor specified in the |
|
|
|
* <tt>TranscodingHints</tt> or 0.3528 if any. |
|
|
|
* @return the pixel unit to millimeter factor |
|
|
|
*/ |
|
|
|
public float getPixelUnitToMillimeter() { |
|
|
|
Object key = ImageTranscoder.KEY_PIXEL_UNIT_TO_MILLIMETER; |
|
|
|
if (getTranscodingHints().containsKey(key)) { |
|
|
|
return ((Float)getTranscodingHints().get(key)).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. |
|
|
|
* @return the languages for the transcoder |
|
|
|
*/ |
|
|
|
public String getLanguages() { |
|
|
|
Object key = ImageTranscoder.KEY_LANGUAGE; |
|
|
|
if (getTranscodingHints().containsKey(key)) { |
|
|
|
return (String)getTranscodingHints().get(key); |
|
|
|
} else { |
|
|
|
return "en"; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Get the media for this transcoder. Which is always print. |
|
|
|
* @return PDF media is "print" |
|
|
|
*/ |
|
|
|
public String getMedia() { |
|
|
|
return "print"; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Returns the user stylesheet specified in the |
|
|
|
* <tt>TranscodingHints</tt> or null if any. |
|
|
|
* @return the user style sheet URI specified in the hints |
|
|
|
*/ |
|
|
|
public String getUserStyleSheetURI() { |
|
|
|
return (String)getTranscodingHints() |
|
|
|
.get(ImageTranscoder.KEY_USER_STYLESHEET_URI); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Returns the XML parser to use from the TranscodingHints. |
|
|
|
* @return the XML parser class name |
|
|
|
*/ |
|
|
|
public String getXMLParserClassName() { |
|
|
|
Object key = KEY_XML_PARSER_CLASSNAME; |
|
|
|
if (getTranscodingHints().containsKey(key)) { |
|
|
|
return (String)getTranscodingHints().get(key); |
|
|
|
} else { |
|
|
|
return XMLResourceDescriptor.getXMLParserClassName(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Check if the XML parser is validating. |
|
|
|
* @return true if the XML parser is validating |
|
|
|
*/ |
|
|
|
public boolean isXMLParserValidating() { |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Unsupported operation. |
|
|
|
* @return null since this is unsupported |
|
|
|
*/ |
|
|
|
public AffineTransform getTransform() { |
|
|
|
return null; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |