aboutsummaryrefslogtreecommitdiffstats
path: root/test/java/org/apache/fop/visual/AbstractPSPDFBitmapProducer.java
diff options
context:
space:
mode:
authorJeremias Maerki <jeremias@apache.org>2005-08-12 13:58:52 +0000
committerJeremias Maerki <jeremias@apache.org>2005-08-12 13:58:52 +0000
commit9d9ff7ecdb911a61c1eaea6c42661e7132f05a2c (patch)
treefcfefc43f225df42e73d9b1b62d421de63b12e12 /test/java/org/apache/fop/visual/AbstractPSPDFBitmapProducer.java
parent0a6c44e1bafc9c1c8d77858b18e5f37e2d07e7da (diff)
downloadxmlgraphics-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.java153
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;
+ }
+ }
+
+}