繁体   English   中英

使用apache蜡染加载,更新和转码svg文档时出现奇怪的CSS异常

[英]Strange CSS Exception while loading , updating and transcoding svg document using apache batik

我正在通过以下代码行将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的实现

公共无效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:异常property.syntax.error:org.w3c.dom.DOMException:“ o”标识符对于“ shape-rendering”属性不是有效值。

属性值:自动

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

属性值:自动

Exception: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在org.apache.batik.css.engine.CSSEngine.getCascadedStyleMap(CSSEngine.java:768)处的.batik.css.engine.CSSEngine $ 1.property(CSSEngine.java:744)。 org.apache.batik.bridge.CSSUtilities.getComputedStyle(CSSUtilities.java:82)的org.apache.batik.bridge.CSSUtilities.convertVisibility(CSSUtilities.java:579)的CSSEngine.getComputedStyle(CSSEngine.java:876) org.apache.batik.bridge.GVTBuilder.build(GVTBuilder.java:76)的.apache.batik.bridge.SVGSVGElementBridge.createGraphicsNode(SVGSVGElementBridge.java:142)org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder .java:208),位于com.mmg.app.svg.TiledImageTranscoder.transcode(TiledImageTranscoder.java:61),位于org.apache.batik.transcoder.XMLAbstractTranscoder.tra org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:156)上的nscode(XMLAbstractTranscoder.java:142)在com.mmg.app.svg.ShoeComponentPNGCreator.savePngImage(ShoeComponentPNGCreator.java:601)上的org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:156) com.mmg.app.svg.ShoeComponentPNGCreator.processStyleImaging(ShoeComponentPNGCreator.java:226)上的.app.svg.ShoeComponentPNGCreator.create72DPIOriginalImage(ShoeComponentPNGCreator.java:305) :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值(“自动”)。 原始消息:“”标识符不是“ 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 org.apache.batik.bridge.CSSUtilities.getComputedStyle(CSSUtilities.java:82)org.apache.batik.bridge.SVGSVGElementBridge.createGraphicsNode(SVGSVGElementBridge.java:142)的org.apache.batik.bridge.CSSUtilities.convertVisibility(CSSUtilities.java:579) org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:208)上的org.apache.batik.bridge.GVTBuilder.build(GVTBuilder.java:76)在com.mmg.app.svg.TiledImageTranscoder.transcode( org.apache.batik.transcoder.XMLAbstractTranscoder.transcode(XMLAbstractTranscoder.java:142)处的TiledImageTranscoder.java:61)com.mmg.app处的org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:156)处com.mmg.app.svg.ShoeComponentPNGCreator.create72DPIOriginalImag上的.svg.ShoeComponentPNGCreator.savePngImage(ShoeComponentPNGCreator.java:601) com.mmg.app.svg.ShoeComponentPNGCreator.traverseFolder(ShoeComponentPNGCreator.java:186)上com.mmg.app.svg.ShoeComponentPNGCreator.processStyleImaging(ShoeComponentPNGCreator.java:226)上的e(ShoeComponentPNGCreator.java:305) .app.svg.ShoeComponentPNGCreator.main(ShoeComponentPNGCreator.java:662)

Exception: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在org.apache.batik.css.engine.CSSEngine.getCascadedStyleMap(CSSEngine.java:768)处的.batik.css.engine.CSSEngine $ 1.property(CSSEngine.java:744)。 org.org.apache.batik.bridge.CSSUtilities.getComputedStyle(CSSUtilities.java:82)的org.apache.batik.bridge.CSSUtilities.convertVisibility(CSSUtilities.java:579)的CSSEngine.getComputedStyle(CSSEngine.java:876) org.apache.batik.bridge.GVTBuilder.build(GVTBuilder.java:76)上的.apache.batik.bridge.SVGSVGElementBridge.createGraphicsNode(SVGSVGElementBridge.java:142)org.apache.batik.swing.svg.GVTTreeBuilder.run (GVTTreeBuilder.java:96)错误:null包含的异常:file:/ F:/workspace/MonoGeneiousShoe/src/svg/72DPI/Style-5/Left_Style-5.svg:属性“ shape-rendering”表示入侵 lid CSS值(“自动”)。 原始消息:“”标识符不是“ shape-rendering”属性的有效值。

* CSSEngine:例外。...org.w3c.dom.DOMException:文件:/ F:/workspace/MonoGeneiousShoe/src/svg/72DPI/Style-5/Left_Style-5.svg:属性“ shape-rendering”表示无效的CSS值(“自动”)。 原始消息:“ 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 org.apache.batik.bridge.CSSUtilities.getComputedStyle(CSSUtilities.java:82)org.apache.batik.bridge.SVGSVGElementBridge.createGraphicsNode(SVGSVGElementBridge.java:142)的org.apache.batik.bridge.CSSUtilities.convertVisibility(CSSUtilities.java:579) org.apache.batik.swing.svg.GVTTreeBuilder.run(GVTTreeBuilder.java:96)上的org.apache.batik.bridge.GVTBuilder.build(GVTBuilder.java:76)错误:null封闭的异常:file:/ 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:“原始”标识符不是“字体样式”属性的有效值。

属性值:正常

Exception: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在org.apache.batik.css.engine.CSSEngine.getCascadedStyleMap(CSSEngine.java:768)处的.batik.css.engine.CSSEngine $ 1.property(CSSEngine.java:744)。 org.org.apache.batik.bridge.CSSUtilities.getComputedStyle(CSSUtilities.java:82)的org.apache.batik.bridge.CSSUtilities.convertVisibility(CSSUtilities.java:579)的CSSEngine.getComputedStyle(CSSEngine.java:876) org.apache.batik.bridge.GVTBuilder.build(GVTBuilder.java:76)的.apache.batik.bridge.SVGSVGElementBridge.createGraphicsNode(SVGSVGElementBridge.java:142)org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder .java:208),位于com.mmg.app.svg.TiledImageTranscoder.transcode(TiledImageTranscoder.java:61),位于org.apache.batik.transcoder.XMLAbstractTranscoder.tra org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:156)上的nscode(XMLAbstractTranscoder.java:142)在com.mmg.app.svg.ShoeComponentPNGCreator.savePngImage(ShoeComponentPNGCreator.java:601)上的org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:156) com.mmg.app.svg.ShoeComponentPNGCreator.processStyleImaging(ShoeComponentPNGCreator.java:226)上的.app.svg.ShoeComponentPNGCreator.create72DPIOriginalImage(ShoeComponentPNGCreator.java:305) :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:“字体样式”属性表示无效的CSS值(“正常”)。 原始消息:“原始”标识符对于“字体样式”属性不是有效值。 在org.apache.batik.css.engine.CSSEngine.getCascadedStyleMap(CSSEngine.java:784)在org.apache.batik.css.engine.CSSEngine.getComputedStyle(CSSEngine.java:876)在org.apache.batik.bridge org.apache.batik.bridge.CSSUtilities.getComputedStyle(CSSUtilities.java:82)org.apache.batik.bridge.SVGSVGElementBridge.createGraphicsNode(SVGSVGElementBridge.java:142)的org.apache.batik.bridge.CSSUtilities.convertVisibility(CSSUtilities.java:579) org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:208)上的org.apache.batik.bridge.GVTBuilder.build(GVTBuilder.java:76)在com.mmg.app.svg.TiledImageTranscoder.transcode( org.apache.batik.transcoder.XMLAbstractTranscoder.transcode(XMLAbstractTranscoder.java:142)处的TiledImageTranscoder.java:61)com.mmg.app处的org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:156)处com.mmg.app.svg.ShoeComponentPNGCreator.create72DPIOriginalImag上的.svg.ShoeComponentPNGCreator.savePngImage(ShoeComponentPNGCreator.java:601) com.mmg.app.svg.ShoeComponentPNGCreator.traverseFolder(ShoeComponentPNGCreator.java:186)上com.mmg.app.svg.ShoeComponentPNGCreator.processStyleImaging(ShoeComponentPNGCreator.java:226)上的e(ShoeComponentPNGCreator.java:305) .app.svg.ShoeComponentPNGCreator.main(ShoeComponentPNGCreator.java:662)错误:null包含的异常:file:/ F:/workspace/MonoGeneiousShoe/src/svg/72DPI/Style-5/Left_Style-5.svg:“属性”字体样式”表示无效的CSS值(“正常”)。 原始消息:“原始”标识符对于“字体样式”属性不是有效值。 org.apache.batik.com上的com.mmg.app.svg.TiledImageTranscoder.transcode(TiledImageTranscoder.java:69)处的java.lang.NullPointerException org.apache.batik处的org.apache.batik.transcoder.XMLAbstractTranscoder.transcode(XMLAbstractTranscoder.java:142) com.mmg.app.svg.ShoeComponentPNGCreator.savePngImage(ShoeComponentPNGCreator.java:601)上的com.mmg.app.svg.ShoeComponentPNGCreator.create72DPIOriginalImage(ShoeComponentPNGCreator。)上的transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:156)在com.mmg.app.svg.ShoeComponentPNG处com.mmg.app.svg.ShoeComponentPNGCreator.traverseFolder(ShoeComponentPNGCreator.java:186)处com.mmg.app.svg.ShoeComponentPNGCreator.processStyleImaging(ShoeComponentPNGCreator.java:226) (ShoeComponentPNGCreator.java:662)

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

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

谢谢你Mihir Parekh

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

UpdateManager updateManager = canvas.getUpdateManager();

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

谢谢

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM