import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.StringReader;

import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.stream.StreamSource;

import org.apache.commons.io.FileUtils;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.apps.MimeConstants;
import org.apache.fop.render.bitmap.TIFFRenderer;

public class FopTiffTester {

	public FopTiffTester() {}

	private static final String PATH = "C:\\test\\foptifftest\\";
	
	public static void main(String[] args) {

	    try {
	    	
	    	// Load the File Objects
	        File testPath = new File(PATH);
	        testPath.mkdirs();
	        File fopFile = new File(testPath, "testFop.xsl");
	        File tiffFile = new File(testPath, String.valueOf(System.currentTimeMillis()) + ".tiff");

	        // Read FOP File to String
	        String fopString = FileUtils.readFileToString(fopFile);

	        // Get Fop Factory and Configure
    		FopFactory fopFactory = FopFactory.newInstance();

    		// Generate Fop User Agent and Configure
			FOUserAgent fopAgent = fopFactory.newFOUserAgent();

			TIFFRenderer renderer = new TIFFRenderer();
			renderer.setUserAgent(fopAgent);
			renderer.setTransparentPageBackground(true);
			renderer.getWriterParams().setCompressionMethod(TIFFRenderer.COMPRESSION_CCITT_T6);
			fopAgent.setRendererOverride(renderer);
			
			// Transform Fop to Tiff
			OutputStream outStream = new BufferedOutputStream(new FileOutputStream(tiffFile));
			Fop fop = fopFactory.newFop(MimeConstants.MIME_TIFF, fopAgent, outStream);
			Transformer transformer = TransformerFactory.newInstance().newTransformer();
			Source source = new StreamSource(new StringReader(fopString));
			Result result = new SAXResult(fop.getDefaultHandler());
			transformer.transform(source, result);
			outStream.close();
				
	    } catch (Exception ex) {
	    	ex.printStackTrace();
	    }
	}
}