Wow, thanks. This is exactly what I need. Glen
On Fri, 25 Feb 2005 14:47:45 -0500, Andres Toussaint <[EMAIL PROTECTED]> wrote: > The best option is to render the image in a JSVGComponent, and once it > is available, encode it as a PNG. > > The basic idea is to intercept the gvtRenderingCompleted event to > recover the BufferedImage, and then encode this image to something your > Cocoa App can handle, like a PNG. > > If your source is from a URL, simply take the JSVGCanvas tutorial on > the Batik page as a guideline and change the JSVGCanvas to a > JSVGComponent, also, you do not need a Swing component, nor do you need > to add the JSVGComponent to any window for it to render the image. And > once the gvtRenderingCompleted is called you can recover your image. > > I use this method for a JavaClient WebObjects app in Macintosh > (although i only show the BufferedImage in a Swing component, and add > the PNG back to my SVG as a thumbnail), so i am sure that it works on > Max OS X. > > From a previous mail, that did not made it into the archives: > > Basically, you need to create a JSVGComponent (you do not need a > JSVGCanvas since you are displaying in a AWT) and add the build and > render listeners, so you are notified when the data is ready to be > fetched. The important one is GVTRenderListener. When the image is > fully rendered into a BufferedImage, a GVTRenderingCompleted is > triggered and you can fetch the image directly from the Event. > > Once the listeners are in place, you need to load the document to your > JSVGComponent, you can do so from a String (probably recuperated from a > Database), from the filesystem, or from a prebuild org.w3c.dom.Document > object. Once you assign the document to the JSVGComponent, simply wait > until the event is triggered, and that is it. > > Here is an abstract on how to do it. > > ---------------Start of code > svg = new JSVGComponent(); > svg.addSVGDocumentLoaderListener(new > SVGDocumentLoaderAdapter() { > public void > documentLoadingStarted(SVGDocumentLoaderEvent e) { > } > public void > documentLoadingCompleted(SVGDocumentLoaderEvent e) { > //System.out.println("SaveAsDXF-ExportCache > succesfully loaded"); > } > }); > svg.addGVTTreeBuilderListener(new GVTTreeBuilderAdapter() { > public void gvtBuildStarted(GVTTreeBuilderEvent e) { > > //System.out.println("SaveAsDXF-ExportCache-GVTBuilder Starting....."); > } > public void gvtBuildCompleted(GVTTreeBuilderEvent > event) { > > //////////////// If you want access to the G2D elements (generalPath, > shapes, rectangles2D, you can > //////////////// get the GVTTree in this place and walk through it. The > GVTTree has all your SVG > //////////////// converted into Graphics2D objects. > > } > }); > > svg.addGVTTreeRendererListener(new GVTTreeRendererAdapter() { > public void gvtRenderingPrepare(GVTTreeRendererEvent e) { > } > public void gvtRenderingCompleted(GVTTreeRendererEvent e) { > //////////////////////////////////// > //////////////////////////////////// > // In here you can access your image, once the JSVGComponent has loaded > // the XMl and parsed it as SVG and into Graphics2D objects, and finally > // painted them into a BufferedImage. > //////////////////////////////////// > > BufferedImage e.getImage(); > > } > }); > > //////////////////////////////////// And now, to load your XML into the > JSVGComponent you need something like this: > //////////////////////////////////// Please note that this example has > it that the XML is already in memory in a String. > //////////////////////////////////// But you can have a FileReader to > read from the filesystem also. > /////////////Or you can simply call the > jsvgComponent.loadSVGDocument(String URL); > try { > String parser = > XMLResourceDescriptor.getXMLParserClassName(); > SAXSVGDocumentFactory f = new > SAXSVGDocumentFactory(parser); > //////////data is the XML that defines the SVG. Usually a string. > Document doc = f.createSVGDocument(null, new > java.io.StringReader((String)data)); > > ////////////"svg" is the JSVGComponent object. > svg.setDocument(doc); > > } catch (IOException ex) { > System.out.println("Error de svg."+ex); > } > > //-------------------------end of code > > Also, code form a mail by Thomas de Wesse, also lost in oblivion, to > encode the BufferedImame into a PNG: > Encode it as a PNG and include it in the xlink:href using > the data protocol. This is what the code below does (very > indirectly). > > The code to do this more directly (take from > batik.svggen.ImageHandlerBase64Encoder) is something like: > > public static final String DATA_PROTOCOL_PNG_PREFIX = > "data:image/png;base64,"; > > ByteArrayOutputStream os = new ByteArrayOutputStream(); > Base64EncoderStream b64Encoder = new Base64EncoderStream(os); > > ImageEncoder encoder = new PNGImageEncoder(b64Encoder, null); > encoder.encode(buf); > > // Close the b64 encoder stream (terminates b64 streams). > b64Encoder.close(); > > String encodedPNGString = DATA_PROTOCOL_PNG_PREFIX + os.toString(); > ----------------End of code to encode as PNG > > On Feb 25, 2005, at 2:04 PM, Glen Simmons wrote: > > > I'm just getting started with Batik (and also with Java, somewhat) and > > can't quite figure out where to start. I need to render an SVG and get > > an image that I can display in the UI of my app. This is a Mac OS X > > Cocoa app, so the JSVGCanvas component is not an option. Calling other > > Java code is no problem, though. > > > From the architecture overview > > (http://xml.apache.org/batik/architecture.html), it appears that I > > need to drop down to the Renderer module. But I can't figure out how > > to load an SVG file into it and get it to render. Is there some sample > > code that shows how to do this? > > > > Thanks, > > Glen Simmons > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]