diff options
author | Jeremias Maerki <jeremias@apache.org> | 2005-08-12 13:58:52 +0000 |
---|---|---|
committer | Jeremias Maerki <jeremias@apache.org> | 2005-08-12 13:58:52 +0000 |
commit | 9d9ff7ecdb911a61c1eaea6c42661e7132f05a2c (patch) | |
tree | fcfefc43f225df42e73d9b1b62d421de63b12e12 /test/java/org/apache/fop/visual/AbstractPSPDFBitmapProducer.java | |
parent | 0a6c44e1bafc9c1c8d77858b18e5f37e2d07e7da (diff) | |
download | xmlgraphics-fop-9d9ff7ecdb911a61c1eaea6c42661e7132f05a2c.tar.gz xmlgraphics-fop-9d9ff7ecdb911a61c1eaea6c42661e7132f05a2c.zip |
Initial upload of the visual testing facility. Docs in code. A Wiki page will follow shortly.
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@232300 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'test/java/org/apache/fop/visual/AbstractPSPDFBitmapProducer.java')
-rw-r--r-- | test/java/org/apache/fop/visual/AbstractPSPDFBitmapProducer.java | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/test/java/org/apache/fop/visual/AbstractPSPDFBitmapProducer.java b/test/java/org/apache/fop/visual/AbstractPSPDFBitmapProducer.java new file mode 100644 index 000000000..3899b6dee --- /dev/null +++ b/test/java/org/apache/fop/visual/AbstractPSPDFBitmapProducer.java @@ -0,0 +1,153 @@ +/* + * Copyright 2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* $Id$ */ + +package org.apache.fop.visual; + +import java.awt.image.BufferedImage; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.text.MessageFormat; + +import javax.xml.transform.Transformer; +import javax.xml.transform.sax.SAXResult; +import javax.xml.transform.stream.StreamSource; + +import org.apache.avalon.framework.configuration.Configurable; +import org.apache.avalon.framework.configuration.Configuration; +import org.apache.avalon.framework.configuration.ConfigurationException; +import org.apache.commons.io.IOUtils; +import org.apache.fop.apps.FOUserAgent; +import org.apache.fop.apps.Fop; + +/** + * BitmapProducer implementation that uses the PS or PDF renderer and an external converter + * to create bitmaps. + * <p> + * Here's what the configuration element looks like for the class: + * <p> + * <pre> + * <producer classname="<concrete class>"> + * <converter>mypdf2bmp {0} {1} {2}</converter> + * <delete-temp-files>false</delete-temp-files> + * </producer> + * </pre> + * <p> + * You will notice the three parameters in curly braces (java.util.MessageFormat style) to the + * converter call: + * <ul> + * <li>0: the input file + * <li>1: the output bitmap file + * <li>2: the requested resolution in dpi for the generated bitmap + * </ul> + * <p> + * The "delete-temp-files" element is optional and defaults to true. + */ +public abstract class AbstractPSPDFBitmapProducer extends AbstractBitmapProducer + implements Configurable { + + private String converter; + private boolean deleteTempFiles; + + /** @see org.apache.avalon.framework.configuration.Configurable */ + public void configure(Configuration cfg) throws ConfigurationException { + this.converter = cfg.getChild("converter").getValue(); + this.deleteTempFiles = cfg.getChild("delete-temp-files").getValueAsBoolean(true); + } + + /** + * Calls an external converter to convert the file generated by FOP to a bitmap. + * @param inFile the generated output file to be converted + * @param outFile the target filename for the bitmap + * @param context context information (required bitmap resolution etc.) + * @throws IOException in case the conversion fails + */ + public void convert(File inFile, File outFile, ProducerContext context) throws IOException { + outFile.delete(); + + //Build command-line + String cmd = MessageFormat.format(converter, + new Object[] {inFile.toString(), outFile.toString(), + Integer.toString(context.getResolution())}); + ConvertUtils.convert(cmd, null, null, log); + + if (!outFile.exists()) { + throw new IOException("The target file has not been generated"); + } + } + + /** + * @return the native extension generated by the output format, ex. "ps" or "pdf". + */ + protected abstract String getTargetExtension(); + + /** + * @return the output format constant for the FOP renderer, i.e. one of Constants.RENDER_*. + */ + protected abstract int getTargetFormat(); + + /** @see org.apache.fop.visual.BitmapProducer */ + public BufferedImage produce(File src, ProducerContext context) { + try { + FOUserAgent userAgent = new FOUserAgent(); + userAgent.setResolution(context.getResolution()); + userAgent.setBaseURL(src.getParentFile().toURL().toString()); + + File tempOut = new File(context.getTargetDir(), + src.getName() + "." + getTargetExtension()); + File tempPNG = new File(context.getTargetDir(), + src.getName() + "." + getTargetExtension() + ".png"); + try { + OutputStream out = new FileOutputStream(tempOut); + out = new BufferedOutputStream(out); + try { + Fop fop = new Fop(getTargetFormat(), userAgent); + fop.setOutputStream(out); + SAXResult res = new SAXResult(fop.getDefaultHandler()); + + Transformer transformer = getTransformer(context); + transformer.transform(new StreamSource(src), res); + } finally { + IOUtils.closeQuietly(out); + } + + convert(tempOut, tempPNG, context); + BufferedImage img = BitmapComparator.getImage(tempPNG); + return img; + } finally { + if (deleteTempFiles) { + if (!tempOut.delete()) { + log.warn("Can't delete " + tempOut); + tempOut.deleteOnExit(); + } + if (!tempPNG.delete()) { + log.warn("Can't delete " + tempPNG); + tempPNG.deleteOnExit(); + } + } + } + } catch (Exception e) { + e.printStackTrace(); + log.error(e); + return null; + } + } + +} |