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

Hussein Shafie updated FOP-2489:
--------------------------------
    Description: 
h4. An SVG file using markers is not rendered by FOP 2.0

How to reproduce the problem (see attached files)

fop -fo __doc.fo -pdf __doc.pdf

Running this command reports:
{noformat}
SEVERE: SVG graphic could not be built. Reason: 
org.apache.batik.bridge.BridgeException: resources/resources/header_layout.svg 
(No such file or directory)
org.apache.batik.bridge.BridgeException: resources/resources/header_layout.svg 
(No such file or directory)
        at org.apache.batik.bridge.BridgeContext.getReferencedNode(Unknown 
Source)
        at org.apache.batik.bridge.BridgeContext.getReferencedElement(Unknown 
Source)
        at org.apache.batik.bridge.PaintServer.convertMarker(Unknown Source)
        at org.apache.batik.bridge.PaintServer.convertMarkers(Unknown Source)
        at 
org.apache.batik.bridge.SVGDecoratedShapeElementBridge.createMarkerPainter(Unknown
 Source)
        at 
org.apache.batik.bridge.SVGDecoratedShapeElementBridge.createShapePainter(Unknown
 Source)
        at 
org.apache.batik.bridge.SVGShapeElementBridge.buildGraphicsNode(Unknown Source)
        at org.apache.batik.bridge.GVTBuilder.buildGraphicsNode(Unknown Source)
        at org.apache.batik.bridge.GVTBuilder.buildComposite(Unknown Source)
        at org.apache.batik.bridge.GVTBuilder.buildGraphicsNode(Unknown Source)
        at org.apache.batik.bridge.GVTBuilder.buildComposite(Unknown Source)
        at org.apache.batik.bridge.GVTBuilder.buildGraphicsNode(Unknown Source)
        at org.apache.batik.bridge.GVTBuilder.buildComposite(Unknown Source)
        at org.apache.batik.bridge.GVTBuilder.build(Unknown Source)
        at 
org.apache.fop.render.pdf.PDFImageHandlerSVG.handleImage(PDFImageHandlerSVG.java:103)
        at 
org.apache.fop.render.intermediate.AbstractIFPainter.drawImage(AbstractIFPainter.java:249)
        at 
org.apache.fop.render.intermediate.AbstractIFPainter.drawImage(AbstractIFPainter.java:205)
        at 
org.apache.fop.render.intermediate.AbstractIFPainter.drawImageUsingImageHandler(AbstractIFPainter.java:170)
        at 
org.apache.fop.render.intermediate.AbstractIFPainter.drawImageUsingURI(AbstractIFPainter.java:292)
        at org.apache.fop.render.pdf.PDFPainter.drawImage(PDFPainter.java:173)
        at 
org.apache.fop.render.intermediate.IFRenderer.drawImage(IFRenderer.java:1295)
        at 
org.apache.fop.render.intermediate.IFRenderer.renderImage(IFRenderer.java:1282)
        at 
org.apache.fop.render.AbstractRenderer.renderInlineViewport(AbstractRenderer.java:858)
{noformat}

The expected result is EXPECTED__doc.pdf

My workaround:

To resolve URLs such as "marker-start:url(#TriangleInM)", Batik 1.8 needs 
to know the URL of the SVG document it processes.

Therefore in org/apache/fop/apps/FOUserAgent.java, I've replaced:

{noformat}
    public StreamSource resolveURI(String uri) {
        // TODO: What do we want to do when resources aren't found??? We also 
need to remove this
        // method entirely
        try {
            // Have to do this so we can resolve data URIs
            StreamSource src = new 
StreamSource(resourceResolver.getResource(uri));
            src.setSystemId(uri);
            return src;
        } catch (URISyntaxException use) {
            return null;
        } catch (IOException ioe) {
            return null;
        }
    }
{noformat}

by:

{noformat}
    public StreamSource resolveURI(String uri) {
        // TODO: What do we want to do when resources aren't found??? We also 
need to remove this
        // method entirely
        try {
            // Have to do this so we can resolve data URIs
            StreamSource src = new 
StreamSource(resourceResolver.getResource(uri));

            // A systemId is always expected to be absolute.
            // Anyway, without this, SVG files using markers 
            // (e.g. marker-start:url(#TriangleInM)) cannot be rendered.

            if (!uri.startsWith("data:")) {
                uri = 
resourceResolver.getBaseURI().resolve(uri).toASCIIString();
            }

            src.setSystemId(uri);
            return src;
        } catch (URISyntaxException use) {
            return null;
        } catch (IOException ioe) {
            return null;
        }
    }
{noformat}


  was:
An SVG file using markers is not rendered by FOP 2.0
----------------------------------------------------

How to reproduce the problem (see attached files)

fop -fo __doc.fo -pdf __doc.pdf

Running this command reports:
{noformat}
SEVERE: SVG graphic could not be built. Reason: 
org.apache.batik.bridge.BridgeException: resources/resources/header_layout.svg 
(No such file or directory)
org.apache.batik.bridge.BridgeException: resources/resources/header_layout.svg 
(No such file or directory)
        at org.apache.batik.bridge.BridgeContext.getReferencedNode(Unknown 
Source)
        at org.apache.batik.bridge.BridgeContext.getReferencedElement(Unknown 
Source)
        at org.apache.batik.bridge.PaintServer.convertMarker(Unknown Source)
        at org.apache.batik.bridge.PaintServer.convertMarkers(Unknown Source)
        at 
org.apache.batik.bridge.SVGDecoratedShapeElementBridge.createMarkerPainter(Unknown
 Source)
        at 
org.apache.batik.bridge.SVGDecoratedShapeElementBridge.createShapePainter(Unknown
 Source)
        at 
org.apache.batik.bridge.SVGShapeElementBridge.buildGraphicsNode(Unknown Source)
        at org.apache.batik.bridge.GVTBuilder.buildGraphicsNode(Unknown Source)
        at org.apache.batik.bridge.GVTBuilder.buildComposite(Unknown Source)
        at org.apache.batik.bridge.GVTBuilder.buildGraphicsNode(Unknown Source)
        at org.apache.batik.bridge.GVTBuilder.buildComposite(Unknown Source)
        at org.apache.batik.bridge.GVTBuilder.buildGraphicsNode(Unknown Source)
        at org.apache.batik.bridge.GVTBuilder.buildComposite(Unknown Source)
        at org.apache.batik.bridge.GVTBuilder.build(Unknown Source)
        at 
org.apache.fop.render.pdf.PDFImageHandlerSVG.handleImage(PDFImageHandlerSVG.java:103)
        at 
org.apache.fop.render.intermediate.AbstractIFPainter.drawImage(AbstractIFPainter.java:249)
        at 
org.apache.fop.render.intermediate.AbstractIFPainter.drawImage(AbstractIFPainter.java:205)
        at 
org.apache.fop.render.intermediate.AbstractIFPainter.drawImageUsingImageHandler(AbstractIFPainter.java:170)
        at 
org.apache.fop.render.intermediate.AbstractIFPainter.drawImageUsingURI(AbstractIFPainter.java:292)
        at org.apache.fop.render.pdf.PDFPainter.drawImage(PDFPainter.java:173)
        at 
org.apache.fop.render.intermediate.IFRenderer.drawImage(IFRenderer.java:1295)
        at 
org.apache.fop.render.intermediate.IFRenderer.renderImage(IFRenderer.java:1282)
        at 
org.apache.fop.render.AbstractRenderer.renderInlineViewport(AbstractRenderer.java:858)
{noformat}

The expected result is EXPECTED__doc.pdf

My workaround:

To resolve URLs such as "marker-start:url(#TriangleInM)", Batik 1.8 needs 
to know the URL of the SVG document it processes.

Therefore in org/apache/fop/apps/FOUserAgent.java, I've replaced:

{noformat}
    public StreamSource resolveURI(String uri) {
        // TODO: What do we want to do when resources aren't found??? We also 
need to remove this
        // method entirely
        try {
            // Have to do this so we can resolve data URIs
            StreamSource src = new 
StreamSource(resourceResolver.getResource(uri));
            src.setSystemId(uri);
            return src;
        } catch (URISyntaxException use) {
            return null;
        } catch (IOException ioe) {
            return null;
        }
    }
{noformat}

by:

{noformat}
    public StreamSource resolveURI(String uri) {
        // TODO: What do we want to do when resources aren't found??? We also 
need to remove this
        // method entirely
        try {
            // Have to do this so we can resolve data URIs
            StreamSource src = new 
StreamSource(resourceResolver.getResource(uri));

            // A systemId is always expected to be absolute.
            // Anyway, without this, SVG files using markers 
            // (e.g. marker-start:url(#TriangleInM)) cannot be rendered.

            if (!uri.startsWith("data:")) {
                uri = 
resourceResolver.getBaseURI().resolve(uri).toASCIIString();
            }

            src.setSystemId(uri);
            return src;
        } catch (URISyntaxException use) {
            return null;
        } catch (IOException ioe) {
            return null;
        }
    }
{noformat}



> An SVG file using markers is not rendered by FOP 2.0
> ----------------------------------------------------
>
>                 Key: FOP-2489
>                 URL: https://issues.apache.org/jira/browse/FOP-2489
>             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, __doc.pdf, header_layout.svg
>
>
> h4. An SVG file using markers is not rendered by FOP 2.0
> How to reproduce the problem (see attached files)
> fop -fo __doc.fo -pdf __doc.pdf
> Running this command reports:
> {noformat}
> SEVERE: SVG graphic could not be built. Reason: 
> org.apache.batik.bridge.BridgeException: 
> resources/resources/header_layout.svg (No such file or directory)
> org.apache.batik.bridge.BridgeException: 
> resources/resources/header_layout.svg (No such file or directory)
>         at org.apache.batik.bridge.BridgeContext.getReferencedNode(Unknown 
> Source)
>         at org.apache.batik.bridge.BridgeContext.getReferencedElement(Unknown 
> Source)
>         at org.apache.batik.bridge.PaintServer.convertMarker(Unknown Source)
>         at org.apache.batik.bridge.PaintServer.convertMarkers(Unknown Source)
>         at 
> org.apache.batik.bridge.SVGDecoratedShapeElementBridge.createMarkerPainter(Unknown
>  Source)
>         at 
> org.apache.batik.bridge.SVGDecoratedShapeElementBridge.createShapePainter(Unknown
>  Source)
>         at 
> org.apache.batik.bridge.SVGShapeElementBridge.buildGraphicsNode(Unknown 
> Source)
>         at org.apache.batik.bridge.GVTBuilder.buildGraphicsNode(Unknown 
> Source)
>         at org.apache.batik.bridge.GVTBuilder.buildComposite(Unknown Source)
>         at org.apache.batik.bridge.GVTBuilder.buildGraphicsNode(Unknown 
> Source)
>         at org.apache.batik.bridge.GVTBuilder.buildComposite(Unknown Source)
>         at org.apache.batik.bridge.GVTBuilder.buildGraphicsNode(Unknown 
> Source)
>         at org.apache.batik.bridge.GVTBuilder.buildComposite(Unknown Source)
>         at org.apache.batik.bridge.GVTBuilder.build(Unknown Source)
>         at 
> org.apache.fop.render.pdf.PDFImageHandlerSVG.handleImage(PDFImageHandlerSVG.java:103)
>         at 
> org.apache.fop.render.intermediate.AbstractIFPainter.drawImage(AbstractIFPainter.java:249)
>         at 
> org.apache.fop.render.intermediate.AbstractIFPainter.drawImage(AbstractIFPainter.java:205)
>         at 
> org.apache.fop.render.intermediate.AbstractIFPainter.drawImageUsingImageHandler(AbstractIFPainter.java:170)
>         at 
> org.apache.fop.render.intermediate.AbstractIFPainter.drawImageUsingURI(AbstractIFPainter.java:292)
>         at org.apache.fop.render.pdf.PDFPainter.drawImage(PDFPainter.java:173)
>         at 
> org.apache.fop.render.intermediate.IFRenderer.drawImage(IFRenderer.java:1295)
>         at 
> org.apache.fop.render.intermediate.IFRenderer.renderImage(IFRenderer.java:1282)
>         at 
> org.apache.fop.render.AbstractRenderer.renderInlineViewport(AbstractRenderer.java:858)
> {noformat}
> The expected result is EXPECTED__doc.pdf
> My workaround:
> To resolve URLs such as "marker-start:url(#TriangleInM)", Batik 1.8 needs 
> to know the URL of the SVG document it processes.
> Therefore in org/apache/fop/apps/FOUserAgent.java, I've replaced:
> {noformat}
>     public StreamSource resolveURI(String uri) {
>         // TODO: What do we want to do when resources aren't found??? We also 
> need to remove this
>         // method entirely
>         try {
>             // Have to do this so we can resolve data URIs
>             StreamSource src = new 
> StreamSource(resourceResolver.getResource(uri));
>             src.setSystemId(uri);
>             return src;
>         } catch (URISyntaxException use) {
>             return null;
>         } catch (IOException ioe) {
>             return null;
>         }
>     }
> {noformat}
> by:
> {noformat}
>     public StreamSource resolveURI(String uri) {
>         // TODO: What do we want to do when resources aren't found??? We also 
> need to remove this
>         // method entirely
>         try {
>             // Have to do this so we can resolve data URIs
>             StreamSource src = new 
> StreamSource(resourceResolver.getResource(uri));
>             // A systemId is always expected to be absolute.
>             // Anyway, without this, SVG files using markers 
>             // (e.g. marker-start:url(#TriangleInM)) cannot be rendered.
>             if (!uri.startsWith("data:")) {
>                 uri = 
> resourceResolver.getBaseURI().resolve(uri).toASCIIString();
>             }
>             src.setSystemId(uri);
>             return src;
>         } catch (URISyntaxException use) {
>             return null;
>         } catch (IOException ioe) {
>             return null;
>         }
>     }
> {noformat}



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

Reply via email to