2016-07-25 1 views
0

클립 보드에 복사 된 HTML을 감지하고 로컬 이미지를 64 비트로 변경하는 두 가지 소스 (아래 코드에서 설명 함)를 기반으로 소프트웨어를 만들었습니다.Java - 클립 보드 수정 : Eclipse에서는 작동하지만 JAR로는 작동하지 않습니다.

이 코드는 Eclipse에서 실행할 때 완벽하게 작동하지만 JAR은 사용하지 않습니다.

초기에는 도구 getHtmlDataFlavor을 사용하지 않았지만이 소프트웨어를 JAR로 사용해 보았을 때 추가했습니다. 그런 다음 HtmlSelection.getTransferDataif (flavor.getRepresentationClass() == java.io.Reader.class)이 있어야합니다. 그렇지 않으면 오류가 발생합니다. 하지만 JAR을 사용하면 일반 텍스트 버전 만 얻습니다! 하지만 이클립스에서 실행될 때 여전히 작동합니다.

누군가 아이디어가 있습니까?

나는 사용하여 명령 줄에서 실행 윈도우 (10) 에서 실행하고 있습니다 : java -jar ClipboardImageToBase64-1.0.0-jar-with-dependencies.jar

GitHub의 프로젝트 : 나는 마침내 내 모든 문제를 해결 https://github.com/djon2003/ClipboardImageToBase64

/** 
* Library from HTML parsing : https://jsoup.org 
* 
* Code based on : 
* - http://stackoverflow.com/a/14226456/214898 
* - http://elliotth.blogspot.ca/2005/01/copying-html-to-clipboard-from-java.html 
*/ 

import java.awt.Toolkit; 
import java.awt.datatransfer.Clipboard; 
import java.awt.datatransfer.ClipboardOwner; 
import java.awt.datatransfer.DataFlavor; 
import java.awt.datatransfer.Transferable; 
import java.awt.datatransfer.UnsupportedFlavorException; 
import java.io.File; 
import java.io.IOException; 
import java.io.StringReader; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

import org.apache.commons.codec.binary.Base64; 
import org.apache.commons.io.FileUtils; 
import org.jsoup.Jsoup; 
import org.jsoup.nodes.Document; 
import org.jsoup.nodes.Element; 
import org.jsoup.select.Elements; 

public class ClipBoardListener extends Thread implements ClipboardOwner { 
    Clipboard sysClip = Toolkit.getDefaultToolkit().getSystemClipboard(); 

    private static DataFlavor HTML_FLAVOR = new DataFlavor("text/html;class=java.io.Reader", "HTML"); 
    private int nbImagesConverted = 0; 
    private Transferable currentTransferable; 

    @Override 
    public void run() { 
     Transferable trans = sysClip.getContents(this); 
     TakeOwnership(trans); 
    } 

    @Override 
    public void lostOwnership(Clipboard c, Transferable t) { 

     System.out.println("Copy to clipboard detected"); 
     try { 
      ClipBoardListener.sleep(250); // waiting e.g for loading huge 
              // elements like word's etc. 
     } catch (Exception e) { 
      System.out.println("Exception: " + e); 
     } 
     Transferable contents = sysClip.getContents(this); 
     try { 
      process_clipboard(contents, c); 
     } catch (Exception ex) { 
      Logger.getLogger(ClipBoardListener.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     TakeOwnership(currentTransferable); 

    } 

    void TakeOwnership(Transferable t) { 
     sysClip.setContents(t, this); 
    } 

    private void getHtmlDataFlavor(Transferable t) { 
     DataFlavor df = null; 

     for (DataFlavor tDf : t.getTransferDataFlavors()) { 
      if (tDf.getMimeType().contains("text/html")) { 
       if (tDf.getRepresentationClass() == java.io.Reader.class) { 
        df = tDf; 
        break; 
       } 
      } 
     } 

     HTML_FLAVOR = df; 
    } 

    public void process_clipboard(Transferable t, Clipboard c) { 

     String tempText = ""; 
     Transferable trans = t; 
     currentTransferable = t; 

     getHtmlDataFlavor(t); 
     if (HTML_FLAVOR == null) { 
      System.out.println("No HTML flavor detected"); 
      return; 
     } 

     nbImagesConverted = 0; 
     try { 
      if (trans != null ? trans.isDataFlavorSupported(HTML_FLAVOR) : false) { 
       if (trans.isDataFlavorSupported(DataFlavor.stringFlavor)) { 
        tempText = (String) trans.getTransferData(DataFlavor.stringFlavor); 
       } 
       java.io.Reader r = (java.io.Reader) trans.getTransferData(HTML_FLAVOR); 

       StringBuilder content = getReaderContent(r); 
       String newHtml = changeImages(content); 

       currentTransferable = new HtmlSelection(newHtml, tempText); 
       System.out.println("Converted " + nbImagesConverted + " images"); 
      } else { 
       System.out.println("Not converted:" + trans.isDataFlavorSupported(HTML_FLAVOR)); 
       System.out.println(trans.getTransferData(HTML_FLAVOR)); 
       /* 
       for (DataFlavor tt : trans.getTransferDataFlavors()) { 
        if (tt.getMimeType().contains("text/html")) { 
         System.out.println("-------"); 
         System.out.println(tt.toString()); 
        } 
       } 
       */ 
      } 

     } catch (Exception e) { 
      currentTransferable = t; 
      System.out.println("Conversion error"); 
      e.printStackTrace(); 
     } 
    } 

    private String changeImages(StringBuilder content) throws RuntimeException, IOException { 
     Document doc = Jsoup.parse(content.toString()); 
     Elements imgs = doc.select("img"); 
     for (Element img : imgs) { 
      String filePath = img.attr("src"); 
      filePath = filePath.replace("file:///", ""); 
      filePath = filePath.replace("file://", ""); 

      File file = new File(filePath); 
      if (file.exists()) { 
       String encoded = Base64.encodeBase64String(FileUtils.readFileToByteArray(file)); 
       String extension = file.getName(); 
       extension = extension.substring(extension.lastIndexOf(".") + 1); 
       String dataURL = "data:image/" + extension + ";base64," + encoded; 

       img.attr("src", dataURL); // or whatever 
       nbImagesConverted++; 
      } 
     } 

     String html = doc.outerHtml(); 
     html = html.replaceAll("(?s)<!--.*?-->", ""); //Remove html comments 
     return html; // returns the modified HTML 
    } 


    private StringBuilder getReaderContent(java.io.Reader r) throws IOException { 
     char[] arr = new char[8 * 1024]; 
     StringBuilder buffer = new StringBuilder(); 
     int numCharsRead; 
     while ((numCharsRead = r.read(arr, 0, arr.length)) != -1) { 
      buffer.append(arr, 0, numCharsRead); 
     } 
     r.close(); 
     return buffer; 
    } 

    private static class HtmlSelection implements Transferable { 

     private String html; 
     private String plainText; 



     public HtmlSelection(String html, String plainText) { 

      this.html = html; 
      this.plainText = plainText; 

     } 



     public DataFlavor[] getTransferDataFlavors() { 

      DataFlavor[] dfs = {HTML_FLAVOR, DataFlavor.stringFlavor}; 
      return dfs; 

     } 



     public boolean isDataFlavorSupported(DataFlavor flavor) { 

      return flavor.getMimeType().contains("text/html") || flavor.getMimeType().contains("text/plain"); 

     } 



     public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException { 

      if (flavor.getMimeType().contains("text/html")) { 
       if (flavor.getRepresentationClass() == java.io.Reader.class) { 
        return new StringReader(html); 
       } else { 
        return html; 
       } 
      } else { 
       return plainText; 
      } 

      //throw new UnsupportedFlavorException(flavor); 
     } 

    } 

} 
+0

있습니다 이클립스와 실제로 같은 위치에서, 자바의 동일한 버전을 사용하여 명령 행 호출? – nitind

+0

어떻게 확인할 수 있습니까? –

+0

이런 젠장! 아니 그들은 동일하지 않습니다! 'System.out.println (System.getProperty ("java.runtime.version"));' –

답변