java batik svg转png报错,球大神!!!在线等

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java batik svg转png报错,球大神!!!在线等相关的知识,希望对你有一定的参考价值。

报错内容:

org.apache.batik.transcoder.TranscoderException: null
Enclosed Exception:
The current document is unable to create an element of the requested type (namespace: http://www.w3.org/2000/svg, name: point).
at org.apache.batik.transcoder.XMLAbstractTranscoder.transcode(Unknown Source)
at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(Unknown Source)
at com.test.Test.svgToJpg(Test.java:129)

代码:
public static void svgToJpg(String src, String dest)
FileOutputStream jpgOut = null;
FileInputStream svgStream = null;
ByteArrayOutputStream svgOut = null;
ByteArrayInputStream svgInputStream = null;
ByteArrayOutputStream jpg = null;
try
// 获取到svg文件
File svg = new File(src);
svgStream = new FileInputStream(svg);
svgOut = new ByteArrayOutputStream();
// 获取到svg的stream
int noOfByteRead = 0;
while ((noOfByteRead = svgStream.read()) != -1)
svgOut.write(noOfByteRead);

ImageTranscoder it = new PNGTranscoder();
it.addTranscodingHint(JPEGTranscoder.KEY_QUALITY, new Float(0.8));
it.addTranscodingHint(ImageTranscoder.KEY_HEIGHT, new Float(2000));
it.addTranscodingHint(ImageTranscoder.KEY_WIDTH, new Float(4000));
jpg = new ByteArrayOutputStream();
svgInputStream = new ByteArrayInputStream(svgOut.toByteArray());
it.transcode(new TranscoderInput(svgInputStream),
new TranscoderOutput(jpg));
jpgOut = new FileOutputStream(dest);
jpgOut.write(jpg.toByteArray());

这个是由于你的svg文件里有一个自定义的节点<point>xxx</<point>,而batik不认它。。

我是用一个比较粗暴的办法,先把svg字符串里的这些自定义节点删掉:

/**
 * 简易的剔除未定义节点的方法
 *
 * @param svg      原始svg
 * @param nodeName 需要剔除的节点
 * @return
 */
public static String cutNode(String svg, String nodeName) 
    int b, e = 0;
    int len = nodeName.length() + 3;
    String strB = "<" + nodeName + ">";
    String strE = "</" + nodeName + ">";
    StringBuilder sb = new StringBuilder();
    do 
        b = svg.indexOf(strB, e);
        if (b < 0) 
            break;
        
        sb.append(svg.substring(e, b));
        e = svg.indexOf(strE, b) + len;
     while (true);
    sb.append(svg.substring(e));
    return sb.toString();

svg = cutNode(svg, "point");

参考技术A 这是我以前写的
/**
* 将svg转换成png格式图片
*
* @param pistrPngFile 图片路径
* @param svgPath svg路径
*/
private void changeSvgToJpg(String pistrPngFile, String pistrSvgPath)
Date date = new Date();
long timeBegin = date.getTime();

// svg文件路径
String strSvgURI;
OutputStream ostream = null;
try
// 根据路径获得文件夹
File fileSvg = new File(pistrSvgPath);

// 构造一个表示此抽象路径名的 file:URI
URI uri = fileSvg.toURI();

// 根据此 URI 构造一个 URL
URL url = uri.toURL();

// 构造此 URL 的字符串表示形式
strSvgURI = url.toString();

// 定义一个通用的转码器的输入
TranscoderInput input = new TranscoderInput(strSvgURI);

// 定义图片路径
String strPngPath = pistrPngFile;

// 输入流
ostream = new FileOutputStream(strPngPath);

// 定义单路输出的转码器
TranscoderOutput output = new TranscoderOutput(ostream);

// 构造一个新的转码器,产生JPEG图像
JPEGTranscoder transcoder = new JPEGTranscoder();

// 设置一个转码过程,JPEGTranscoder.KEY_QUALITY设置输出png的画质精度,0-1之间
transcoder.addTranscodingHint(JPEGTranscoder.KEY_QUALITY, new Float(.8));

// 转换svg文件为png
transcoder.transcode(input, output);
catch (MalformedURLException e)
e.printStackTrace();
catch (FileNotFoundException e)
e.printStackTrace();
catch (TranscoderException e)
e.printStackTrace();
finally
try
ostream.flush();
// 关闭输入流
ostream.close();
catch (IOException e)
e.printStackTrace();


System.out.println("转换图片成功");
// // 删除svg文件
// fileSvg.delete();
System.out.println(pistrSvgPath + "已删除!");
date = new Date();
long timeEnd = date.getTime();
long time = timeEnd - timeBegin;
System.out.println("耗时" + time + "毫秒");

追问

at org.apache.batik.transcoder.XMLAbstractTranscoder.transcode(Unknown Source)at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(Unknown Source)报未知来源?SVG小的转换可以成功,SVG编码格式都是UTF-8的。

追答

batik-transcoder少包

使用Batik绘制SVG图并保存为png图像格式

SVG(Scalable Vector Graph)--可缩放矢量图形.

可缩放矢量图形是基于可扩展标记语言标准通用标记语言的子集),用于描写叙述二维矢量图形的一种图形格式。它由万维网联盟制定。是一个开放标准。


思考

使用SVG实现一个miniCAD

參考代码来源http://outofmemory.cn/code-snippet/1096/java-jiang-svg-tupian-switch-png-format-tupian:

package cn.outofmemory.util;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
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 abstract 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();
                }
            }
        }
    }
}

编译依赖:

batik-all-1.7.jar  xml-commons-external-1.4.01.jar


拷贝上两个jar到classpath或当前文件夹下,编译自己定义程序:

javac -classpath  batik-all-1.7.jar  XXX.java


程序中调用:convertToPng(tmp_str, outimgfilename);


以上是关于java batik svg转png报错,球大神!!!在线等的主要内容,如果未能解决你的问题,请参考以下文章

使用Batik绘制SVG图并保存为png图像格式

使用 Batik 将 svg 转换为图像时出现 TranscoderException

各位大神,怎么把svg格式图片用代码转换成png格式或者jpg格式

各位大神,怎么把svg格式图片用代码转换成png格式或者jpg格式

怎样把svg格式的文件转换为pdf

png格式转svg