2017-05-17 7 views
0

SVGは通常のXMLファイルであり、ImageTranscoder.transcode()APIはorg.w3c.dom.Documentを受け入れるため、それぞれのTranscoderInputコンストラクタはorg.w3c.dom.Documentを受け入れます。 1は、Javaの株式XMLパーサとそのロードと構文解析ファイルが働くだろう期待:loadSvgDocument()メソッドは次のように定義されてバニラW3CドキュメントとApache Batik SVGラスタライザの使用

TranscoderInput input = new TranscoderInput(loadSvgDocument(new FileInputStream(svgFile))); 
BufferedImageTranscoder t = new BufferedImageTranscoder(); 
t.transcode(input, null); 

は:

Document loadSvgDocument(String svgFileName, InputStream is) { 
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    // using stock Java 8 XML parser 
    Document document; 
    try { 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     document = db.parse(is); 
    } catch (...) {...} 
    return document; 
} 

それは動作しません。私は奇妙なキャスティングの例外を取得しています。

Exception in thread "main" java.lang.ClassCastException: org.apache.batik.dom.GenericElement cannot be cast to org.w3c.dom.svg.SVGSVGElement 
at org.apache.batik.anim.dom.SVGOMDocument.getRootElement(SVGOMDocument.java:235) 
at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:193) 
at org.apache.batik.transcoder.image.ImageTranscoder.transcode(ImageTranscoder.java:92) 
at org.apache.batik.transcoder.XMLAbstractTranscoder.transcode(XMLAbstractTranscoder.java:142) 
at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:156) 

注:クラスBufferedImageTranscoderは、今度は上記のスタックトレースで述べたSVGAbstractTranscoderを拡張ImageTranscoderを拡張し、バティックの青写真どおりに作成された私のクラス、です。

残念ながら私はバティック自身のパーサーを使用することはできません、SAXSVGDocumentFactory

String parser = XMLResourceDescriptor.getXMLParserClassName(); 
SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parser); 
svgDocument = (SVGDocument) f.createDocument(..); 

私はPapirus SVG iconsをレンダリングしようとしていますが、それらはすべて<svg ... version="1">を持っているとSAXSVGDocumentFactoryはそのようにしないとUnsupport SVG version '1'createDocument(..)に失敗します。彼らはおそらくがサポートされていないことを意味します。ファイル自体にversion="1.0"からversion="1"を変更

Exception in thread "main" java.lang.RuntimeException: Unsupport SVG version '1' 
at org.apache.batik.anim.dom.SAXSVGDocumentFactory.getDOMImplementation(SAXSVGDocumentFactory.java:327) 
at org.apache.batik.dom.util.SAXDocumentFactory.startElement(SAXDocumentFactory.java:640) 
. . . 
at org.apache.batik.anim.dom.SAXSVGDocumentFactory.createDocument(SAXSVGDocumentFactory.java:225) 

は、問題を修正し、アイコンは私のためにきれいにレンダリングされます。しかし数百(数千)のアイコンがあり、それらを修正するのは面倒なので、効果的にプロジェクトのポートを作成します。これは私のための道ではありません。はるかに簡単にDOM APIを使用して、実行時に修正を作ることです。

Element svgDocumentNode = svgDocument.getDocumentElement(); 
String svgVersion = svgDocumentNode.getAttribute("version"); 
if (svgVersion.equals("1")) { 
    svgDocumentNode.setAttribute("version", "1.0"); 
} 

しかし、それは唯一の株式のJava XMLパーサで行うことができます。このコードはドキュメントの前に、到達することができます前に、バティックのXMLパーサーは、早すぎる吹きますが生成される。しかし、在庫XMLパーサを使用してバージョンを修正すると、Batik Transcoder(ラスタライザ)はそれを気に入らない。だから私はここで壁に当たった。

XMLパーサーorg.w3c.dom.Documentとバティック互換org.w3c.dom.svg.SVGDocumentのコンバーターはありますか?

答えて

0

問題を回避した解決策が見つかりました。幸いにもクラスSAXSVGDocumentFactoryは簡単にサブクラスとクリティカルメソッド getDOMImplementation()をオーバーライドすることができます。

protected Document loadSvgDocument(InputStream is) { 
    String parser = XMLResourceDescriptor.getXMLParserClassName(); 
    SAXSVGDocumentFactory f = new LenientSaxSvgDocumentFactory(parser); 
    SVGDocument svgDocument; 
    try { 
     svgDocument = (SVGDocument) f.createDocument("aaa", is); 
    } catch (...) { 
     ... 
    } 
    return svgDocument; 
} 

static class LenientSaxSvgDocumentFactory extends SAXSVGDocumentFactory { 
    public LenientSaxSvgDocumentFactory(String parser) { 
     super(parser); 
    } 

    @Override 
    public DOMImplementation getDOMImplementation(String ver) { 
     // code is mostly rip-off from original Apache Batik 1.9 code 
     // only the condition was extended to accept also "1" string 
     if (ver == null || ver.length() == 0 
       || ver.equals("1.0") || ver.equals("1.1") || ver.equals("1")) { 
      return SVGDOMImplementation.getDOMImplementation(); 
     } else if (ver.equals("1.2")) { 
      return SVG12DOMImplementation.getDOMImplementation(); 
     } 
     throw new RuntimeException("Unsupported SVG version '" + ver + "'"); 
    } 
} 

私は幸運今回は、メインの質問は、しかし残り:org.w3c.dom.Documentとバティック互換org.w3c.dom.svg.SVGDocumentを生成株式XMLパーサからのコンバータはありますか?

関連する問題