【问题标题】:JAVA : SVG converter to PNG get 'pattern' wrongJAVA:SVG转换器到PNG得到“模式”错误
【发布时间】:2013-11-17 12:09:25
【问题描述】:

我想用 batik1.7 将 svg 文件转换为 png 格式,我的代码如下:

public static void convertSvgToPng(InputStream in, FileOutputStream fos) {
    try {
        PNGTranscoder t = new PNGTranscoder();
        TranscoderInput input = new TranscoderInput(in);
        TranscoderOutput output = new TranscoderOutput(fos);
        t.transcode(input, output);
        fos.flush();
        fos.close();
    } catch (IOException ex) {
        Logger.getLogger(CreateFile.class.getName()).log(Level.SEVERE, null, ex);
    } catch (TranscoderException ex) {
        Logger.getLogger(CreateFile.class.getName()).log(Level.SEVERE, null, ex);
    }
}

但有些图像无法转换,并且出错了:

org.apache.batik.bridge.BridgeException: null:-1
  The URI "#Unnamed_Pattern"
  specified on the element <pattern> is invalidat     org.apache.batik.bridge.SVGPatternElementBridge.extractPatternContent(SVGPatternElementBridge.java:260)
at org.apache.batik.bridge.SVGPatternElementBridge.createPaint(SVGPatternElementBridge.java:86)
at org.apache.batik.bridge.PaintServer.convertURIPaint(PaintServer.java:359)
at org.apache.batik.bridge.PaintServer.convertPaint(PaintServer.java:259)
at org.apache.batik.bridge.PaintServer.convertFillPaint(PaintServer.java:228)
at org.apache.batik.bridge.PaintServer.convertFillAndStroke(PaintServer.java:146)
at org.apache.batik.bridge.SVGShapeElementBridge.createShapePainter(SVGShapeElementBridge.java:117)
at org.apache.batik.bridge.SVGDecoratedShapeElementBridge.createFillStrokePainter(SVGDecoratedShapeElementBridge.java:58) ....

当我用 TXT 打开 svg 时,会有 mang "pattern" 标签。在我用程序删除所有“模式”后,转换成功,但失去了一些细节。我认为这不是解决这个问题的好方法。它还有其他方法可以解决这个问题吗?请帮帮我。

问题文件:

jsfiddle.net/asdzheng/BtFbX/1/

【问题讨论】:

  • 我们需要查看您尝试转换的文件。
  • @RobertLongson 我已经放了我的 svg 的一些细节。第一次在这里提问,不擅长编辑问题见谅。

标签: java svg png batik


【解决方案1】:

在@BigBadaboom 建议使用 batik-rasterizer.jar 替换 batik-transcoder.jar 之后,我已经让它工作了。我的代码如下:

import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.apache.batik.apps.rasterizer.DestinationType;
import org.apache.batik.apps.rasterizer.SVGConverter;
import org.apache.batik.dom.svg.SAXSVGDocumentFactory;
import org.apache.batik.util.XMLResourceDescriptor;
import org.w3c.dom.Document;


public class DOMRasterizer {

public Document createDocument(InputStream in) {
    Document doc = null ;
    try {
        // Create a new svg document.
        String parser = XMLResourceDescriptor.getXMLParserClassName();
        SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parser);
        doc = f.createSVGDocument(null, in);

    } catch (IOException ex) {
        Logger.getLogger(DOMRasterizer.class.getName()).log(Level.SEVERE, null, ex);
    }
    return doc;
}

public static void main(String[] args) throws Exception {

    DOMRasterizer rasterizer = new DOMRasterizer();
    InputStream in = new FileInputStream(new File("your svg path"));
    Document svgXmlDoc = rasterizer.createDocument(in);

    // Save this SVG into a file (required by SVG -> PNG transformation process)
    File svgFile = File.createTempFile("graphic-", ".svg");
    Transformer transformer = TransformerFactory.newInstance().newTransformer();
    DOMSource source = new DOMSource(svgXmlDoc);
    FileOutputStream fos = new FileOutputStream(svgFile);
    try {
        transformer.transform(source, new StreamResult(fos));
    } finally {
        fos.close();
    }
    // Convert the SVG into PNG
    File outputFile =new File("output path");
    SVGConverter converter = new SVGConverter();
    converter.setDestinationType(DestinationType.PNG);
    converter.setSources(new String[]{svgFile.toString()});
    converter.setDst(outputFile);
    converter.execute();
}
}

我有以下 JAR:

  • batik-all-1.7.jar

  • commons-io-1.3.1.jar

  • commons-logging-1.0.4.jar

  • xml-apis-ext.jar

【讨论】:

    【解决方案2】:

    从错误看来,文件引用了不存在的模式(“Unnamed_Pattern”)。

    您可以尝试在文件中搜索参考(“Unnamed_Pattern”)。当你找到它时,它可能是这样的:

    fill="url(#Unnamed_Pattern)"
    

    然后要么删除该属性,要么将其更改为fill="none"。请注意,文件中可能不止一次引用了该不存在的模式。

    但要绝对确定,我们需要查看原始文件,正如罗伯特所说。

    【讨论】:

    • 谢谢你的回答,我已经把一些细节放在上面了。
    • 通常,只有在答案解决了您的问题时,您才单击绿色复选标记。听起来你还不是这种情况。
    • 好吧,显然你的模式确实存在。并且似乎是有效的(我在测试文件中尝试过)。所以我建议的解释是不正确的。不幸的是,如果没有某种显示问题的测试文件,将很难诊断。您是否可以将文件缩减为可以发布但仍会出现错误的内容?
    • 对不起那个绿勾,下次我会注意的。
    • 我想发布图片,但是网站无法上传svg的图片。每次我发布所有详细信息 svg 时,编辑框都会崩溃。如何将文件提供给您或在此问题中发布?再次感谢您。
    猜你喜欢
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 2023-03-25
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    相关资源
    最近更新 更多