2

i'm using struts 2 and i'm trying to use fop to create a pdf file from xml and xsl. I develop my code in base this two url http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/examples/embedding/java/embedding/ExampleXML2PDF.java?view=markup and http://justcode.wordpress.com/2009/01/16/generare-pdf-con-struts2-fop-xml-e-xslt/

here's my code, i'm trying using two different ways

public class JspToPdfTest extends ActionSupport{

private InputStream inputStream;
private Xml2PdfManager xml2PdfManager;

public InputStream getInputStream() {
    return inputStream;
}
public void setInputStream(InputStream inputStream) {
    this.inputStream = inputStream;
}   
public JspToPdfTest(){
    xml2PdfManager = new Xml2PdfManager();
}

public String doPrint()  {
    String xml = "C:\\Users\\Administrator\\workspace\\path\\actions\\forms\\testeFOPxml.xml";
    String xslPath = "C:\\Users\\Administrator\\workspace\\path\\actions\\forms\\xml2fo.xsl";
    InputStream xmlInput = new ByteArrayInputStream(xml.getBytes());

    ByteArrayOutputStream out = (ByteArrayOutputStream) xml2PdfManager.convertXML2PDF(xmlInput, new File(xslPath));

    inputStream = new ByteArrayInputStream(out.toByteArray());
    return SUCCESS;
}

public String xmlToPdf() {
                try {
                    System.out.println("FOP ExampleXML2PDF\n");
                    System.out.println("Preparing...");

                    File baseDir = new File("C:\\Users\\Administrator\\workspace\\path\\actions\\forms\\");
                    File outDir = new File(baseDir, "out");
                    outDir.mkdirs();

                    File xmlfile = new File(baseDir, "testeFOPxml.xml");
                    File xsltfile = new File(baseDir, "xml2fo.xsl");
                    File pdffile = new File(outDir, "ResultXML2PDF.pdf");

                    final FopFactory fopFactory = FopFactory.newInstance();

                    FOUserAgent foUserAgent = fopFactory.newFOUserAgent();

                    OutputStream out = new java.io.FileOutputStream(pdffile);
                    out = new java.io.BufferedOutputStream(out);

                    try {
                        Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);

                    TransformerFactory factory = TransformerFactory.newInstance();
                    Transformer transformer = factory.newTransformer(new StreamSource(xsltfile));

                        transformer.setParameter("versionParam", "2.0");

                        Source src = new StreamSource(xmlfile);

                        Result res = new SAXResult(fop.getDefaultHandler());

                        transformer.transform(src, res);
                    } finally {
                        out.close();
                    }
                } catch (Exception e) {
                e.printStackTrace(System.err);
                    System.exit(-1);
                }
            return SUCCESS;
            }
}

and the struts.xml action

<action name="printDomAction2" class="com.somePackage.actions.JspToPdfTest"  method="xmlToPdf"> -->
        <result type="stream" name="success"> 
            <param name="contentType">application/pdf</param>
            <param name="contentDisposition">filename="dom.pdf"</param> 
            <param name="bufferSize">1024</param> 
        </result> 
        <interceptor-ref name="defaultStack"/> 
    </action>

    <action name="printDomAction" class="com.somePackage.actions.JspToPdfTest"  method="doPrint">
        <result type="stream" name="success">
            <param name="contentType">application/pdf</param>
            <param name="contentDisposition">filename="dom.pdf"</param>
            <param name="bufferSize">1024</param>
        </result>
        <interceptor-ref name="defaultStack"/>
    </action>

finnaly the xml2PdfManager.convertXML2PDF method:

public OutputStream convertXML2PDF(InputStream xml, File xsl) {
    ByteArrayOutputStream out = new ByteArrayOutputStream();

    FopFactory fopFactory = FopFactory.newInstance();

    TransformerFactory tFactory = TransformerFactory.newInstance();

    try {
    Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, out);

    Source src = new StreamSource(xml);

    Source xsltSrc = new StreamSource(xsl);
    Transformer transformer = tFactory.newTransformer(xsltSrc);

    Result res = new SAXResult(fop.getDefaultHandler());
    transformer.transform(src, res);
    } catch (Exception e) {
        e.printStackTrace(System.err);
    }
    return out;
    }

in both situations i've got:

java.lang.NoSuchMethodError:     
org.apache.xmlgraphics.util.Service.providerNames(Ljava/lang/Class;)Ljava/util/Iterator; 

when i do the FopFactory.newInstance();

Any sugestion to help me woud be great!!

tviana
  • 407
  • 4
  • 20
  • are you able to do it standard alone? – MohanaRao SV Mar 19 '13 at 18:41
  • Are you using the correct library versions of everything? How are you managing your dependencies? – Dave Newton Mar 19 '13 at 19:03
  • @MohanaRao SV no, i did not try to do it stand alone.. I must implement it using struts2 and spring... – tviana Mar 19 '13 at 19:09
  • @Dave Newton about the libraries yes, i think i have all and the correct libraries, about the dependencies i don't know how to answer you, how am i supose to manage dependencies? I'm a litle confused.. – tviana Mar 19 '13 at 19:10
  • @dabasiu The point of trying it standalone is to see if it's an environment issue, code issue, etc. without the additional overhead of working it into S2. "Thinking" you have all the correct versions is not sufficient, you must *know* you have all the correct versions. One way to do that is by using a dependency management tool like Maven, Gradle, and so on. – Dave Newton Mar 19 '13 at 19:12

1 Answers1

2

I solved my problem! I had the xmlgraphics-commons-1.3 instead of the xmlgraphics-commons-1.5. It's strange because i used all the libraries that came with the fop bin.

By the way the code that convert and show on the browser the pdf file is the follow:

<action name="printDomAction" class="com.somePackage.actions.JspToPdfTest"  method="xmlToPdf">
        <result type="stream" name="success">
            <param name="contentType">application/pdf</param>
            <param name="contentDisposition">filename="ResultXML2PDF.pdf"</param>
            <param name="bufferSize">1024</param>
        </result>
        <interceptor-ref name="defaultStack"/>
    </action>

and the method

private InputStream inputStream;

public String xmlToPdf() {
                try {
                    System.out.println("FOP ExampleXML2PDF\n");
                    System.out.println("Preparing...");

                    // Setup directories
                    File baseDir = new File("C:\\Users\\Administrator\\workspace\\path\\actions\\forms\\");
                    File outDir = new File(baseDir, "out");
                    outDir.mkdirs();

                    // Setup input and output files
                    File xmlfile = new File(baseDir, "testeFOPxml.xml");
                    File xsltfile = new File(baseDir, "xml2fo.xsl");
                    File pdffile = new File(outDir, "ResultXML2PDF.pdf");

                    System.out.println("Input: XML (" + xmlfile + ")");
                    System.out.println("Stylesheet: " + xsltfile);
                    System.out.println("Output: PDF (" + pdffile + ")");
                    System.out.println();
                    System.out.println("Transforming...");

                    // configure fopFactory as desired
                    final FopFactory fopFactory = FopFactory.newInstance();

                    FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
                    // configure foUserAgent as desired

                    ByteArrayOutputStream out = new ByteArrayOutputStream();

                    TransformerFactory tFactory = TransformerFactory.newInstance();


                    Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF,foUserAgent, out);
                    //Setup input
                    Source src = new StreamSource(xmlfile);

                    //Setup Transformer
                    Source xsltSrc = new StreamSource(xsltfile);
                    Transformer transformer = tFactory.newTransformer(xsltSrc);

                    //Make sure the XSL transformation's result is piped through to FOP
                    Result res = new SAXResult(fop.getDefaultHandler());
                    transformer.transform(src, res);

                    System.out.println("Success!");
                    ByteArrayOutputStream baos = out;
                    inputStream = new ByteArrayInputStream(baos.toByteArray());
                } catch (Exception e) {
                e.printStackTrace(System.err);
                    System.exit(-1);
                }

            return SUCCESS;
            }

Thanks everybody for the tips and the help!

tviana
  • 407
  • 4
  • 20