Changing CSS Stylesheet for multiple transcodings
I wanted to recolor a map in several ways, and transcode each into a png. There is little on the web about how to deal with CSS style sheets in SVG. Finally I found a message with a suggestion:
http://www.mail-archive.com/batik-users@xmlgraphics.apache.org/msg03376.html as amended by its reply:
http://www.mail-archive.com/batik-users@xmlgraphics.apache.org/msg03379.html
The folowing outputs two .pngs with different colors for the United States:
public void testTranscode() { try { // make a Document with the base map String parser = XMLResourceDescriptor.getXMLParserClassName(); SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parser); String filename = "C:/maps/BlankMap-World6.svg"; String uri = "file:///" + filename; Document doc = f.createDocument(uri, new FileReader(filename)); // prepare to modify and transcode the document SVGDocument sdoc = (SVGDocument)doc; Element svgRoot = sdoc.getDocumentElement(); PNGTranscoder t = new PNGTranscoder(); TranscoderInput input = new TranscoderInput(doc); // find the existing stylesheet in the document NodeList stylesList = doc.getElementsByTagName("style"); Node styleNode = stylesList.item(0); // append another stylesheet after the existing one SVGStyleElement style = (SVGStyleElement) doc.createElementNS(SVG_NAMESPACE_URI, "style"); style.setAttributeNS(null,"type","text/css"); style.appendChild(doc.createCDATASection(".us {fill: blue;}")); styleNode.getParentNode().appendChild(style); // transcode the map OutputStream ostream = new FileOutputStream("outblue.jpg"); TranscoderOutput output = new TranscoderOutput(ostream); t.transcode(input, output); ostream.close(); // replace the appended stylesheet with another SVGStyleElement oldStyle = style; style = (SVGStyleElement) doc.createElementNS(SVG_NAMESPACE_URI, "style"); style.setAttributeNS(null,"type","text/css"); style.appendChild(doc.createCDATASection(".us {fill: green;}")); styleNode.getParentNode().replaceChild(style, oldStyle); // transcode the revised map ostream = new FileOutputStream("outgreen.jpg"); output = new TranscoderOutput(ostream); t.transcode(input, output); ostream.close(); } catch (Exception ex) { ex.printStackTrace(); } }