1

How do I superimpose one SVG image on another using Apache Batik?の指示に従いました (他のソースからの追加の詳細を含む) 。

今まで、ほとんどの場合、物事は完璧に機能しています。しかし、今では、個々の svg ドキュメント (画像) のそれぞれにクリップ パスがあります。2 つ以上の画像を配置すると、2 番目のパスのみが出力に保存されます。他のすべてのクリップ パスが失われます。各画像のクリップ パスを保持するために必要なことはありますか? SVG 出力を確認したところ、クリップ パスが 1 つしか表示されませんでした。私のコードは次のようになります。

public void PlaceSVGImage(SVGDocument a, Point C)
{       
    String xatt = String.format("%f", C.X);
    String yatt = String.format("%f", C.Y);

    org.w3c.dom.Node ae = SVGC.SVGD.importNode(a.getDocumentElement(), true);

    ((Element) ae).removeAttribute("viewBox");
    ((Element) ae).setAttribute("x", xatt);
    ((Element) ae).setAttribute("y", yatt);

    if (FIRSTCHILD)
    {
        SVGC.SVGD.getDocumentElement().appendChild(ae);
        FIRSTCHILD = false;
        NullNode = ae;
    }
    else
    {
        SVGC.SVGD.getDocumentElement().insertBefore(ae, NullNode);
    }
}

次に、標準コードを使用して SVGC.SVGD を表示します。

任意の洞察をいただければ幸いです。

4

2 に答える 2

1

受け取ったコメントに基づいて、次のように問題を解決することができました。(a) Batik によって生成された svg ドキュメントを文字列に変換します。次に、(b) 単純な文字列置換を使用して、クリップ パス名 (Batik はそれらに clippath1、clippath2 などの名前を付けます) のデフォルトの割り当てを一意のものに変更します。次に、そのような svg ドキュメントを (より大きな) svg ドキュメントにまとめると、クリップ パス名がすべて異なり、この問題は解決されます。私たちのコードから恩恵を受ける可能性のある人は、以下を参照してください。より良い方法がある場合は、お知らせください。

public static SVGDocument clipReplacer(SVGDocument SVGD, String S_OLD, String S_NEW)
{
    String SVGString = SVGLib.getString(SVGD);
    SVGDocument doc = null;
    SVGString = SVGString.replaceAll(S_OLD, S_NEW);
    StringReader reader = new StringReader(SVGString);

    //System.out.println(SVGString);

    try
    {
        String parser = XMLResourceDescriptor.getXMLParserClassName();
        SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parser);
        doc = f.createSVGDocument("http://www.w3.org/2000/svg", reader);
    }
    catch (Exception ex)
    {
    }
    finally
    {
        reader.close();
    }

    return doc;
}

public static String getString(SVGDocument SVGD)
{
    /*
     * Converts a given SVGDocument to String
     */

    Writer stringWriter = new StringWriter();
    TranscoderInput input = new TranscoderInput(SVGD);
    TranscoderOutput output = new TranscoderOutput(stringWriter);

    SVGTranscoder X = new SVGTranscoder();
    try
    {
        X.addTranscodingHint(SVGTranscoder.KEY_FORMAT,
                SVGTranscoder.VALUE_FORMAT_ON);
        output.setOutputStream(System.out);
        X.transcode(input, output);
    }
    catch (TranscoderException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return stringWriter.toString();
}
于 2016-02-12T13:17:21.450 に答える
0

クリップ パス要素は、そのid属性によって参照されます。

<clipPath id="clipPath1">
    ...
</clipPAth>

そのため、SVG に重複する clipPathid属性がないことを確認してください。SVG ファイルが Illustrator などの SVG エディタで作成されている場合、同じ ID を持つクリップ パス要素が含まれている可能性が非常に高くなります。

明らかに、SVG 内のすべての ID は一意でなければなりません。そうしないと、レンダラーは同じ名前のどれを<clipPaths>使用する必要があるかわかりません。

于 2016-02-02T10:00:29.650 に答える