Description:
XSL-FO is an XML based markup language describing the formatting of XML data for output to sreen, paper or other media.
So, I'm going to describe the way we can convert XSL-FO to PDF using custom mediator.
Tested Environment:
JDK 1.8
Steps
Step 1:
Add below listed depended JAR's to the project (pom.xml)
<dependency> <groupId>org.apache.xmlgraphics</groupId> <artifactId>fop</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>org.apache.xmlgraphics</groupId> <artifactId>xmlgraphics-commons</artifactId> <version>1.5</version> </dependency> <dependency> <groupId>org.apache.xmlgraphics</groupId> <artifactId>batik-bridge</artifactId> <version>1.8</version> </dependency> <dependency> <groupId>org.apache.xmlgraphics</groupId> <artifactId>batik-gvt</artifactId> <version>1.7</version> </dependency> <dependency> <groupId>org.apache.xmlgraphics</groupId> <artifactId>batik-transcoder</artifactId> <version>1.8</version> </dependency> <dependency> <groupId>org.apache.avalon.framework</groupId> <artifactId>avalon-framework-api</artifactId> <version>4.3.1</version> </dependency> <dependency> <groupId>batik</groupId> <artifactId>batik-1.5-fop</artifactId> <version>0.20-5</version> </dependency>
Step 2:
Implement class mediator as below
package org.syntouch.esb.mediators; import java.io.*; import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.sax.SAXResult; import javax.xml.transform.stream.StreamSource; import org.apache.axiom.om.OMElement; import org.apache.axiom.soap.SOAPBody; import org.apache.fop.apps.FOPException; import org.apache.fop.apps.Fop; import org.apache.fop.apps.FopFactory; import org.apache.fop.apps.MimeConstants; import org.apache.synapse.MessageContext; import org.apache.synapse.mediators.AbstractMediator; /** * Created by tharanga on 2/7/17. */ public class TestFile extends AbstractMediator { @Override public boolean mediate(MessageContext messageContext) { trace.info("PdfCreationMediator Process Started"); SOAPBody soapBody = messageContext.getEnvelope().getBody(); OMElement firstElement = soapBody.getFirstElement(); OutputStream out = null; try { out = new BufferedOutputStream(new FileOutputStream(new File("/home/tharanga/workspace/home/XSL-FO-to-pdf/invoice.pdf"))); final FopFactory fopFactory = FopFactory.newInstance(); Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, out); TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newTransformer(); String firstElementAsString = firstElement.toString(); Source src = new StreamSource(new StringReader(firstElementAsString)); Result res = new SAXResult(fop.getDefaultHandler()); transformer.transform(src, res); trace.info("PdfCreationMediator Process Finished successfully"); } catch (FOPException | TransformerException | IOException e) { trace.info(new String("PdfCreationMediator Process Failed")); // e.printStackTrace(); } finally { // Clean-up try { out.close(); } catch (IOException e) { trace.info(new String("PdfCreationMediator Process Failed")); // e.printStackTrace(); } } return true; } }
Step 3:
Create a sample proxy to execute class mediator
<proxy xmlns="http://ws.apache.org/ns/synapse" name="Proxy1" startOnLoad="true" statistics="disable" trace="disable" transports="http,https"> <target> <inSequence> <class name="org.syntouch.esb.mediators.TestFile"/> </inSequence> </target> <description/> </proxy>
With the above steps, we can properly convert XSL-FO to PDf. In the above class mediator, I assiume that, XSL-FO data comes with the request body.
When execute the above sample, PDF file successfully store in the mentioned location.
No comments:
Post a Comment