Search code examples
javaxmlcompiler-errorsxsl-foapache-fop

Apache FOP - The method getDefaultHandler() is undefined for the type Fop


I have a requirement to convert XML to PDF document for that am using XSL - Apache FOP (Java). Am getting the below error The method getDefaultHandler() is undefined for the type Fop for the below line

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

Please find my complete JAVA code.

public static void main (String args[])
    {
        // the XSL FO file
        File xsltfile = new File("sample2.xsl");
        // the XML file from which we take the name
        StreamSource source = new StreamSource(new File("sample2.xml"));
        // creation of transform source
        StreamSource transformSource = new StreamSource(xsltfile);
        // create an instance of fop factory
        FopFactory fopFactory = FopFactory.newInstance();
        // a user agent is needed for transformation
        FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
        // to store output
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();

        Transformer xslfoTransformer;
        try
        {
            xslfoTransformer = getTransformer(transformSource);
            // Construct fop with desired output format
                Fop fop;
            try
            {
                fop = fopFactory.newFop
                    (MimeConstants.MIME_PDF, foUserAgent, outStream);
                // Resulting SAX events (the generated FO) 
                // must be piped through to FOP
                        Result res = new SAXResult(fop.getDefaultHandler());

                // Start XSLT transformation and FOP processing
                try
                {
                        // everything will happen here..
                    xslfoTransformer.transform(source, res);
                    // if you want to get the PDF bytes, use the following code
                    //return outStream.toByteArray();

                    // if you want to save PDF file use the following code
                    File pdffile = new File("Result.pdf");
                    OutputStream out = new java.io.FileOutputStream(pdffile);
                                out = new java.io.BufferedOutputStream(out);
                                FileOutputStream str = new FileOutputStream(pdffile);
                                str.write(outStream.toByteArray());
                                str.close();
                                out.close();

                }
                catch (TransformerException e) {
                    throw e;
                }
            }
            catch (FOPException e) {
                throw e;
            }
        }
        catch (TransformerConfigurationException e)
        {
            throw e;
        }
        catch (TransformerFactoryConfigurationError e)
        {
            throw e;
        }
    }

    private static Transformer getTransformer(StreamSource streamSource)
    {
        // setup the xslt transformer
        net.sf.saxon.TransformerFactoryImpl impl = 
                new net.sf.saxon.TransformerFactoryImpl();

        try {
            return impl.newTransformer(streamSource);

        } catch (TransformerConfigurationException e) {
            e.printStackTrace();
        }
        return null;
    }

Please find my dependencies:

<!-- https://mvnrepository.com/artifact/fop/fop -->
<dependency>
    <groupId>fop</groupId>
    <artifactId>fop</artifactId>
    <version>0.20.5</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.xmlgraphics/fop -->
<dependency>
    <groupId>org.apache.xmlgraphics</groupId>
    <artifactId>fop</artifactId>
    <version>2.2</version>
</dependency>

<!-- https://mvnrepository.com/artifact/net.sf.saxon/Saxon-HE -->
<dependency>
    <groupId>net.sf.saxon</groupId>
    <artifactId>Saxon-HE</artifactId>
    <version>9.8.0-11</version>
</dependency>

Solution

  • You have both an old and a new version of fop in your dependencies. So your IDE or Java compiler must be picking up the old version, which does not have that method. Remove the old version from your dependencies.