【问题标题】:Strange CSS Exception while loading , updating and transcoding svg document using apache batik使用 apache batik 加载、更新和转码 svg 文档时出现奇怪的 CSS 异常
【发布时间】:2013-03-01 08:21:12
【问题描述】:

我正在通过以下代码行将 svg 文件加载到我的应用程序中

                                     parser = XMLResourceDescriptor.getXMLParserClassName();

                                     factory = new SAXSVGDocumentFactory(parser);

                                    // ua = new UserAgentAdapter();
                                    // loader = new DocumentLoader(ua);
                                    // ctx = new BridgeContext(ua, loader);
                                    // ctx.setDynamicState(BridgeContext.DYNAMIC);

                                    doc = factory.createSVGDocument(svg.toURI().toString());
                                    generator = new SVGGraphics2D(doc);

该文档是之前使用 SVG 生成器生成的,可以在所有 SVG 浏览器中查看,并且没有任何错误。

现在我正在更新文档

// 在这里对画布和图像本身进行高度/宽度计算 维度 d = calculateImageSize(true, true);

            System.out.println(" 400 DPI Original width " + d.getWidth()
                            + " height " + d.getHeight());

            generator.setSVGCanvasSize(d);

            Element root = doc.getDocumentElement();

            //root.setAttributeNS(null, "viewBox", ("0 0 " + (d.getWidth() + " " + d
                    // .getHeight())));

            NodeList imageList = root.getElementsByTagName("image");

             Node imageNode = imageList.item(0);

             Element image = (Element) imageNode;

             image.setAttributeNS(null, "width", String.valueOf(d.getWidth()));
             image.setAttributeNS(null, "height", String.valueOf(d.getHeight()));

            updateCanvas();

以下是 updateCanvas 实现

public void updateCanvas() {

            Element root = doc.getDocumentElement();
            generator.getRoot(root);
            canvas.setSVGDocument(doc);

    }

现在当我尝试使用以下方法保存此更新的文档时

public void savePngImage(String pngFile, boolean is400DPI) 抛出 IOException {

            OutputStream ostream = null;

            try {

                    System.gc();

                    ostream = new FileOutputStream(pngFile);

                    transCoder = new PNGTranscoder();

                    if (is400DPI) {
                            transCoder.addTranscodingHint(
                                            ImageTranscoder.KEY_PIXEL_UNIT_TO_MILLIMETER,
                                            new Float(0.0635f));
                    } else {
                            transCoder.addTranscodingHint(
                                            ImageTranscoder.KEY_PIXEL_UNIT_TO_MILLIMETER,
                                            new Float(0.3528f));
                    }

                    transCoder.addTranscodingHint(PNGTranscoder.KEY_INDEXED,
                                    new Integer(5));
                    transCoder.addTranscodingHint(ImageTranscoder.KEY_MEDIA, "screen");

                    TranscoderInput input = new TranscoderInput(canvas.getSVGDocument());
                    TranscoderOutput output = new TranscoderOutput(ostream);
                    // perform Transcoding
                    transCoder.transcode(input, output);

            } catch (TranscoderException te) {
                    te.printStackTrace();
                    throw new IOException(te.getMessage());
            } finally {
                    ostream.flush();
                    ostream.close();
            }
    }

每次运行,程序都会抛出随机异常,

喜欢

** CSSEngine: exception property.syntax.error:org.w3c.dom.DOMException: The "o" identifier is not a valid value for the "shape-rendering" property. p>

属性值:自动

* CSSEngine:异常 property.syntax.error:org.w3c.dom.DOMException:“”标识符不是“shape-rendering”属性的有效值。

属性值:自动

异常:org.w3c.dom.DOMException org.w3c.dom.DOMException:“”标识符不是“shape-rendering”属性的有效值。 在 org.apache.batik.css.engine.value.AbstractValueFactory.createInvalidIdentifierDOMException(AbstractValueFactory.java:50) 在 org.apache.batik.css.engine.value.IdentifierManager.createValue(IdentifierManager.java:48) 在 org.apache.batik.css.engine.CSSEngine$1.property(CSSEngine.java:744) 在 org.apache.batik.css.engine.CSSEngine.getCascadedStyleMap(CSSEngine.java:768) 在 org.apache.batik.css.engine.CSSEngine.getComputedStyle(CSSEngine.java:876) 在 org.apache.batik.bridge.CSSUtilities.getComputedStyle(CSSUtilities.java:82) 在 org.apache.batik.bridge.CSSUtilities.convertVisibility(CSSUtilities.java:579) 在 org.apache.batik.bridge.SVGSVGElementBridge.createGraphicsNode(SVGSVGElementBridge.java:142) 在 org.apache.batik.bridge.GVTBuilder.build(GVTBuilder.java:76) 在 org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:208) 在 com.mmg.app.svg.TiledImageTranscoder.transcode(TiledImageTranscoder.java:61) 在 org.apache.batik.transcoder.XMLAbstractTranscoder.transcode(XMLAbstractTranscoder.java:142) 在 org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:156) 在 com.mmg.app.svg.ShoeComponentPNGCreator.savePngImage(ShoeComponentPNGCreator.java:601) 在 com.mmg.app.svg.ShoeComponentPNGCreator.create72DPIOriginalImage(ShoeComponentPNGCreator.java:305) 在 com.mmg.app.svg.ShoeComponentPNGCreator.processStyleImaging(ShoeComponentPNGCreator.java:226) 在 com.mmg.app.svg.ShoeComponentPNGCreator.traverseFolder(ShoeComponentPNGCreator.java:186) 在 com.mmg.app.svg.ShoeComponentPNGCreator.main(ShoeComponentPNGCreator.java:662)

* CSSEngine:异常.... org.w3c.dom.DOMException: 文件:/F:/workspace/MonoGeneiousShoe/src/svg/72DPI/Style-5/Left_Style-5.svg: 属性“shape-rendering”表示无效的 CSS 值(“auto”)。 原始信息: “”标识符不是“shape-rendering”属性的有效值。 在 org.apache.batik.css.engine.CSSEngine.getCascadedStyleMap(CSSEngine.java:784) 在 org.apache.batik.css.engine.CSSEngine.getComputedStyle(CSSEngine.java:876) 在 org.apache.batik.bridge.CSSUtilities.getComputedStyle(CSSUtilities.java:82) 在 org.apache.batik.bridge.CSSUtilities.convertVisibility(CSSUtilities.java:579) 在 org.apache.batik.bridge.SVGSVGElementBridge.createGraphicsNode(SVGSVGElementBridge.java:142) 在 org.apache.batik.bridge.GVTBuilder.build(GVTBuilder.java:76) 在 org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:208) 在 com.mmg.app.svg.TiledImageTranscoder.transcode(TiledImageTranscoder.java:61) 在 org.apache.batik.transcoder.XMLAbstractTranscoder.transcode(XMLAbstractTranscoder.java:142) 在 org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:156) 在 com.mmg.app.svg.ShoeComponentPNGCreator.savePngImage(ShoeComponentPNGCreator.java:601) 在 com.mmg.app.svg.ShoeComponentPNGCreator.create72DPIOriginalImage(ShoeComponentPNGCreator.java:305) 在 com.mmg.app.svg.ShoeComponentPNGCreator.processStyleImaging(ShoeComponentPNGCreator.java:226) 在 com.mmg.app.svg.ShoeComponentPNGCreator.traverseFolder(ShoeComponentPNGCreator.java:186) 在 com.mmg.app.svg.ShoeComponentPNGCreator.main(ShoeComponentPNGCreator.java:662)

异常:org.w3c.dom.DOMException org.w3c.dom.DOMException:“o”标识符不是“shape-rendering”属性的有效值。 在 org.apache.batik.css.engine.value.AbstractValueFactory.createInvalidIdentifierDOMException(AbstractValueFactory.java:50) 在 org.apache.batik.css.engine.value.IdentifierManager.createValue(IdentifierManager.java:48) 在 org.apache.batik.css.engine.CSSEngine$1.property(CSSEngine.java:744) 在 org.apache.batik.css.engine.CSSEngine.getCascadedStyleMap(CSSEngine.java:768) 在 org.apache.batik.css.engine.CSSEngine.getComputedStyle(CSSEngine.java:876) 在 org.apache.batik.bridge.CSSUtilities.getComputedStyle(CSSUtilities.java:82) 在 org.apache.batik.bridge.CSSUtilities.convertVisibility(CSSUtilities.java:579) 在 org.apache.batik.bridge.SVGSVGElementBridge.createGraphicsNode(SVGSVGElementBridge.java:142) 在 org.apache.batik.bridge.GVTBuilder.build(GVTBuilder.java:76) 在 org.apache.batik.swing.svg.GVTTreeBuilder.run(GVTTreeBuilder.java:96) 错误:空 封闭的例外: 文件:/F:/workspace/MonoGeneiousShoe/src/svg/72DPI/Style-5/Left_Style-5.svg: 属性“shape-rendering”表示无效的 CSS 值(“auto”)。 原始信息: “”标识符不是“shape-rendering”属性的有效值。

* CSSEngine:异常.... org.w3c.dom.DOMException: 文件:/F:/workspace/MonoGeneiousShoe/src/svg/72DPI/Style-5/Left_Style-5.svg: 属性“shape-rendering”表示无效的 CSS 值(“auto”)。 原始信息: “o”标识符不是“shape-rendering”属性的有效值。 在 org.apache.batik.css.engine.CSSEngine.getCascadedStyleMap(CSSEngine.java:784) 在 org.apache.batik.css.engine.CSSEngine.getComputedStyle(CSSEngine.java:876) 在 org.apache.batik.bridge.CSSUtilities.getComputedStyle(CSSUtilities.java:82) 在 org.apache.batik.bridge.CSSUtilities.convertVisibility(CSSUtilities.java:579) 在 org.apache.batik.bridge.SVGSVGElementBridge.createGraphicsNode(SVGSVGElementBridge.java:142) 在 org.apache.batik.bridge.GVTBuilder.build(GVTBuilder.java:76) 在 org.apache.batik.swing.svg.GVTTreeBuilder.run(GVTTreeBuilder.java:96) 错误:空 封闭的例外: 文件:/F:/workspace/MonoGeneiousShoe/src/svg/72DPI/Style-5/Left_Style-5.svg: 属性“shape-rendering”表示无效的 CSS 值(“auto”)。 原始信息: “o”标识符不是“shape-rendering”属性的有效值。

* CSSEngine:异常 property.syntax.error:org.w3c.dom.DOMException:“lormal”标识符不是“font-style”属性的有效值。

属性值:正常

异常:org.w3c.dom.DOMException org.w3c.dom.DOMException:“lormal”标识符不是“font-style”属性的有效值。 在 org.apache.batik.css.engine.value.AbstractValueFactory.createInvalidIdentifierDOMException(AbstractValueFactory.java:50) 在 org.apache.batik.css.engine.value.IdentifierManager.createValue(IdentifierManager.java:48) 在 org.apache.batik.css.engine.CSSEngine$1.property(CSSEngine.java:744) 在 org.apache.batik.css.engine.CSSEngine.getCascadedStyleMap(CSSEngine.java:768) 在 org.apache.batik.css.engine.CSSEngine.getComputedStyle(CSSEngine.java:876) 在 org.apache.batik.bridge.CSSUtilities.getComputedStyle(CSSUtilities.java:82) 在 org.apache.batik.bridge.CSSUtilities.convertVisibility(CSSUtilities.java:579) 在 org.apache.batik.bridge.SVGSVGElementBridge.createGraphicsNode(SVGSVGElementBridge.java:142) 在 org.apache.batik.bridge.GVTBuilder.build(GVTBuilder.java:76) 在 org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:208) 在 com.mmg.app.svg.TiledImageTranscoder.transcode(TiledImageTranscoder.java:61) 在 org.apache.batik.transcoder.XMLAbstractTranscoder.transcode(XMLAbstractTranscoder.java:142) 在 org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:156) 在 com.mmg.app.svg.ShoeComponentPNGCreator.savePngImage(ShoeComponentPNGCreator.java:601) 在 com.mmg.app.svg.ShoeComponentPNGCreator.create72DPIOriginalImage(ShoeComponentPNGCreator.java:305) 在 com.mmg.app.svg.ShoeComponentPNGCreator.processStyleImaging(ShoeComponentPNGCreator.java:226) 在 com.mmg.app.svg.ShoeComponentPNGCreator.traverseFolder(ShoeComponentPNGCreator.java:186) 在 com.mmg.app.svg.ShoeComponentPNGCreator.main(ShoeComponentPNGCreator.java:662)

* CSSEngine:异常.... org.w3c.dom.DOMException: 文件:/F:/workspace/MonoGeneiousShoe/src/svg/72DPI/Style-5/Left_Style-5.svg: 属性“font-style”表示无效的 CSS 值(“正常”)。 原始信息: “lormal”标识符不是“font-style”属性的有效值。 在 org.apache.batik.css.engine.CSSEngine.getCascadedStyleMap(CSSEngine.java:784) 在 org.apache.batik.css.engine.CSSEngine.getComputedStyle(CSSEngine.java:876) 在 org.apache.batik.bridge.CSSUtilities.getComputedStyle(CSSUtilities.java:82) 在 org.apache.batik.bridge.CSSUtilities.convertVisibility(CSSUtilities.java:579) 在 org.apache.batik.bridge.SVGSVGElementBridge.createGraphicsNode(SVGSVGElementBridge.java:142) 在 org.apache.batik.bridge.GVTBuilder.build(GVTBuilder.java:76) 在 org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:208) 在 com.mmg.app.svg.TiledImageTranscoder.transcode(TiledImageTranscoder.java:61) 在 org.apache.batik.transcoder.XMLAbstractTranscoder.transcode(XMLAbstractTranscoder.java:142) 在 org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:156) 在 com.mmg.app.svg.ShoeComponentPNGCreator.savePngImage(ShoeComponentPNGCreator.java:601) 在 com.mmg.app.svg.ShoeComponentPNGCreator.create72DPIOriginalImage(ShoeComponentPNGCreator.java:305) 在 com.mmg.app.svg.ShoeComponentPNGCreator.processStyleImaging(ShoeComponentPNGCreator.java:226) 在 com.mmg.app.svg.ShoeComponentPNGCreator.traverseFolder(ShoeComponentPNGCreator.java:186) 在 com.mmg.app.svg.ShoeComponentPNGCreator.main(ShoeComponentPNGCreator.java:662) 错误:空 封闭的例外: 文件:/F:/workspace/MonoGeneiousShoe/src/svg/72DPI/Style-5/Left_Style-5.svg: 属性“font-style”表示无效的 CSS 值(“正常”)。 原始信息: “lormal”标识符不是“font-style”属性的有效值。 java.lang.NullPointerException 在 com.mmg.app.svg.TiledImageTranscoder.transcode(TiledImageTranscoder.java:69) 在 org.apache.batik.transcoder.XMLAbstractTranscoder.transcode(XMLAbstractTranscoder.java:142) 在 org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:156) 在 com.mmg.app.svg.ShoeComponentPNGCreator.savePngImage(ShoeComponentPNGCreator.java:601) 在 com.mmg.app.svg.ShoeComponentPNGCreator.create72DPIOriginalImage(ShoeComponentPNGCreator.java:305) 在 com.mmg.app.svg.ShoeComponentPNGCreator.processStyleImaging(ShoeComponentPNGCreator.java:226) 在 com.mmg.app.svg.ShoeComponentPNGCreator.traverseFolder(ShoeComponentPNGCreator.java:186) 在 com.mmg.app.svg.ShoeComponentPNGCreator.main(ShoeComponentPNGCreator.java:662)

有时它说 height 是 0 ,有时它说 stroke-width 是无效属性等。

我认为这是与 CSS 引擎相关的问题。我在这里做错了什么?

谢谢你 米希尔·帕雷赫

【问题讨论】:

    标签: java svg java-2d batik


    【解决方案1】:

    我找到了解决方案。问题是多个线程同时更新画布,这就是异常的原因。解决方案如下代码,

    UpdateManager updateManager = canvas.getUpdateManager();
    
                        updateManager.getUpdateRunnableQueue().invokeLater(
                                new Runnable() {
                                    @Override
                                    public void run() {
          // my update code here
    }
    

    谢谢

    【讨论】:

      猜你喜欢
      • 2017-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-13
      • 1970-01-01
      相关资源
      最近更新 更多