You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

191 lines
4.8 KiB

/*
* PDFCreator.java
*
* Created on 19 de Abril de 2006, 18:20
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package siprp.util.fop;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import javax.swing.JFileChooser;
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.fop.apps.FOUserAgent;
import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FopFactory;
import org.apache.xmlgraphics.util.MimeConstants;
/**
* PDFCreator creates PDF's using FO.
*
* @author Frederico Palma
* @author João Neto
* @version %I%, %G%
*/
public class PDFCreator
{
// private final Translator translator = new SecureResourceBundle( null );
private static final Object LOCK = new Object();
private static PDFCreator pdfCreator;
FopFactory fopFactory;
private static File userConfig;
public static PDFCreator getPDFCreator()
{
synchronized (LOCK)
{
if (pdfCreator == null)
{
pdfCreator = new PDFCreator();
}
}
return pdfCreator;
}
public static File getUserConfig()
{
return userConfig;
}
public static void setUserConfig(File userConfig)
{
PDFCreator.userConfig = userConfig;
}
public static void main(String arg[]) throws Exception
{
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
final FOPCreator creator = FOPCreator.getFOPCreator();
System.out.println("Creating FO");
JFileChooser chooser = new JFileChooser();
chooser.setDialogTitle("Select XML data file:");
int returnVal = chooser.showOpenDialog(null);
String dataFile = null;
if (returnVal == JFileChooser.APPROVE_OPTION)
{
dataFile = chooser.getSelectedFile().getAbsolutePath();
}
chooser.setDialogTitle("Select XSL-FO template file:");
returnVal = chooser.showOpenDialog(null);
String templateFile = null;
if (returnVal == JFileChooser.APPROVE_OPTION)
{
templateFile = chooser.getSelectedFile().getAbsolutePath();
System.out.println(chooser.getSelectedFile().getAbsolutePath());
}
final String DATA = dataFile;
final String TEMPLATE = templateFile;
creator.createFOfromXML(new FileInputStream(DATA), new FileInputStream(TEMPLATE), baos);
// Thread t = new Thread() {
// public void run()
// {
// try
// {
// creator.createFOfromXML( new FileInputStream( DATA ),
// new FileInputStream( TEMPLATE ), baos );
// System.out.println( "FO created" );
// }
// catch( Exception ex )
// {
// ex.printStackTrace();
// }
// } };
// t.start();
// Thread.currentThread().sleep( 2 );
System.out.println("Starting to print");
// options.put( FOP_DUPLEX_TYPE,
// javax.print.attribute.standard.Sides.TUMBLE );
byte pdf[] = PDFCreator.getPDFCreator().createPdfFromFo(baos.toByteArray());
// new FOPPrinter().printFO( new FileInputStream( "c:\\simplecol.fo" ),
// true, false );
File pdfFile = new File("/home/jneto/Desktop/teste.pdf");
File foFile = new File("/home/jneto/Desktop/teste.fo");
pdfFile.createNewFile();
foFile.createNewFile();
FileOutputStream fos = new FileOutputStream(pdfFile);
FileOutputStream fofos = new FileOutputStream(foFile);
fos.write(pdf);
fofos.write(baos.toByteArray());
fos.close();
fofos.close();
System.out.println("DONE");
}
// /** Creates a new instance of PDFCreator */
// private PDFCreator()
// {
// fopFactory = FopFactory.newInstance();
// }
/** Creates a new instance of PDFCreator */
private PDFCreator()
{
fopFactory = FopFactory.newInstance();
if (userConfig != null)
{
try
{
fopFactory.setUserConfig(userConfig);
} catch (Exception e)
{
System.err.println("Ignoring invalid user config file");
e.printStackTrace();
}
}
}
/**
* Creates PDF content as an array of bytes, given FO content as an array of
* bytes.
*
* @param fo
* the byte[] with the FO content to convert
* @return the PDF content
* @throws Exception
* if the conversion fails
*
*/
public byte[] createPdfFromFo(byte[] fo) throws Exception
{
fopFactory.setStrictValidation(false);
ByteArrayOutputStream pdf = new ByteArrayOutputStream();
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, pdf);
Source src = new StreamSource(new ByteArrayInputStream(fo));
Result res = new SAXResult(fop.getDefaultHandler());
transformer.transform(src, res);
return pdf.toByteArray();
}
}