On 10/27/2010 5:50 AM, [email protected] wrote:
Hi Fawzib,

Fawzib Rojas <[email protected]> wrote on 10/21/2010 12:46:13 PM:

> Since it cant find the attribute, there is no namespace. I added
> some code so that if there is no namespace it adds it.
>
> After those changes things moved along a little bit farther down the
> line but now batik gives me a NullPointerException in
> JPEGTranscoder.writeImage, I checked the output stream and it is
> valid, so must be something else:

        It probably isn't finding the JPEG writer. So this line:

            ImageWriter writer = ImageWriterRegistry.getInstance()
                .getWriterFor("image/jpeg");

        Is returning NULL.  This is typically caused by Batik not
being able to find the file:
resources/META-INF/services/org.apache.batik.ext.awt.image.spi.ImageWriter

        Or potentially an inability to create the JPEGImageWriter
(possibly due to a lack of the com.sun.image.codec.jpeg classes.

Or because when I add batik-1.7 as a dependency in the pom.xml, all the dependencies are added *except* batik-codec. I was testing with the JPEG transcoder, when I tested the PNG transcoder it actually gave a decent error message: "Could not write PNG file because no WriteAdapter is available". I found a bug report (https://issues.apache.org/bugzilla/show_bug.cgi?id=44682) from *2008* explaining the problem and the solution. Two years (almost 3) and the problem still there.

I removed all the extra stuff from the SVGBuilder class, I only override startElement now. All I do is set things up so it doesnt crash with the standard SAXSVGDocumentFactory class:

public void startElement(String uri, String localName, String rawName,Attributes attributes) throws SAXException {
        // if we dont set a parser, it will crash, so set one up.
        if(parser==null){
            SAXParserFactory factory=SAXParserFactory.newInstance();
            SAXParser saxParser;
            try {
                saxParser = factory.newSAXParser();
            } catch (ParserConfigurationException pce) {
throw new SAXException("Could not create SAXParser: " + pce.getMessage());
            }
            parser = saxParser.getXMLReader();
        }
// if svg has no namespace transcoding wont work, so add it if not found // (Even if svg has namespace in the document, something somewhere removes it)
        if(localName.equals("svg")){
            AttributesImpl attrs=new AttributesImpl(attributes);
            String[] element=rawName.split(":");
            String key="xmlns";
            if(element.length>1) key="xmlns:"+element[0];
if(attrs.getIndex(key)==-1) attrs.addAttribute("","",key,"CDATA","http://www.w3.org/2000/svg";);
            super.startElement(uri, localName, rawName,attrs);
        }else{
            super.startElement(uri, localName, rawName,attributes);
        }
    }

It seems smaller (and cleaner) than what was there. After that change and adding the batik-codec dependency to the pom, all is working now. Thanks a lot for the help.

Reply via email to