2013-03-13 18 views
1

我加載SVG文件通過下面的代碼行到我的應用程序奇怪的CSS異常而加載,更新和轉碼的SVG文件使用Apache蠟染

         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);

  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實施

公共無效updateCanvas(){

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

    } 

現在,當我試圖挽救這個更新的文檔具有以下方法

公共無效savePngImage(字符串pngFile ,布爾值爲400DPI) 拋出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:異常property.syntax.error:org.w3c.dom.DOMException中:該 「O」 標識符對於「形狀渲染」屬性不是有效的值。

AttrValue:汽車

* CSSEngine:異常property.syntax.error:org.w3c.dom.DOMException中:在 「」 標識符不是爲一個有效值 「形狀渲染」 屬性。

AttrValue:自動

例外:org.w3c.dom.DOMException中 org.w3c.dom.DOMException中:在 「」 標識符不是爲一有效的值 「形狀渲染」 屬性。 在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) at org.apache.batik.css.engine.CSSEngine.getCascadedStyleMap(CSSEngine.java:768) at org.apache.batik .css.engine.CSSEngine.getComputedStyle(CSSEngine.java:876) at org.apache.batik.bridge.CSSUtilities.getComputedStyle(CSSUtilities.java:82) at org.apache.batik.bridge.CSSUtilities.convertVisibility(CSSUtilities .java:579) at org.apache.batik.bridge.SVGSVGElementBridge.createGraphicsNode(SVGSVGElementBridge.java:142) at org.apache.batik.bridge.GVTBuilder.build(GVTBuilder.java:76) at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:208) at com.mmg.app.svg。 TiledImageTranscoder.transcode(TiledImageTranscoder.java:61) at org.apache.batik.transcoder.XMLAbstractTranscoder。在轉碼(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:電子xception .... org.w3c.dom.DOMException:file:/ F:/workspace/MonoGeneiousShoe/src/svg/72DPI/Style-5/Left_Style-5.svg: 屬性「形狀渲染」代表無效的CSS值(「auto」)。 原始消息: 「」標識符不是「形狀呈現」屬性的有效值。 at org.apache.batik.css.engine.CSSEngine.getCascadedStyleMap(CSSEngine.java:784) at org.apache.batik.css.engine.CSSEngine.getComputedStyle(CSSEngine.java:876) at org.apache。 batik.bridge.CSSUtilities.getComputedStyle(CSSUtilities.java:82) at org.apache.batik.bridge.CSSUtilities.convertVisibility(CSSUtilities.java:579) at org.apache.batik.bridge.SVGSVGElementBridge.createGraphicsNode(SVGSVGElementBridge。 java:142) at org.apache.batik.bridge.GVTBuilder.build(GVTBuilder.java:76) at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:208) at com.mmg。 app.svg.TiledImageTranscoder.transcode(TiledImageTranscoder.java:61) at org.apache.batik.transcoder.XMLAbstra ctTranscoder.transcode(XMLAbstractTranscoder.java:142) at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:156) at 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」標識符對於「形狀呈現」屬性不是有效值。 在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) at org.apache.batik.css.engine.CSSEngine.getCascadedStyleMap(CSSEngine.java:768) at org.apache.batik .css.engine.CSSEngine.getComputedStyle(CSSEngine.java:876) at org.apache.batik.bridge.CSSUtilities.getComputedStyle(CSSUtilities.java:82) at org.apache.batik.bridge.CSSUtilities.convertVisibility(CSSUtilities .java:579) at org.apache.batik.bridge.SVGSVGElementBridge.createGraphicsNode(SVGSVGElementBridge.java:142) at org.apache.batik.bridge.GVTBuilder.build(GVTBuilder.java:76) at org.apache.batik.swing.svg.GVTTreeBuilder.run(GVTTreeBuilder.java:96) 錯誤:null 附加異常: file:/ F:/ workspace/MonoGeneiousShoe/src/svg/72DPI/Style-5/Left_Style-5。svg: 屬性「形狀渲染」代表無效的CSS值(「auto」)。 原始消息: 「」標識符不是「形狀呈現」屬性的有效值。

* CSSEngine:例外.... org.w3c.dom.DOMException中:文件:/ F:/workspace/MonoGeneiousShoe/src/svg/72DPI/Style-5/Left_Style-5.svg: 「形狀呈現」屬性表示無效的CSS值(「auto」)。 原始消息: 「o」標識符對於「形狀呈現」屬性不是有效值。 at org.apache.batik.css.engine.CSSEngine.getCascadedStyleMap(CSSEngine.java:784) at org.apache.batik.css.engine.CSSEngine.getComputedStyle(CSSEngine.java:876) at org.apache。 batik.bridge.CSSUtilities.getComputedStyle(CSSUtilities.java:82) at org.apache.batik.bridge.CSSUtilities.convertVisibility(CSSUtilities.java:579) at org.apache.batik.bridge.SVGSVGElementBridge.createGraphicsNode(SVGSVGElementBridge。 (GVTBuilder.java:96) 錯誤:null(or null):org.apache.batik.swing.svg.GVTTreeBuilder.run 附加例外: file:/ F:/workspace/MonoGeneiousShoe/src/svg/72DPI/Style-5/Left_Style-5.svg: 屬性「形狀渲染」代表無效的CSS值(「auto」)。 原始消息: 「o」標識符對於「形狀呈現」屬性不是有效值。

* CSSEngine:異常property.syntax.error:org.w3c.dom.DOMException中:在 「lormal」 標識不是 「字體風格」 屬性的有效值。

AttrValue:正常

例外:org.w3c.dom.DOMException中 org.w3c.dom.DOMException中:在 「lormal」 標識符不是針對 「字體風格」 屬性的有效值。 在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) at org.apache.batik.css.engine.CSSEngine.getCascadedStyleMap(CSSEngine.java:768) at org.apache.batik .css.engine.CSSEngine.getComputedStyle(CSSEngine.java:876) at org.apache.batik.bridge.CSSUtilities.getComputedStyle(CSSUtilities.java:82) at org.apache.batik.bridge.CSSUtilities.convertVisibility(CSSUtilities .java:579) at org.apache.batik.bridge.SVGSVGElementBridge.createGraphicsNode(SVGSVGElementBridge.java:142) at org.apache.batik.bridge.GVTBuilder.build(GVTBuilder.java:76) at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:208) at 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值(「normal」)。 原始消息: 「lormal」標識符對於「font-style」屬性不是有效值。 at org.apache.batik.css.engine.CSSEngine.getCascadedStyleMap(CSSEngine.java:784) at org.apache.batik.css.engine.CSSEngine.getComputedStyle(CSSEngine.java:876) at org.apache。 batik.bridge.CSSUtilities.getComputedStyle(CSSUtilities.java:82) at org.apache.batik.bridge.CSSUtilities.convertVisibility(CSSUtilities.java:579) at org.apache.batik.bridge.SVGSVGElementBridge.createGraphicsNode(SVGSVGElementBridge。 java:142) at org.apache.batik.bridge.GVTBuilder.build(GVTBuilder.java:76) at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:208) at com.mmg。 app.svg.TiledImageTranscoder.transcode(TiledImageTranscoder.java:61) at org.apache.batik.transcoder.XMLAbstra ctTranscoder.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) ERROR:空 封閉式異常: 文件:/ F:/工作區/ MonoGeneiousShoe/SRC/SVG/72DPI /樣式-5/Left_Style-5.svg: 屬性「font-style」表示無效的CSS值(「normal」)。 原始消息: 「lormal」標識符對於「font-style」屬性不是有效值。 顯示java.lang.NullPointerException 在com.mmg.app.svg.TiledImageTranscoder.transcode(TiledImageTranscoder.java:69) 在org.apache.batik.transcoder.XMLAbstractTranscoder.transcode(XMLAbstractTranscoder.java:142) 在有機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)

有時候它說,高度爲0,有時它說筆劃寬度無效屬性等

我認爲這是CSS引擎相關的問題。我在這裏做錯了什麼?

謝謝 米希爾Parekh的

回答

0

我找到了解決辦法。問題是多個線程在同一時間更新畫布,這就是爲什麼異常。該解決方案是下面的代碼,

UpdateManager updateManager = canvas.getUpdateManager(); 

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

謝謝