次のコード行を使用して 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 ブラウザーで表示でき、エラーは含まれていません。
今、私はドキュメントを更新しています
// ここでキャンバスと画像自体の高さ/幅の計算を行います Dimension 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) throws 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();
}
}
run ごとに、プログラムはランダムな例外をスローします。
お気に入り
* * CSSEngine: 例外 property.syntax.error:org.w3c.dom.DOMException: "o" 識別子は "shape-rendering" プロパティの有効な値ではありません。
属性値:自動
* 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) at org.apache.batik.css.engine.CSSEngine.getCascadedStyleMap(CSSEngine.java:768) at 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.
*CSSEngine: 例外.... org.w3c.dom.DOMException: file:/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:
例外: 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) at org.apache.batik.css.engine.CSSEngine.getCascadedStyleMap(CSSEngine.java:768) at 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)エラー: null 囲まれた例外: ファイル:/F:/workspace/MonoGeneiousShoe/src/svg/72DPI/Style-5/Left_Style-5.svg: 属性 "shape-rendering" は、無効な CSS 値 ("auto") を表しています。元のメッセージ: "" 識別子は、"shape-rendering" プロパティの有効な値ではありません。svg: 属性「shape-rendering」は、無効な CSS 値 (「auto」) を表しています。元のメッセージ: "" 識別子は、"shape-rendering" プロパティの有効な値ではありません。svg: 属性「shape-rendering」は、無効な CSS 値 (「auto」) を表しています。元のメッセージ: "" 識別子は、"shape-rendering" プロパティの有効な値ではありません。
*CSSEngine: 例外.... org.w3c.dom.DOMException: file:/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) エラー: null 囲まれた例外: ファイル:/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: 「通常の」識別子は「font-style」プロパティの有効な値ではありません。
属性値:通常
例外: org.w3c.dom.DOMException org.w3c.dom.DOMException: 「通常の」識別子は「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) at org.apache.batik.css.engine.CSSEngine.getCascadedStyleMap(CSSEngine.java:768) at 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.
*CSSEngine: 例外.... org.w3c.dom.DOMException: file:/F:/workspace/MonoGeneiousShoe/src/svg/72DPI/Style-5/Left_Style-5.svg: 属性「font-style」は無効な CSS 値 (「通常」)。元のメッセージ: 「通常の」識別子は、「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: ShoeComponentPNGCreator.main(ShoeComponentPNGCreator.java:662) エラー: null 囲まれた例外: file:/F:/workspace/MonoGeneiousShoe/src/svg/72DPI/Style-5/Left_Style-5.svg: 属性「font-style」が表す無効な CSS 値 (「通常」)。元のメッセージ: 「通常の」識別子は、「font-style」プロパティの有効な値ではありません。org.apache.batik.transcoder.XMLAbstractTranscoder.transcode(XMLAbstractTranscoder.java:142) の com.mmg.app.svg.TiledImageTranscoder.transcode(TiledImageTranscoder.java:69) での java.lang.NullPointerException。 transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:156) com.mmg.app.svg.ShoeComponentPNGCreator.savePngImage(ShoeComponentPNGCreator.java:601) com.mmg.app.svg.ShoeComponentPNGCreator.
height is 0 と表示されることもあれば、 stroke-width が有効な属性ではないなどと表示されることもあります。
CSSエンジン関連の問題だと思います。ここで何が間違っていますか?
ありがとうミヒル・パレク