[ 
https://issues.apache.org/jira/browse/FOP-2490?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Hussein Shafie updated FOP-2490:
--------------------------------
    Description: 
h4. Embedded SVG 1.2 not supported by FOP 2.0

How to reproduce the problem (see attached files)

fop -fo __doc.fo -pdf __doc.pdf

Running this command fails with:
{noformat}
org.w3c.dom.DOMException: The current document is unable to create an element 
of the requested type (namespace: http://www.w3.org/2000/svg, name: 
svg:flowRoot).
        at org.apache.batik.dom.AbstractNode.createDOMException(Unknown Source)
        at 
org.apache.batik.anim.dom.SVGDOMImplementation.createElementNS(Unknown Source)
        at org.apache.batik.anim.dom.SVGOMDocument.createElementNS(Unknown 
Source)
        at org.apache.xml.utils.DOMBuilder.startElement(DOMBuilder.java:324)
        at 
org.apache.xalan.transformer.TransformerIdentityImpl.startElement(TransformerIdentityImpl.java:1072)
        at 
org.apache.fop.util.DelegatingContentHandler.startElement(DelegatingContentHandler.java:185)
        at 
org.apache.fop.fo.extensions.svg.SVGDOMContentHandlerFactory$Handler.startElement(SVGDOMContentHandlerFactory.java:137)
        at org.apache.fop.fo.FOTreeBuilder.startElement(FOTreeBuilder.java:179)
        at 
org.apache.xalan.transformer.TransformerIdentityImpl.startElement(TransformerIdentityImpl.java:1072)
{noformat}

The expected result is EXPECTED__doc.pdf

My workaround:

In org/apache/fop/fo/extensions/svg/SVGDOMContentHandlerFactory.java, 
I've replaced:

{noformat}
        private DOMImplementation getDOMImplementation(String ver) {
            //TODO It would be great if Batik provided this method as static 
helper method.
            if (ver == null || ver.length() == 0
                    || ver.equals("1.0") || ver.equals("1.1")) {
                return SVGDOMImplementation.getDOMImplementation();
            } else if (ver.equals("1.2")) {
                try {
                    Class clazz = Class.forName(
                            
"org.apache.batik.dom.svg12.SVG12DOMImplementation");
                    return (DOMImplementation)clazz.getMethod(
                            "getDOMImplementation", (Class[])null).invoke(null, 
(Object[])null);
                } catch (Exception e) {
                    return SVGDOMImplementation.getDOMImplementation();
                }
            }
            throw new RuntimeException("Unsupport SVG version '" + ver + "'");
        }
{noformat}

by:

{noformat}
import org.apache.batik.anim.dom.SVG12DOMImplementation;

        private DOMImplementation getDOMImplementation(String ver) {
            //TODO It would be great if Batik provided this method as static 
helper method.
            if (ver == null || ver.length() == 0
                    || ver.equals("1.0") || ver.equals("1.1")) {
                return SVGDOMImplementation.getDOMImplementation();
            } else if (ver.equals("1.2")) {
                return SVG12DOMImplementation.getDOMImplementation();
            }
            throw new RuntimeException("Unsupport SVG version '" + ver + "'");
        }
{noformat}

org.apache.batik.anim.dom.SVG12DOMImplementation is always 
included in Batik-1.8-all.jar. Even if you prefer to keep Class.forName(), 
please note that org.apache.batik.dom.svg12.SVG12DOMImplementation 
no longer exists in Batik 1.8.



  was:
How to reproduce the problem (see attached files)

fop -fo __doc.fo -pdf __doc.pdf

Running this command fails with:
{noformat}
org.w3c.dom.DOMException: The current document is unable to create an element 
of the requested type (namespace: http://www.w3.org/2000/svg, name: 
svg:flowRoot).
        at org.apache.batik.dom.AbstractNode.createDOMException(Unknown Source)
        at 
org.apache.batik.anim.dom.SVGDOMImplementation.createElementNS(Unknown Source)
        at org.apache.batik.anim.dom.SVGOMDocument.createElementNS(Unknown 
Source)
        at org.apache.xml.utils.DOMBuilder.startElement(DOMBuilder.java:324)
        at 
org.apache.xalan.transformer.TransformerIdentityImpl.startElement(TransformerIdentityImpl.java:1072)
        at 
org.apache.fop.util.DelegatingContentHandler.startElement(DelegatingContentHandler.java:185)
        at 
org.apache.fop.fo.extensions.svg.SVGDOMContentHandlerFactory$Handler.startElement(SVGDOMContentHandlerFactory.java:137)
        at org.apache.fop.fo.FOTreeBuilder.startElement(FOTreeBuilder.java:179)
        at 
org.apache.xalan.transformer.TransformerIdentityImpl.startElement(TransformerIdentityImpl.java:1072)
{noformat}

The expected result is EXPECTED__doc.pdf

My workaround:

In org/apache/fop/fo/extensions/svg/SVGDOMContentHandlerFactory.java, 
I've replaced:

{noformat}
        private DOMImplementation getDOMImplementation(String ver) {
            //TODO It would be great if Batik provided this method as static 
helper method.
            if (ver == null || ver.length() == 0
                    || ver.equals("1.0") || ver.equals("1.1")) {
                return SVGDOMImplementation.getDOMImplementation();
            } else if (ver.equals("1.2")) {
                try {
                    Class clazz = Class.forName(
                            
"org.apache.batik.dom.svg12.SVG12DOMImplementation");
                    return (DOMImplementation)clazz.getMethod(
                            "getDOMImplementation", (Class[])null).invoke(null, 
(Object[])null);
                } catch (Exception e) {
                    return SVGDOMImplementation.getDOMImplementation();
                }
            }
            throw new RuntimeException("Unsupport SVG version '" + ver + "'");
        }
{noformat}

by:

{noformat}
import org.apache.batik.anim.dom.SVG12DOMImplementation;

        private DOMImplementation getDOMImplementation(String ver) {
            //TODO It would be great if Batik provided this method as static 
helper method.
            if (ver == null || ver.length() == 0
                    || ver.equals("1.0") || ver.equals("1.1")) {
                return SVGDOMImplementation.getDOMImplementation();
            } else if (ver.equals("1.2")) {
                return SVG12DOMImplementation.getDOMImplementation();
            }
            throw new RuntimeException("Unsupport SVG version '" + ver + "'");
        }
{noformat}

org.apache.batik.anim.dom.SVG12DOMImplementation is always 
included in Batik-1.8-all.jar. Even if you prefer to keep Class.forName(), 
please note that org.apache.batik.dom.svg12.SVG12DOMImplementation 
no longer exists in Batik 1.8.




> Embedded SVG 1.2 not supported by FOP 2.0
> -----------------------------------------
>
>                 Key: FOP-2490
>                 URL: https://issues.apache.org/jira/browse/FOP-2490
>             Project: FOP
>          Issue Type: Bug
>    Affects Versions: 2.0
>         Environment: Linux, Java 1.6 64-bit (not relevant)
>            Reporter: Hussein Shafie
>         Attachments: EXPECTED__doc.pdf, __doc.fo
>
>
> h4. Embedded SVG 1.2 not supported by FOP 2.0
> How to reproduce the problem (see attached files)
> fop -fo __doc.fo -pdf __doc.pdf
> Running this command fails with:
> {noformat}
> org.w3c.dom.DOMException: The current document is unable to create an element 
> of the requested type (namespace: http://www.w3.org/2000/svg, name: 
> svg:flowRoot).
>         at org.apache.batik.dom.AbstractNode.createDOMException(Unknown 
> Source)
>         at 
> org.apache.batik.anim.dom.SVGDOMImplementation.createElementNS(Unknown Source)
>         at org.apache.batik.anim.dom.SVGOMDocument.createElementNS(Unknown 
> Source)
>         at org.apache.xml.utils.DOMBuilder.startElement(DOMBuilder.java:324)
>         at 
> org.apache.xalan.transformer.TransformerIdentityImpl.startElement(TransformerIdentityImpl.java:1072)
>         at 
> org.apache.fop.util.DelegatingContentHandler.startElement(DelegatingContentHandler.java:185)
>         at 
> org.apache.fop.fo.extensions.svg.SVGDOMContentHandlerFactory$Handler.startElement(SVGDOMContentHandlerFactory.java:137)
>         at 
> org.apache.fop.fo.FOTreeBuilder.startElement(FOTreeBuilder.java:179)
>         at 
> org.apache.xalan.transformer.TransformerIdentityImpl.startElement(TransformerIdentityImpl.java:1072)
> {noformat}
> The expected result is EXPECTED__doc.pdf
> My workaround:
> In org/apache/fop/fo/extensions/svg/SVGDOMContentHandlerFactory.java, 
> I've replaced:
> {noformat}
>         private DOMImplementation getDOMImplementation(String ver) {
>             //TODO It would be great if Batik provided this method as static 
> helper method.
>             if (ver == null || ver.length() == 0
>                     || ver.equals("1.0") || ver.equals("1.1")) {
>                 return SVGDOMImplementation.getDOMImplementation();
>             } else if (ver.equals("1.2")) {
>                 try {
>                     Class clazz = Class.forName(
>                             
> "org.apache.batik.dom.svg12.SVG12DOMImplementation");
>                     return (DOMImplementation)clazz.getMethod(
>                             "getDOMImplementation", 
> (Class[])null).invoke(null, (Object[])null);
>                 } catch (Exception e) {
>                     return SVGDOMImplementation.getDOMImplementation();
>                 }
>             }
>             throw new RuntimeException("Unsupport SVG version '" + ver + "'");
>         }
> {noformat}
> by:
> {noformat}
> import org.apache.batik.anim.dom.SVG12DOMImplementation;
>         private DOMImplementation getDOMImplementation(String ver) {
>             //TODO It would be great if Batik provided this method as static 
> helper method.
>             if (ver == null || ver.length() == 0
>                     || ver.equals("1.0") || ver.equals("1.1")) {
>                 return SVGDOMImplementation.getDOMImplementation();
>             } else if (ver.equals("1.2")) {
>                 return SVG12DOMImplementation.getDOMImplementation();
>             }
>             throw new RuntimeException("Unsupport SVG version '" + ver + "'");
>         }
> {noformat}
> org.apache.batik.anim.dom.SVG12DOMImplementation is always 
> included in Batik-1.8-all.jar. Even if you prefer to keep Class.forName(), 
> please note that org.apache.batik.dom.svg12.SVG12DOMImplementation 
> no longer exists in Batik 1.8.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to