使用batik.jar文件把svg格式转换成png图片输出的方法如下:
1.首先需要下载batik
最新版本的batik jar包下载地址
batik介绍:
Batik,你可以在JAVA可以使用的地方操作SVG文档,您还可以在你的应用程序使用Batik模块来生成 , 处理和转码SVG图像。Batik很容易让基于Java的应用程序或小程序来处理SVG内容。 例如,使用Batik的SVG的发生器模块 ,Java应用程序或小程序可以很轻松地导出SVG格式的图形。
2.创建java类文件
代码如下:
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStream;
import org.apache.batik.transcoder.TranscoderException;
import org.apache.batik.transcoder.TranscoderInput;
import org.apache.batik.transcoder.TranscoderOutput;
import org.apache.batik.transcoder.image.PNGTranscoder;
/**
* 将svg转换为png格式的图片
*
*
*/
public class SvgPngConverter {
/**
* 将svg字符串转换为png
*
* @param svgCode svg代码
* @param pngFilePath 保存的路径
* @throws TranscoderException svg代码异常
* @throws IOException io错误
*/
public static void convertToPng(String svgCode, String pngFilePath) throws IOException,
TranscoderException {
File file = new File(pngFilePath);
FileOutputStream outputStream = null;
try {
file.createNewFile();
outputStream = new FileOutputStream(file);
convertToPng(svgCode, outputStream);
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 将svgCode转换成png文件,直接输出到流中
*
* @param svgCode svg代码
* @param outputStream 输出流
* @throws TranscoderException 异常
* @throws IOException io异常
*/
public static void convertToPng(String svgCode, OutputStream outputStream)
throws TranscoderException, IOException {
try {
byte[] bytes = svgCode.getBytes("utf-8");
PNGTranscoder t = new PNGTranscoder();
TranscoderInput input = new TranscoderInput(new ByteArrayInputStream(bytes));
TranscoderOutput output = new TranscoderOutput(outputStream);
t.transcode(input, output);
outputStream.flush();
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args){
StringBuffer svgCode = new StringBuffer();
// File file = new File("C:\\svgcon.txt");
//
// try {
//BufferedReader br = new BufferedReader(new FileReader(file));
//String tempString = null;
//while((tempString = br.readLine()) != null){
//svgCode.append(tempString);
//}
//System.out.println("svg file content :" + svgCode.toString());
//br.close();
//}
//catch (Exception e1) {
TODO Auto-generated catch block
//e1.printStackTrace();
//}
svgCode.append("");
String pngFilePath = "C:\\Apache2.2\\htdocs\\images\\sss.png";
try {
convertToPng(svgCode.toString(), pngFilePath);
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (TranscoderException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
生成的内容是一条蓝色的直线
特别注意
svg标签上要加入xmlns属性 如下内容:
xmlns="/2000/svg"
如过svg标签没有添加这个xmlns属性会出现如下错误:
org.apache.batik.transcoder.TranscoderException: null
Enclosed Exception:
Root element namespace does not match that requested:
Requested: /2000/svg
Found: null
at org.apache.batik.transcoder.XMLAbstractTranscoder.transcode(XMLAbstractTranscoder.java:136)
at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(SVGAbstractTranscoder.java:156)
at SvgPngConverter.convertToPng(SvgPngConverter.java:68)
at SvgPngConverter.convertToPng(SvgPngConverter.java:41)
at SvgPngConverter.main(SvgPngConverter.java:102)