You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-dev@xmlgraphics.apache.org by bu...@apache.org on 2004/10/07 15:00:22 UTC

DO NOT REPLY [Bug 31580] New: - fo:external-graphic does not work when src is an image URL which is in a jar-file

DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://issues.apache.org/bugzilla/show_bug.cgi?id=31580>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://issues.apache.org/bugzilla/show_bug.cgi?id=31580

fo:external-graphic  does not work when src is an image URL which is in a jar-file

           Summary: fo:external-graphic  does not work when src is an image
                    URL which is in a jar-file
           Product: Fop
           Version: 0.20.5
          Platform: Other
        OS/Version: Other
            Status: NEW
          Severity: Normal
          Priority: Other
         Component: images
        AssignedTo: fop-dev@xml.apache.org
        ReportedBy: h.wu@eurodata.de


Hi!

I found a problem when using url instead of file for fo:external-graphic's 
src paramater (FOP is 0.20.5 distribution). for example,

<fo:external-graphic height="15pt" width="180pt">
	<xsl:attribute name="src">url('/my/image/image.gif')</xsl:attribute>
</fo:external-graphic>


it will work with the following changes in class 
org.apache.fop.image.FopImageFactory.java

...

// Try to find the image as a class-resource first (for instance in a jar-
file)...
        try {
            imgIS = FopImageFactory.class.getResourceAsStream(href);
            absoluteURL = FopImageFactory.class.getResource(href);
        } catch (Exception e) {
        }

        if (imgIS == null) {
            try {
                // try url as complete first, this can cause
                // a problem with relative uri's if there is an
                // image relative to where fop is run and relative
                // to the base dir of the document
                try {
                    absoluteURL = new URL(href);
                } catch (MalformedURLException mue) {
                    // if the href contains onl a path then file is assumed
                    absoluteURL = new URL("file:" + href);
                }
                imgIS = absoluteURL.openStream();
            } catch (MalformedURLException e_context) {
                throw new FopImageException("Error with image URL: "
                    + e_context.getMessage());
            } catch (Exception e) {
                // maybe relative
                URL baseURL = Configuration.getBaseURL();

                if (baseURL == null) {
                    throw new FopImageException("Error with image URL: "
                        + e.getMessage()
                        + " and no base URL is specified");
                }

                try {
                    /*
                     This piece of code is based on the following statement in 
RFC2396 section 5.2:

                        3) If the scheme component is defined, indicating that 
the reference
                           starts with a scheme name, then the reference is 
interpreted as an
                           absolute URI and we are done.  Otherwise, the 
reference URI's
                           scheme is inherited from the base URI's scheme 
component.

                           Due to a loophole in prior specifications [RFC1630], 
some parsers
                           allow the scheme name to be present in a relative 
URI if it is the
                           same as the base URI scheme.  Unfortunately, this 
can conflict
                           with the correct parsing of non-hierarchical URI.  
For backwards
                           compatibility, an implementation may work around 
such references
                           by removing the scheme if it matches that of the 
base URI and the
                           scheme is known to always use the <hier_part> syntax.

                        The URL class does not implement this work around, so 
we do.
                     */

                    String scheme = baseURL.getProtocol() + ":";
                    System.out.println("scheme " + scheme);
                    if (href.startsWith(scheme)) {
                        href = href.substring(scheme.length());
                    }
                    System.out.println("href after " + href);
                    absoluteURL = new URL(baseURL, href);
                } catch (MalformedURLException e_context) {
                    throw new FopImageException("Invalid Image URL - error on 
relative URL : "
                        + e_context.getMessage());
                }
            }
        }


        // If not, check image type
        ImageReader imgReader = null;
...