[This is an abridged version of a HOWTO posted at the Cocoon Wiki: http://wiki.cocoondev.org/Wiki.jsp?page=Embedding_SVG_Fonts]
*Introduction* Using server-generated SVG in a multi-lingual or with complex layout inevitably leads to frustration over fonts. A map with multi-lingual text carefully layed out using the Bitstream Cyberbit font will be riddled with 'missing character' squares when rendered on a client's machine that lacks Cyberbit. The SVG specification does offer a solution to this problem: scalable font glyphs can be described within an svg:font element. With these, the client renders text using the appropriate SVG glyphs, not relying on font descriptions from the client's operating environment. But it would be completely impractical to render the entire, e.g., Cyberbit font as an SVG font and expect the client machine to upload this with each view. What is needed is a mechanism that appends to an SVG document only those glyphs necessary for it to be rendered. As it turns out, the marvellous Batik SVG Graphics2D environment has just this ability. I've tapped into it to make an xslt transformation (extended with xalan/java) which takes any SVG document and adds to it the glyphs necessary for its viewing. The result is a somewhat heavier document, but one that is completely portable. An example: http://heml.mta.ca/heml-cocoon/map.svgz? url=docs/source/heml/newton.xml&mapName=britain&fontName=Melmo *Use* To use the SVGFontEmbedder, you'll need to ensure that: 1. Your Cocoon environment has the Batik jar file. Check WEB-INF/libs for a file called something like batik-all.jar. (I've tested this with Cocoon 2.0.4, which comes with the 1.5b2 Batik code.) 2. You can process an xslt file with Xalan. Xalan is the default xslt processor in Cocoon, but some people have patched in support for Saxon because of its superior speed. (It should be noted that, at present, its speed comes at the cost of being able to pass off its elements to java processes as DOM objects, a deal-breaker for me.) You'll also need to download two files: 1. heml-cocoon.jar from any Heml release v.0_5.4 or greater, found at http://heml.mta.ca/releases 2. svgEmbedFonts.xsl, the latest version of which is easiest to aquire at its view cvs page Install heml-cocoon.jar in your $COCOON_HOME/WEB-INF/libs directory, and put svgEmbedFonts.xsl wherever your xsl files usually reside. Emend your sitemap to transform your SVG files just before they are serialized as svg+xml. (Incidentally, there is no point in using this transformation before rasterizing SVG to jpg or png, since your server will have access to its own fonts when rasterizing.) For instance, an appropriate part of my sitemap looks like this: <map:transform src="xslt/util/svgEmbedFonts.xsl"/> Once Cocoon is duly restarted, etc., your SVG should now have the necessary svg:glyph elements automagically added. *Caveats* 1. This code will only recognize fonts specified with the font-family="MY_FONT" attribute notation. You can't use style="font-family: MY_FONT" and expect this process to assign the right font to your text. On the positive side, the font-family can be specified on the svg:text element or any of its ancestors, just like in any honest SVG document. -- Bruce Robertson, Dept. of Classics, Mount Allison University http://heml.mta.ca --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]