2017-09-10 4 views
0

Ich habe Schwierigkeiten, Svg-Datei zu einem Bild in Swing zu konvertieren. Ich habe versucht, Batik-Bibliothek für das gleiche zu verwenden. Die Svg-Datei, wenn sie im Browser geöffnet wird, zeigt das Bild korrekt an. Aber wenn das folgende Programm ausgeführt wird, um Svg zu einem Image/BufferedImage in Swing zu konvertieren, erhalte ich eine Ausnahme, die TranscoderException sagt: null Vorzeitiges Ende der Datei. Kann mir bitte jemand dabei helfen?org.apache.batik.transcoder.TranscoderException: null Vorzeitiges Ende der Datei

Dank

public class TestSymbolCreation { 
    static JFrameWin jFrameWindow; 
    static Image bufImage; 
    public static void main(String args[]) { 
     ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); 
     ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("JavaScript"); 

     System.out.println(new File(".").getAbsoluteFile()); 

     File file = new File("./src/resources/milsymbol.js"); 
     try { 
      Reader reader = new FileReader(file); 
      scriptEngine.eval(reader); 
      TestSymbolCreation testCreation = new TestSymbolCreation(); 
      scriptEngine.put("testCreation", testCreation); 
      scriptEngine.eval("function run(testCreation){testCreation.getCanvas(new ms.Symbol('SFG-UCI----D',{size:35}).asSVG());} run(testCreation);"); 
     } catch (FileNotFoundException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } catch (ScriptException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

    public void getCanvas(String canvas) { 
     System.out.println("Value of Canvas111 =>"+canvas); 
     bufImage = createImageFromSVG(); 
     SwingUtilities.invokeLater(runJFrameLater); 
    } 

    public void test() { 
     System.out.println("Test..."); 
    } 

    public Image createImageFromSVG() { 
     File file = new File("./src/svgImg.svg"); 
     System.out.println("File Exists =>"+file.exists()); 
     System.out.println("File Exists =>"+file.isFile()); 
     FileReader fr; 
     try { 
      fr = new FileReader(file); 
      BufferedReader reader = new BufferedReader(fr); 

      String s = "", line = null; 
      try { 
       while ((line = reader.readLine()) != null) { 
        s += line; 
       } 
       System.out.print(s);   
      } catch (IOException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 

      TranscoderInput svgImage = new TranscoderInput(reader); 
      Dimension component = new Dimension(); 
      component.setSize(800, 800); 
      BufferedImageTranscoder transcoder = new BufferedImageTranscoder(); 
      transcoder.addTranscodingHint(PNGTranscoder.KEY_WIDTH, (float) component.getWidth()); 
      transcoder.addTranscodingHint(PNGTranscoder.KEY_HEIGHT, (float) component.getHeight()); 
      try { 
       transcoder.transcode(svgImage, null); // Exception thrown at this line 
      } catch (TranscoderException e) { 
       e.printStackTrace();; 
      } 

      return transcoder.createImage(60,60); 
     } catch (FileNotFoundException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 

     return null; 

    } 

    public static class JFrameWin extends JPanel { 

     public JFrameWin(){ 
      this.setSize(300, 200); 

      System.out.println("Going to set BufferedImage...."); 
      JFrame jFrame = new JFrame(); 
       jFrame.setTitle("Test Rotation!!!"); 
       jFrame.getContentPane().add(this); 
       jFrame.pack(); 
       jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
       jFrame.setVisible(true); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.drawImage(bufImage, 0, 0, this); // see javadoc for more info on the parameters    
     } 
    } 

    static Runnable runJFrameLater = new Runnable() { 
     @Override 
     public void run() { 
      jFrameWindow = new JFrameWin(); 
      jFrameWindow.setVisible(true); 
     } 
    }; 



} 

SVG-Datei Inhalt:

<svg xmlns="http://www.w3.org/2000/svg" version="1.2" baseProfile="tiny" width="55.3" height="47.425" viewBox="21 18.5 158 135.5"><path d="M25,50 l150,0 0,100 -150,0 z" stroke-width="4" stroke="black" fill="rgb(128,224,255)" fill-opacity="1" ></path><path d="M25,50 L175,150 M25,150 L175,50" stroke-width="4" stroke="black" fill="black" ></path><g transform="translate(0,0)" stroke-width="4" stroke="black" fill="none" ><circle cx="100" cy="30" r="7.5" fill="black" ></circle><circle cx="70" cy="30" r="7.5" fill="black" ></circle><circle cx="130" cy="30" r="7.5" fill="black" ></circle></g></svg> 
+0

Wenn Sie den Wert von s drucken, bevor Sie übergeben es an den Transcoder vorbei, ist es die Eingabedatei überein? –

+0

Ja genau das gleiche – User

Antwort

1
 BufferedReader reader = new BufferedReader(fr); 

Hier werden die Leser auf den Anfang der Datei.

 String s = "", line = null; 
     try { 
      while ((line = reader.readLine()) != null) { 

der Leser iteriert über die Datei.

   s += line; 
      } 
      System.out.print(s);   

...

Also hier der Leser am Ende der Datei ist, haben wir die gesamte Datei lesen.

 TranscoderInput svgImage = new TranscoderInput(reader); 

Wenn der Transcoder versucht, den Reader zum Lesen der Datei zu verwenden, gibt es nichts zu lesen.

Optionen:

  • entfernen Sie den gesamten Code, der so ist, schafft s der Leser am Anfang der Datei, wenn Sie es an den Transcoder
  • Verwendung Zeichen und setzen Sie passieren den Leser auf den Anfang zurückgesetzt der Datei, bevor es zu dem Transcoder
  • Pass s statt der Leser auf die Transcoder
Verwandte Themen