新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     >>计算机科学论坛<<     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论SVG, GML, X3D, VRML, VML, XAML, AVALON, Batik等基于XML的图形技术,以及有关GIS的应用。
    [返回] 计算机科学论坛XML.ORG.CN讨论区 - 高级XML应用『 SVG/GML/VRML/X3D/XAML 』 → Batik 入门 (一)(二)(三) [转帖] 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 7602 个阅读者  浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: Batik 入门 (一)(二)(三) [转帖] 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     supremeweb 帅哥哟,离线,有人找我吗?
      
      
      等级:大三(要不要学学XML呢?)
      文章:87
      积分:661
      门派:XML.ORG.CN
      注册:2006/6/13

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给supremeweb发送一个短消息 把supremeweb加入好友 查看supremeweb的个人资料 搜索supremeweb在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看supremeweb的博客楼主
    发贴心情 Batik 入门 (一)(二)(三) [转帖]

    一、概述

    Batik是为想使用svg格式图片来实现各种功能的应用程序和Applet提供的一个基于java的工具包。
    工程创建的目的是为开发者提供一系列可以结合或单独使用来支持特殊的svg解决方案的核心模块。模块主要有SVGParser,SVGGernerator,SVGDOM。Batik工程的其他目的是使它具有高度的扩展性----举个例子,Batik允许开发者使用自定义的SVG元素。即使工程的目标是提供一系列核心模块,但是还是提供了一个完整的SVG浏览器,以便证实各个模块的有效性和交互性。

    二、batik的用途
    通过Batik,你可以在任何使用到java的地方操作SVG文档。你也可以使用各种Batik模块来在你的应用程序和Applet中来生成,操作和转换你的svg图像。
    batik使通过java处理SVG内容变的简单。举个例子,通过使用batik的SVGGernerate模块,java应用程序和Applet可以非常简单的使输出图像的格式为SVG。使用batik的SVG viewing component, 应用程序或者Applet可以非常容易的整合SVG查看和交互功能。另外还可以使用Batik的模块将SVG转换为其他格式,比如说JPEG等图像格式和
    PDF等其他向量格式.
    Batik工具包包含如下各项:
    模块
    SVG DOM implementation
    一系列SVG microsyntax parsers
    scripting module
    一个 generator 用来从java2D中创建一个SVG document  
    Swing SVG component
    transcoder module
    工具和应用程序

    Squiggle, an SVG browser
    An SVG rasterizer
    A TTF to SVG converter
    A pretty printer for SVG source files

    三、SVG DOM API

    DOM API定义了一个接口叫做DOMimplementation,这个接口用来表现任意DOM implementation之间的连接。这个类的作用是通过提供方法创建一个document来连接一个指定的DOM实例。然后具体的Document表现为一个XML Document 并且跟各种各样的DOM对象工厂比如Element,Attr,Text那样动作。

    那么怎样才能获得一个依赖于你使用的DOM Implementation的DOMImplementation 实例呢?在Batik中DOM Implementation存在于包org.apache.batik.dom.svg中,类名为SVGDOMImplementation。以下例子表示怎样获取一个具体的DOMImplementation对象:

    import org.w3c.dom.DOMImplementation;
    import org.apache.batik.dom.svg.SVGDOMImplementation;

    DOMImplementation impl = SVGDOMImplementation.getDOMImplementation();
    一旦你已经拥有了一个DOMImplementation 实例,你将不能再依赖于batik的指定代码而要准备好使用DOM API了。

    1.创建一个Doucument
    使用DOMImplementation,你现在将可以创建一个Document。下面将举例说明怎么创建一个SVG Document。注意Batik的DOM implementation可以被用来表现一个SVG Document片断或者任意的XML Document。注意通过选择命名空间URI和SVG根元素本地名,我们将创建一个SVG Document。
    import org.apache.batik.dom.svg.SVGDOMImplementation;
    import org.w3c.dom.Document;

    // 在SVGDOMImplementation中我们使用了一个不变的常量
    // but we could have used "http://www.w3.org/2000/svg".
    String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
    DOMImplementation impl = SVGDOMImplementation.getDOMImplementation();
    Document doc = impl.createDocument(svgNS, "svg", null);

    当我们已经创建了一个SVG Document时,如果需要的话,我门可以映射这个document到一个SVGDocument。

    2.创建一个SVG Document
    最后使用Document对象,我们现在将构造SVG内容。注意上边创建的document,同时支持通用的XML和SVG。虽然Batik的DOM implementation是一个SVG DOM implementation,但是依赖于已经呈现的Document的指定的SVG方法,不能用于此点。
    Document 可以使用DOM Leve2核心方法创建。以下的例子显示怎样在一个(400,450)范围的SVG屏幕中在(10,20)点创建一个大小为(100,50)的红色矩形。

    import org.apache.batik.dom.svg.SVGDOMImplementation;
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;

    DOMImplementation impl = SVGDOMImplementation.getDOMImplementation();
    String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
    Document doc = impl.createDocument(svgNS, "svg", null);

    // 获得根元素('svg' 元素).
    Element svgRoot = doc.getDocumentElement();

    // 设置'svg'根元素的宽,高属性.
    svgRoot.setAttributeNS(null, "width", "400");
    svgRoot.setAttributeNS(null, "height", "450");

    // 创建矩形
    Element rectangle = doc.createElementNS(svgNS, "rect");
    rectangle.setAttributeNS(null, "x", "10");
    rectangle.setAttributeNS(null, "y", "20");
    rectangle.setAttributeNS(null, "width", "100");
    rectangle.setAttributeNS(null, "height", "50");
    rectangle.setAttributeNS(null, "fill", "red");

    // 绑定 rectangle 到'svg'根元素.
    svgRoot.appendChild(rectangle);

    3.从一个SVG文件中创建一个Document
    使用Batik,你也可以从一个URI,一个InputStream或者一个Reader中使用SAXSVGDocumentFactory创建一个SVG DOM树。下面的例子将举例说明怎么从一个URI中使用SAXSVGDocumentFactory类来创建一个SVG document。

    import java.io.IOException;

    import org.apache.batik.dom.svg.SAXSVGDocumentFactory;
    import org.apache.batik.util.XMLResourceDescriptor;

    import org.w3c.dom.Document;

    try {
        String parser = XMLResourceDescriptor.getXMLParserClassName();
        SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parser);
        String uri = "http://www.example.org/diagram.svg";
        Document doc = f.createDocument(uri);
    } catch (IOException ex) {
        // ...
    }


       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/4/2 13:22:00
     
     supremeweb 帅哥哟,离线,有人找我吗?
      
      
      等级:大三(要不要学学XML呢?)
      文章:87
      积分:661
      门派:XML.ORG.CN
      注册:2006/6/13

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给supremeweb发送一个短消息 把supremeweb加入好友 查看supremeweb的个人资料 搜索supremeweb在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看supremeweb的博客2
    发贴心情 Batik 入门(二)[转帖]
    四、解析器模块

    SVG有很多没有属性值的微型语法使用,比如SVGTransformable元素中的transform属性,path元素中的path data d属性等。以前这些属性不能很好的被解析,现在必要时可以通过SVG进程应用程序来使用。

    1.解析器,操作者,生产者
    在解析模块中,每个微语法通过一对类来支持---解析器和操作者。解析器是一个用来执行解析接口(用来从一个reader或者一个String中来解析值的接口)的类。操作者是微型语法的一个特殊接口,这个接口当相应元素的输入被解析后将调用接口中的相应的方法。在这些操作者接口中多种方法和适应类被提供。
    解析器还包含一个错误操作,当输入解析错误时,错误操作的错误方法将被调用。如果错误处理没有跟解析器关联,那么当发生异常时将抛出ParseException。
    解析模块支持的微语法如下:
    Angles
    Clock values
    Fragment identifiers

    这个解析器被用来解析Fragment identifiers(片断定义)的svg允许的各种格式。

    Lengths
    解析SVG长度值

    Length lists
    用来解析逗号或者空格分隔的SVG长度列表。

    Numbers
    用于解析SVG数字值.

    Number lists
    用来解析逗号或者空格分隔的SVG数字值.

    Path data
    通过 PathParser执行, 通过 PathHandler处理. 用来解析 SVG path data, 就象path 元素中的d 属性一样.

    Points
    通过 PointsParser执行, 通过 PointsHandler处理. 用来解析 point 列表, 就象 polygon 元素中的points 属性那样.

    Preserve aspect ratio values (保持屏幕比率值)
    通过 PreserveAspectRatioParser执行, 通过 PreserveAspectRatioHandler处理. 用来解析在svg元素中的preserveAspectRatio 属性的值。

    Transform lists
    通过TransformListParser执行, 通过 TransformListHandler处理. 用来解析transform 列表, 就象在任意可以变换元素中的变换属性那样。

    一些微型语法同样也有一个相应的生产者类,这个类是在解析的同时生成对象的一个处理接口的执行。

    2.举例

    下面例子用来举例怎么用一个解析器来解析一个点列表

    import java.awt.geom.Point2D;
    import java.util.LinkedList;
    import java.util.List;

    import org.apache.batik.parser.DefaultPointsHandler;
    import org.apache.batik.parser.ParseException;
    import org.apache.batik.parser.PointsHandler;
    import org.apache.batik.parser.PointsParser;

    public class PointsParserExample {

        public List extractPoints(String s) throws ParseException {
            final LinkedList points = new LinkedList();
            PointsParser pp = new PointsParser();
            PointsHandler ph = new DefaultPointsHandler() {
                public void point(float x, float y) throws ParseException {
                    Point2D p = new Point2D.Float(x, y);
                    points.add(p);
                }
            };
            pp.setPointsHandler(ph);
            pp.parse(s);
            return points;
        }
    }
    这个例子使用 AWTTransformProducer 类来从一个SVG transform列表中生成一个 AffineTransform 对象:

    import java.awt.geom.AffineTransform;

    import org.apache.batik.parser.AWTTransformProducer;
    import org.apache.batik.parser.ParseException;
    import org.apache.batik.parser.TransformListParser;

    public class TransformParserExample {

        public AffineTransform parseTransformList(String s) throws ParseException {
            TransformListParser p = new TransformListParser();
            AWTTransformProducer tp = new AWTTransformProducer();
            p.setTransformListHandler(tp);
            p.parse(s);
            return tp.getAffineTransform();
        }
    }

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/4/2 13:27:00
     
     supremeweb 帅哥哟,离线,有人找我吗?
      
      
      等级:大三(要不要学学XML呢?)
      文章:87
      积分:661
      门派:XML.ORG.CN
      注册:2006/6/13

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给supremeweb发送一个短消息 把supremeweb加入好友 查看supremeweb的个人资料 搜索supremeweb在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看supremeweb的博客3
    发贴心情 Batik入门(三)[转帖]
    Scripting with ECMAScript

    脚本基础

    作为ECMAScript 语言(JavaScript的标准版本)是最流行的脚本语言之一,并且作为SVG的标准规定任何一个SVG都必须支持它。SVG documents 处理通过Batik 支持带有使用 Mozilla’s ECMAScript interpreter, Rhino ECMAScript的脚本.

    在SVG 文件中,有两个地方你可以放入脚本。

    第一个地方是在script 元素中, 在这里你可以放置任何代码, 包括函数定义, 在document SVGLoad事件发生之前执行这些脚本.
    <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
      <script type="text/ecmascript">
        // ECMAScript code to be executed
      </script>

      <!-- Remainder of the document... -->
    </svg>

    你也可以帮定脚本来响应用户或者在SVG元素中document事件使用属性。像上边的例子中,脚本语言必须设置在脚本元素中。无论如何,为了事件处理,默认的语言类型text/ecmascript 被指定. 如果你想改变它,那么你可以在svg 元素中使用contentScriptType 属性. 脚本属性可以被包含在任意脚本代码中来执行,当事件延伸到bubbling或者 at-target phases 中时。下面的例子将改变rect被填充为蓝色,当它被点击的时候
    <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
      <rect x="0" y="0" width="10" height="10"
            onclick="evt.target.setAttribute('fill', 'blue')"/>
    </svg>

    注意在事件属性脚本内部,这里有一个变量叫做evt,这个变量涉及到表现被处理事件的事件对象。
    要了解更多的在SVG中使用脚本的信息,请参考如下:
       the scripting chapter of the SVG specification, for advanced information on scripting in SVG, and
       the ECMAScript specification, for advanced information on the ECMAScript language.

    使用 Rhino 特性

    Rhino有很多通过标准的ECMAScript解释器支持的特性,并且这个特性可以在batik中使用 。一个有用的特性是ECMAScript 代码可以使用java类和对象, 并且不仅仅是标准的ECMAScript 原始类型和通过Batik的主机对象扩展。

    要从ECMAScript 中创建一个java类实例,你首先需要导入它存在的包。这个实现要使用Rhino 提供的importPackage 全局函数. 举个例子, 要导入javax.swing.JFrame 类, 你使用:

    importPackage(Packages.javax.swing);

    然后暴露在javax.swing保重每个类的一个全局属性,这个属性你可以用来创建一个新的这个类的对象, 类似于在java中的import javax.swing.*;声明。我们可以使用暴露的Jframe属性来创建一个新的这个类的实例 :

    var frame = new JFrame("My test frame");

    注意怎样将一个ECMAScript 字符串值,转换为 JFrame’s 构造器的一个参数. Rhino 将试图转换ECMAScript 值到适当的java原始类型或者对象用来在构造器或者方法调用下制造。在这个实例中 ECMAScript字符串值被转换为一个 java.lang.String 对象以便传给解释器。

    注意,在这我们涉及到java对象,我们可以象我们在java源码中那样调用它的任何方法。下面这个完整的例子将论证这个,例子主要是点击一个绿色的圆,将弹出一个frame。
    <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
      <circle cx="50" cy="50" r="50" fill="green" onclick="showFrame()"/>
      <script type="text/ecmascript">
        importPackage(Packages.javax.swing);

        function showFrame() {
          var frame = new JFrame("My test frame");
          var label = new JLabel("Hello from Java objects created in ECMAScript!");
          label.setHorizontalAlignment(SwingConstants.CENTER);
          frame.getContentPane().add(label);
          frame.setSize(400, 100);
          frame.setVisible(true);
          frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        }
      </script>
    </svg>

    自定义 Rhino 解释器

    一个有用的Rhino解释器自定义的例子来自ECMAScript标准不提供任何预先确定的I/O设备来结合控制台的事实。无论如何,对于ECMAScript兼容语言来提供一个命名为打印输出信息到控制台的功能是非常通用的。在这我们将描述一个Batik Rhino 解释器自定义的例子来添加如下功能。

    你应该首先将默认的Batik ECMAScript 解释器子集化以便象下边所示的那样添加功能import org.apache.batik.script.rhino.RhinoInterpreter;

    import org.mozilla.javascript.Context;
    import org.mozilla.javascript.Function;
    import org.mozilla.javascript.Scriptable;
    import org.mozilla.javascript.ScriptableObject;
    import org.mozilla.javascript.PropertyException;

    public class ExtendedRhinoInterpreter extends RhinoIntepreter {

        public ExtendedRhinoInterpreter() {

            // Array of functions to put in the global object.
            final String[] names = { "print" }
            try {
                // Add the functions to the global object.
                getGlobalObject().defineFunctionProperties
                    (names, ExtendedRhinoIntepreter.class,
                     ScriptableObject.DONTENUM);
            } catch (PropertyException e) {
                throw new Error(e);
            }
        }
       
        public static void print(Context cx, Scriptable thisObj,
                                 Object[] args, Function funObj) {
            for (int i = 0; i < args.length; i++) {
                if (i > 0) {
                    System.out.print(" ");
                }
       
                // Convert the ECMAScript value into a string form.
                String s = Context.toString(args[i]);
                System.out.print(s);
            }
            System.out.println();
        }
    }
    现在,你需要告诉Batik使用这个解释器代替默认的那个。为了实现这个目的,你必须首先定义一个工厂来创建一个你的解释器实例。
    import org.apache.batik.script.Interpreter;
    import org.apache.batik.script.InterpreterFactory;

    public class ExtendedRhinoInterpreterFactory implements InterpreterFactory {

        public Interpreter createInterpreter() {
            return new ExtendedRhinoInterpreter();
        }
    }
    然后,你必须构建一个将使用这个工厂的IntepreterPool,并且在你的应用程序的 BridgeContext 上设定池
    org.apache.batik.bridge.BridgeContext ctx = ...;
    org.apache.batik.script.InterpreterPool pool =
        new org.apache.batik.script.InterpreterPool();
    pool.putInterpreterFactory("text/ecmascript",
                               new ExtendedRhinoInterpreterFactory());
    ctx.setIntepreterPool(pool);

    举个例子,如果你使用Batik SVG 浏览器程序,你应该可以使用在createBridgeContext()方法中的JSVGCanvas类中先前的代码片段。 更深的是用Rhino工作参考Rhino主页

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/4/2 13:31:00
     
     wwwtiger 帅哥哟,离线,有人找我吗?
      
      
      等级:大三(研究MFC有点眉目了!)
      文章:62
      积分:716
      门派:XML.ORG.CN
      注册:2006/8/3

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给wwwtiger发送一个短消息 把wwwtiger加入好友 查看wwwtiger的个人资料 搜索wwwtiger在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看wwwtiger的博客4
    发贴心情 
    好,BATIK的中文资源实在是太少了!
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/4/2 16:47:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2025/8/7 5:46:06

    本主题贴数4,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    328.125ms