Guys, I am using fop 2.2. I used following code (very much the same as what Brynjolfur shared above, but I get NullPointerException from the last line "transformer.transform( xml, res ). The xml and res objects are not null. What could be causing this error?
import com.wm.app.b2b.server.ServiceException;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.PrintWriter;
import java.io.StringReader;
import java.io.StringWriter;
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.FOPException;
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.intermediate.IFContext;
import org.apache.fop.render.intermediate.IFDocumentHandler;
import org.apache.fop.render.pdf.PDFDocumentHandlerMaker;
import org.apache.fop.render.pdf.PDFRendererConfig;
import org.apache.fop.render.pdf.PDFRendererConfigurator;
IDataCursor idc = pipeline.getCursor();
short linenum = 0;
String xmlString = IDataUtil.getString( idc, "xmlData" );
String xsltString = IDataUtil.getString ( idc, "xsltData" );
String errMsg = "";
ByteArrayOutputStream out = new ByteArrayOutputStream();
FopFactory fopFactory = null;
TransformerFactory tFactory = null;
Source xml = null;
Source xslt = null;
try{
fopFactory = FopFactory.newInstance(new File("./fop-2.2/conf/fop.xconf"));
linenum++; // 1
tFactory = TransformerFactory.newInstance();
linenum++; // 2
xml = new StreamSource( new StringReader( xmlString ) );
linenum++; // 3
xslt = new StreamSource( new StringReader( xsltString ) );
linenum++; // 4
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
linenum++; // 5
PDFRendererConfigurator pdfConfig = new PDFRendererConfigurator( foUserAgent, new PDFRendererConfig.PDFRendererConfigParser() );
linenum++; // 6
PDFDocumentHandlerMaker pdfMaker = new PDFDocumentHandlerMaker();
linenum++; // 7
IFDocumentHandler pdfHandler = pdfMaker.makeIFDocumentHandler( new IFContext(foUserAgent) );
linenum++; // 8
pdfConfig.configure( pdfHandler );
linenum++; // 9
foUserAgent.setDocumentHandlerOverride( pdfHandler );
linenum++; // 10
foUserAgent.getRendererOptions();
linenum++; // 11
Fop fop = fopFactory.newFop( MimeConstants.MIME_PDF, foUserAgent, out );
linenum++; // 12
Transformer transformer = tFactory.newTransformer( xslt );
linenum++; // 13
Result res = new SAXResult( fop.getDefaultHandler() );
linenum++; // 14
transformer.transform( xml, res );
}
catch( Exception e ){
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
errMsg = errMsg + "Error at linenum " + linenum + ": " + sw.toString();
IDataUtil.put( idc, "errorMessage", errMsg );
throw new ServiceException (errMsg);
}
finally{
if(out!=null) try {out.close();}catch(Exception e) {};
idc.destroy();
}
Well, I ended up using the sample from https://netjs.blogspot.com.tr/2015/07/how-to-create-pdf-from-xml-using-apache-fop.html. It worked.