From 24187929060686cfe4e90ee36ab563e5aae150a8 Mon Sep 17 00:00:00 2001 From: Christian Geisert Date: Mon, 18 Nov 2002 14:37:47 +0000 Subject: [PATCH] Added support for CCITT Group 4 encoded TIFF files Made JAI support dynamic (no recompile needed anymore) Submitted by: Manuel Mall (see bug #13866) git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/fop-0_20_2-maintain@195555 13f79535-47bb-0310-9956-ffa450edef68 --- CHANGES | 3 + build.bat | 2 + build.sh | 2 + build.xml | 8 +- docs/examples/fo/images.fo | 46 ++--- docs/examples/runtests.bat | 2 + docs/examples/runtests.sh | 2 + docs/graphics/xml_fax.tif | Bin 0 -> 1837 bytes src/org/apache/fop/image/FopImageFactory.java | 44 +++-- src/org/apache/fop/image/TiffImage.java | 170 ++++++++++++++++++ .../apache/fop/messaging/MessageHandler.java | 85 ++++----- src/org/apache/fop/pdf/CCFFilter.java | 42 +++++ src/org/apache/fop/pdf/PDFXObject.java | 11 +- src/org/apache/fop/tools/anttasks/Fop.java | 49 +++-- test/createpdf.sh | 8 +- 15 files changed, 375 insertions(+), 99 deletions(-) create mode 100644 docs/graphics/xml_fax.tif create mode 100755 src/org/apache/fop/image/TiffImage.java create mode 100755 src/org/apache/fop/pdf/CCFFilter.java diff --git a/CHANGES b/CHANGES index 5fcdabf94..93e722422 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,9 @@ ============================================================================== Done since 0.20.4 release +- Added support for CCITT Group 4 encoded TIFF files + Made JAI support dynamic (no recompile needed anymore) + Submitted by: Manuel Mall (see bug #13866) - Fixed problem with jpegs with icc profile and acrobat reader 5 (Bug #11301) Submitted by: Stephan Neuhaus - Fix bug in LinkSet.mergeLinks() (ArrayOutOfBoundsException when number of diff --git a/build.bat b/build.bat index d5723e92b..40f6435d9 100755 --- a/build.bat +++ b/build.bat @@ -15,6 +15,8 @@ set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\batik.jar set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\avalon-framework-cvs-20020806.jar set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\bsf.jar set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\jimi-1.0.jar +set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\jai_core.jar +set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\jai_codec.jar set ANT_HOME=%LIBDIR% diff --git a/build.sh b/build.sh index 9e2f5e2e7..db0649ec7 100755 --- a/build.sh +++ b/build.sh @@ -37,6 +37,8 @@ LOCALCLASSPATH=$LOCALCLASSPATH:$LIBDIR/batik.jar LOCALCLASSPATH=$LOCALCLASSPATH:$LIBDIR/avalon-framework-cvs-20020806.jar LOCALCLASSPATH=$LOCALCLASSPATH:$LIBDIR/bsf.jar LOCALCLASSPATH=$LOCALCLASSPATH:$LIBDIR/jimi-1.0.jar +LOCALCLASSPATH=$LOCALCLASSPATH:$LIBDIR/jai_core.jar +LOCALCLASSPATH=$LOCALCLASSPATH:$LIBDIR/jai_codec.jar # antRun must be executable (can't do this in build.xml because Ant uses antRun # to do the chmod) diff --git a/build.xml b/build.xml index a5bd77d38..c8cb6d85a 100644 --- a/build.xml +++ b/build.xml @@ -212,7 +212,7 @@ Sometimes ant gives out this warnings, but the build is finished without any pro - + @@ -223,7 +223,7 @@ Sometimes ant gives out this warnings, but the build is finished without any pro - + @@ -236,6 +236,7 @@ Sometimes ant gives out this warnings, but the build is finished without any pro + @@ -356,6 +357,7 @@ Sometimes ant gives out this warnings, but the build is finished without any pro + @@ -374,7 +376,7 @@ Sometimes ant gives out this warnings, but the build is finished without any pro + excludes="**/${jimi},**/${jai},**/${tiff},**/${xsltransform},**/${trax},**/apps/TraxInputHandler.java"/> diff --git a/docs/examples/fo/images.fo b/docs/examples/fo/images.fo index b25cafae7..e9efb53d1 100644 --- a/docs/examples/fo/images.fo +++ b/docs/examples/fo/images.fo @@ -4,28 +4,28 @@ - - + margin-top="75pt" margin-bottom="25pt" margin-left="100pt" margin-right="50pt"> + + - - + margin-top="75pt" margin-bottom="25pt" margin-left="50pt" margin-right="100pt"> + + - - - - - - - + + + + + + + @@ -33,9 +33,9 @@ - - - + + + @@ -64,6 +64,12 @@ + + A TIFF image in FOP (Only works with JAI!) + + + + This section is only required to show that the layout still works. @@ -80,4 +86,4 @@ A. Appendix - + diff --git a/docs/examples/runtests.bat b/docs/examples/runtests.bat index 2bca19d86..c5cf21776 100755 --- a/docs/examples/runtests.bat +++ b/docs/examples/runtests.bat @@ -16,6 +16,8 @@ set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\batik.jar set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\avalon-framework-cvs-20020806.jar set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\bsf.jar set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\jimi-1.0.jar +set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\jai_core.jar +set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\jai_codec.jar set LOCALCLASSPATH=%LOCALCLASSPATH%;%LIBDIR%\..\build\fop.jar set ANT_HOME=%LIBDIR% diff --git a/docs/examples/runtests.sh b/docs/examples/runtests.sh index 3ce5b8420..120812e02 100755 --- a/docs/examples/runtests.sh +++ b/docs/examples/runtests.sh @@ -35,6 +35,8 @@ LOCALCLASSPATH=$LOCALCLASSPATH:$LIBDIR/batik.jar LOCALCLASSPATH=$LOCALCLASSPATH:$LIBDIR/avalon-framework-cvs-20020806.jar LOCALCLASSPATH=$LOCALCLASSPATH:$LIBDIR/bsf.jar LOCALCLASSPATH=$LOCALCLASSPATH:$LIBDIR/jimi-1.0.jar +LOCALCLASSPATH=$LOCALCLASSPATH:$LIBDIR/jai_core.jar +LOCALCLASSPATH=$LOCALCLASSPATH:$LIBDIR/jai_codec.jar LOCALCLASSPATH=$LOCALCLASSPATH:$LIBDIR/../build/fop.jar ANT_HOME=$LIBDIR diff --git a/docs/graphics/xml_fax.tif b/docs/graphics/xml_fax.tif new file mode 100644 index 0000000000000000000000000000000000000000..8293191a24167a40aca22ac72a3c92b766bda67d GIT binary patch literal 1837 zcmYk5c~BE+8pb;iuwfJFP7s<)JDo&A7DEITVq`ca*PQ?NFwvQ7OW7SFT^obnl-jj!43_rl8DRON?jjilPwWpu=BJ3C}$3 z9to2g9jYzY;pg9%6Q{3e@f7^b{?IS~-a@(erK&-O6%5lW_SOdRghR-z$C!%kF=1;bQ?jRvWPRc%S|hE4!*&8g+ZB+sxh^aHr#JJd$!}+NOvnGy z&1){~KOXmogdSpUu6vP~*Ci*9qqm$0lWxtP49nw7gBr`wtrf)NqZ_;FMyJK2l&^^Y z;F}H@iTMfP&lBaZJ)EAE*M#>YTZsk8&$z;(S2_{HcEdVC2l6f%2@2mhm#*kX%870$ zy{dfZF`uy9%4#d15|*8Vn$kcEC14=%7vgcwAIph+@1Nei`+h7hO!XdKb|ZoLt`Nmp!RHj5j6e?@tyBiPIYcnec77*+R#mz?!BG~qo zU|$4ZUy;&CjS&dpiM@#2o8n3l{$9#^2fcT~HOGnIYX6N)gDN99)1Uo3mC{G)%=Ft$ z|5nt7pR1zoLKJFKtrKhP+cQ~|<7?bJ2WED{4TISpS^PvLbU^GsmKM4}zx_bd0vb8y z3um-pP4#3C7ZdtQ-gBTa#EvW|<$*EYxSK5=KQ0%=HzS7&}`L%u_~&ghfnM#cZS=r(BfoLnPQ8E}m-R0%cc-+T4aF zPIYkGtJh5qJ#=2n@MT^T*1Q&@O(#Yq(4-iv1Z!$ENX_!{g)1tmu?%GjJ}eF1gN8Rf zqxg?zyhe9J7&?;|+l16nHmEN>Pz3qX!^lmA1EUV38Op7hM?7En$T^s!|BLTh?uc4K zHW|G4HwqJ1A_A@T3r|#$la+MvXo`zM?gGi4JlRo96WAOolv6LrF0m?IHs56yf!mtv zSF08b=J)WZrjCu@IN!MaiP_SlGPt_hk*N~YfS!u0<`@p&WSvepROe!X?@TTYZ)6lI1Z*sm1^S|_7g1G?^7y+-`6 z4q{eUvOr@Vb0sNn9)lZa8PCdc3m*{Ez3Fq0CIr=Oj38_)qF}EyI{zTk&Gk&P4X&^$ zr&>QCds_tx{d*ZK=|Dssh$nank;_O6<6h%VRby00K*PK7sLTC}a5O3(!7%ZBe?14N z00Ec;0JZ=CkZk&`2k8?72_G9vY!#4fmzZp2`z8Kpa$KgN0yfqb6#(o_Bp9$N0jm=L zNwj5}Rm<3Ai9cq!{;IcoPjUzBK6&j2NgluP7|C;)m$SsyMAG{I=Wey;j$3^|X@1_i zENQ7fuQ)dg0QP=*>bE + // load the right image class + // return new Object imageInstance = null; Class imageClass = null; try { @@ -195,6 +196,27 @@ public class FopImageFactory { return (FopImage)imageInstance; } + + /** + * Determines the class name of the generic image handler + * This should really come from a config file but we leave this + * to some future time. + */ + private static String getGenericImageClassName() { + + if (m_genericImageClassName == null) { + try { + Class.forName("org.apache.fop.image.JAIImage"); + m_genericImageClassName = "org.apache.fop.image.JAIImage"; + } catch (Exception ex) { + /* on any exception assume Jai is not present and use Jimi instead */ + m_genericImageClassName = "org.apache.fop.image.JimiImage"; + } + } + return m_genericImageClassName; + } + + /** * Clear the image cache. */ diff --git a/src/org/apache/fop/image/TiffImage.java b/src/org/apache/fop/image/TiffImage.java new file mode 100755 index 000000000..5ebb3bfb3 --- /dev/null +++ b/src/org/apache/fop/image/TiffImage.java @@ -0,0 +1,170 @@ +/* + * $Id$ + * Copyright (C) 2001 The Apache Software Foundation. All rights reserved. + * For details on use and redistribution please refer to the + * LICENSE file included with these sources. + */ + +package org.apache.fop.image; + +// Java +import java.net.URL; +import java.io.InputStream; +import java.io.ByteArrayOutputStream; +import java.io.BufferedInputStream; + +// AWT +import java.awt.image.ColorModel; +import java.awt.image.IndexColorModel; +import java.awt.image.BufferedImage; + +// JAI +import javax.media.jai.JAI; +import javax.media.jai.RenderedOp; +// Sun codec +import com.sun.media.jai.codec.FileCacheSeekableStream; +// FOP +import org.apache.fop.datatypes.ColorSpace; +import org.apache.fop.pdf.PDFColor; +import org.apache.fop.pdf.CCFFilter; +import org.apache.fop.pdf.DCTFilter; +import org.apache.fop.image.analyser.ImageReader; + +/** + * FopImage object using JAI for TIFF images. + * Allows to store certain compresssed TIFF images directly + * in the output stream. Does revert to the standard JAI + * image for anything it doesn't understand. + * @author Manuel MALL + * @see AbstractFopImage + * @see FopImage + */ +public class TiffImage extends JAIImage { + public TiffImage(URL href) throws FopImageException { + super(href); + } + + public TiffImage(URL href, + ImageReader imgReader) throws FopImageException { + super(href, imgReader); + } + + protected void loadImage() throws FopImageException { + try { + InputStream inputStream = this.m_href.openStream(); + /* + * BufferedInputStream inputStream = this.m_imageReader.getInputStream(); + * inputStream.reset(); + */ + com.sun.media.jai.codec.FileCacheSeekableStream seekableInput = + new FileCacheSeekableStream(inputStream); + + com.sun.media.jai.codec.TIFFDirectory ifd = new com.sun.media.jai.codec.TIFFDirectory(seekableInput, 0); + com.sun.media.jai.codec.TIFFField fld = null; + + this.m_height = (int)ifd.getFieldAsLong(0x101); + this.m_width = (int)ifd.getFieldAsLong(0x100); + + fld = ifd.getField(0x115); // The samples per pixel field + if (fld != null && fld.getAsInt(0) != 1) { + throw new FopImageException("Error while loading image " + + this.m_href.toString() + " : " + + this.getClass() + " - " + + "unsupported samples per pixel value " + fld.getAsInt(0)); + } + + this.m_bitsPerPixel = 1; + fld = ifd.getField(0x102); // The bits per sample field + if (fld != null) { + this.m_bitsPerPixel = fld.getAsInt(0); + } + + this.m_colorSpace = new ColorSpace(ColorSpace.DEVICE_GRAY); + fld = ifd.getField(0x106); // The photometric interpretation field + if (fld != null) { + if (fld.getAsInt(0) == 0) { + // All is fine + } + else if (fld.getAsInt(0) == 2) { + this.m_colorSpace = new ColorSpace(ColorSpace.DEVICE_RGB); + } + else { + throw new FopImageException("Error while loading image " + + this.m_href.toString() + " : " + + this.getClass() + " - " + + "unsupported photometric interpretation value " + fld.getAsInt(0)); + } + } + + this.m_isTransparent = false; + + int comp = 1; + fld = ifd.getField(0x103); // The compression field + if (fld != null) { + comp = fld.getAsInt(0); + } + if (comp == 1) { + } + else if (comp == 3) { + this.m_compressionType = new CCFFilter(); + this.m_compressionType.setApplied(true); + } + else if (comp == 4) { + CCFFilter ccf = new CCFFilter(); + this.m_compressionType = ccf; + this.m_compressionType.setApplied(true); + ccf.setDecodeParms("<< /K -1 /Columns " + this.m_width + " >>"); + } + else if (comp == 6) { + this.m_compressionType = new DCTFilter(); + this.m_compressionType.setApplied(true); + } + else { + throw new FopImageException("Error while loading image " + + this.m_href.toString() + " : " + + this.getClass() + " - " + + "unsupported compression value " + comp); + } + + fld = ifd.getField(0x116); // The rows per strip field + if (fld != null) { + if (this.m_height != fld.getAsLong(0)) { + throw new FopImageException("Error while loading image " + + this.m_href.toString() + " : " + + this.getClass() + " - " + + "only single strip images supported "); + } + } + long offset = ifd.getFieldAsLong(0x111); + long length = ifd.getFieldAsLong(0x117); + + byte[] readBuf = new byte[(int)length]; + int bytes_read; + + inputStream.close(); + inputStream = this.m_href.openStream(); + inputStream.skip(offset); + bytes_read = inputStream.read(readBuf); + if (bytes_read != length) { + throw new FopImageException("Error while loading image " + + this.m_href.toString() + " : " + + this.getClass() + " - " + + "length mismatch on read"); + } + + this.m_bitmaps = readBuf; + } catch (FopImageException fie) { + org.apache.fop.messaging.MessageHandler.logln("Reverting to TIFF image handling through JAI: " + + fie.getMessage()); + this.m_compressionType = null; + super.loadImage(); + } catch (Exception ex) { + throw new FopImageException("Error while loading image " + + this.m_href.toString() + " : " + + ex.getClass() + " - " + + ex.getMessage()); + } + } + +} + diff --git a/src/org/apache/fop/messaging/MessageHandler.java b/src/org/apache/fop/messaging/MessageHandler.java index a21ed2daf..68ec86892 100644 --- a/src/org/apache/fop/messaging/MessageHandler.java +++ b/src/org/apache/fop/messaging/MessageHandler.java @@ -87,42 +87,43 @@ public class MessageHandler { * @param message the message for the user */ public static void log(String message) { - if (quiet) - return; + if (quiet) { + return; + } + + if (logger == null) { + logger = new ConsoleLogger(ConsoleLogger.LEVEL_INFO); + logger.warn("Screen logger not set."); + } - if (logger == null) { - logger = new ConsoleLogger(ConsoleLogger.LEVEL_INFO); - logger.warn("Screen logger not set."); - } - - setMessage(message); - switch (outputMethod) { - case SCREEN: - logger.debug(getMessage()); - break; - case FILE: - if (fileOpened) { - writer.print(getMessage()); - writer.flush(); - } else { - openFile(); - writer.print(getMessage()); - writer.flush(); - } - break; - case EVENT: - setMessage(message); - Enumeration enum = listeners.elements(); - while (enum.hasMoreElements()) { - ((MessageListener)enum.nextElement()).processMessage(new MessageEvent(getMessage())); - } - break; - case NONE: - // do nothing - break; - default: - logger.debug(message); - } + setMessage(message); + switch (outputMethod) { + case SCREEN: + logger.info(getMessage()); + break; + case FILE: + if (fileOpened) { + writer.print(getMessage()); + writer.flush(); + } else { + openFile(); + writer.print(getMessage()); + writer.flush(); + } + break; + case EVENT: + setMessage(message); + Enumeration enum = listeners.elements(); + while (enum.hasMoreElements()) { + ((MessageListener)enum.nextElement()).processMessage(new MessageEvent(getMessage())); + } + break; + case NONE: + // do nothing + break; + default: + logger.info(message); + } } /** @@ -139,10 +140,10 @@ public class MessageHandler { */ public static void error(String errorMessage) { - if (logger == null) { - logger = new ConsoleLogger(ConsoleLogger.LEVEL_INFO); - logger.warn("Screen logger not set."); - } + if (logger == null) { + logger = new ConsoleLogger(ConsoleLogger.LEVEL_INFO); + logger.warn("Screen logger not set."); + } setMessage(errorMessage); switch (outputMethod) { @@ -205,9 +206,9 @@ public class MessageHandler { * @param newLogger a logger for screen output. This may not be null. */ public static void setScreenLogger(Logger newLogger) { - if (newLogger == null) - throw new NullPointerException(); - logger = newLogger; + if (newLogger == null) + throw new NullPointerException(); + logger = newLogger; } /** diff --git a/src/org/apache/fop/pdf/CCFFilter.java b/src/org/apache/fop/pdf/CCFFilter.java new file mode 100755 index 000000000..17c45389f --- /dev/null +++ b/src/org/apache/fop/pdf/CCFFilter.java @@ -0,0 +1,42 @@ +/* + * $Id$ + * Copyright (C) 2001 The Apache Software Foundation. All rights reserved. + * For details on use and redistribution please refer to the + * LICENSE file included with these sources. + */ + +package org.apache.fop.pdf; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; + + +/** + * CCF Filter class. Right now it is just used as a dummy filter flag so + * we can write TIFF images to the PDF. The encode method just returns the + * data passed to it. In the future an actual CCITT Group 4 compression should be + * added to the encode method so other images can be compressed. + * + * @author Manuel Mall + */ +public class CCFFilter extends PDFFilter { + + private String m_decodeParms; + + public String getName() { + return "/CCITTFaxDecode"; + } + + public String getDecodeParms() { + return this.m_decodeParms; + } + + public void setDecodeParms(String decodeParms) { + this.m_decodeParms = decodeParms; + } + + public byte[] encode(byte[] data) { + return data; + } +} + diff --git a/src/org/apache/fop/pdf/PDFXObject.java b/src/org/apache/fop/pdf/PDFXObject.java index f16e50fe3..4783df74c 100644 --- a/src/org/apache/fop/pdf/PDFXObject.java +++ b/src/org/apache/fop/pdf/PDFXObject.java @@ -187,12 +187,19 @@ public class PDFXObject extends PDFObject { * Added by Eric Dalquist * If the DCT filter hasn't been added to the object we add it here */ + /* + * Added by Manuel Mall + * Only add the default filters if we don't have an image filter to + * avoid double encoding of images + */ + if (fopimage.getPDFFilter() != null) { imgStream.addFilter(fopimage.getPDFFilter()); + } else { + imgStream.addDefaultFilters(); } - imgStream.addDefaultFilters(); - + String dictEntries = imgStream.applyFilters(); String p = this.number + " " + this.generation + " obj\n"; diff --git a/src/org/apache/fop/tools/anttasks/Fop.java b/src/org/apache/fop/tools/anttasks/Fop.java index bd914fb0a..5decb0eb6 100644 --- a/src/org/apache/fop/tools/anttasks/Fop.java +++ b/src/org/apache/fop/tools/anttasks/Fop.java @@ -194,8 +194,8 @@ class FOPTaskStarter extends Starter { FOPTaskStarter(Fop task) throws FOPException { this.task = task; - log = new ConsoleLogger(ConsoleLogger.LEVEL_INFO); - MessageHandler.setScreenLogger(log); + log = new ConsoleLogger(ConsoleLogger.LEVEL_INFO); + MessageHandler.setScreenLogger(log); } private int determineRenderer(String format) { @@ -264,17 +264,22 @@ class FOPTaskStarter extends Starter { try { if (task.getFofile() != null) { - Configuration.put("baseDir", - task.getFofile().getParentFile().toURL(). - toExternalForm()); + if (task.getBasedir() != null) { + Configuration.put("baseDir", + task.getBasedir().toURL(). + toExternalForm()); + } else { + Configuration.put("baseDir", + task.getFofile().getParentFile().toURL(). + toExternalForm()); + } } + task.log("Using base directory: " + + Configuration.getValue("baseDir"), Project.MSG_DEBUG); } catch (Exception e) { log.error("Error setting base directory",e); } - task.log("Using base directory: " + - Configuration.getValue("baseDir"), Project.MSG_DEBUG); - int rint = determineRenderer(task.getFormat()); String newExtension = determineExtension(rint); @@ -308,13 +313,19 @@ class FOPTaskStarter extends Starter { outf = new File(task.getOutdir(), outf.getName()); } try { - Configuration.put("baseDir", - fs.getDir(task.getProject()).toURL(). - toExternalForm()); - + if (task.getBasedir() != null) { + Configuration.put("baseDir", + task.getBasedir().toURL(). + toExternalForm()); + } else { + Configuration.put("baseDir", + fs.getDir(task.getProject()).toURL(). + toExternalForm()); + } + task.log("Using base directory: " + + Configuration.getValue("baseDir"), Project.MSG_DEBUG); } catch (Exception e) { - task.log("Error setting base directory", - Project.MSG_DEBUG); + log.error("Error setting base directory", e); } render(f, outf, rint); @@ -348,11 +359,11 @@ class FOPTaskStarter extends Starter { Driver driver = new Driver(inputHandler.getInputSource(), out); driver.setLogger(log); driver.setRenderer(renderer); - if (renderer == Driver.RENDER_XML) { - HashMap rendererOptions = new HashMap(); - rendererOptions.put("fineDetail", new Boolean(true)); - driver.getRenderer().setOptions(rendererOptions); - } + if (renderer == Driver.RENDER_XML) { + HashMap rendererOptions = new HashMap(); + rendererOptions.put("fineDetail", new Boolean(true)); + driver.getRenderer().setOptions(rendererOptions); + } driver.setXMLReader(parser); driver.run(); out.close(); diff --git a/test/createpdf.sh b/test/createpdf.sh index 9f33a945b..267a93ec2 100755 --- a/test/createpdf.sh +++ b/test/createpdf.sh @@ -1,8 +1,12 @@ # this can be used to create pdf output of the testsuite files -$JAVA_HOME/bin/java -cp ../build/fop.jar:../lib/batik.jar:../lib/xalan-2.3.1.jar:../lib/xercesImpl-2.0.1.jar:../lib/xml-apis.jar:../lib/avalon-framework-4.0.jar:../lib/logkit-1.0.jar:../lib/jimi-1.0.jar org.apache.fop.tools.TestConverter -pdf -b ./ basictests.xml +LIBDIR=../lib +LOCALCLASSPATH=$LIBDIR/batik.jar:$LIBDIR/xercesImpl-2.0.1.jar:$LIBDIR/xalan-2.3.1.jar:$LIBDIR/xml-apis.jar:$LIBDIR/bsf.jar +LOCALCLASSPATH=$LOCALCLASSPATH:$LIBDIR/jimi-1.0.jar:$LIBDIR/jai_core.jar:$LIBDIR/jai_codec.jar:$LIBDIR/avalon-framework-cvs-20020806.jar:$LIBDIR/logkit-1.0.jar -$JAVA_HOME/bin/java -cp ../build/fop.jar:../lib/batik.jar:../lib/xalan-2.3.1.jar:../lib/xercesImpl-2.0.1.jar:../lib/xml-apis.jar:../lib/avalon-framework-4.0.jar:../lib/logkit-1.0.jar:../lib/jimi-1.0.jar org.apache.fop.tools.TestConverter -pdf -b ./ bugtests.xml +$JAVA_HOME/bin/java -cp ../build/fop.jar:$LOCALCLASSPATH org.apache.fop.tools.TestConverter -pdf -b ./ basictests.xml + +$JAVA_HOME/bin/java -cp ../build/fop.jar:$LOCALCLASSPATH org.apache.fop.tools.TestConverter -pdf -b ./ bugtests.xml -- 2.39.5