2017-09-10 14 views
0

私は、スイングでイメージにsvgファイルを変換するのに苦労しています。同じバティックライブラリーを使ってみました。 svgファイルをブラウザで開くと、画像が正しく表示されます。しかし、次のプログラムがSwingのImage/BufferedImageにsvgを変換するために実行されたとき、私はTranscoderException:null End of Fileの例外を受け取りました。誰かがこれで私を助けてくれますか?org.apache.batik.transcoder.TranscoderException:nullファイルの早期終了

おかげ

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ファイルの内容:ファイルの先頭に

ここ
<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

にトランスコーダ

  • パスのではなく、読者にそれを渡す前に、それは、入力ファイルと一致していますか? –

  • +0

    はいまったく同じ – User

    答えて

    1
     BufferedReader reader = new BufferedReader(fr); 
    

    リーダーポイント。

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

    リーダーがファイルを反復処理します。

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

    ...

    ので、ここで読者たちは、ファイル全体を読んで、ファイルの末尾にあります。

     TranscoderInput svgImage = new TranscoderInput(reader); 
    

    トランスコーダがファイルを読み取るためにリーダーを使用しようとすると、何も読み取られません。

    オプション:

    • あなたはトランスコーダ
    • 使用マークにそれを渡すときに、読者は、ファイルの先頭にあるSとスタートを読者にリセットするためにリセットを作成すべてのコードを削除あなたはトランスコーダにそれを渡す前に、sの値を印刷する場合は、ファイルのトランスコーダ
    関連する問題