android

[Android] 구글클라우드 프린터 이용 프린팅하기

포카리s 2016. 2. 23. 16:40
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

구글 클라우드 프린터를 이용하여 프린팅하는 소스를 짜보았다.


구글 디벨로퍼 가서 검색을 한 결과 프린트 할 화면을 pdf파일로 만들어서 해당 웹사이트로 그 파일을 보내면 된다는 것이였다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
public class PrintDialogAct extends Activity{
    
    private static final String PRINT_DIALOG_URL = "https://www.google.com/cloudprint/dialog.html";
    private static final String JS_INTERFACE = "AndroidPrintDialog";
    private static final String CONTENT_TRANSFER_ENCODING = "base64";
    private static final String ZXING_URL = "http://zxing.appspot.com";
    private static final int ZXING_SCAN_REQUEST = 65743;
    
    private static final String CLOSE_POST_MESSAGE_NAME = "cp-dialog-on-close";
    
    private WebView dialogWebView;
    private Intent cloudPrintIntent;
    
    @Override
    protected void onCreate(Bundle saved){
        super.onCreate(saved);
        setContentView(R.layout.print_dialog);
        dialogWebView = (WebView)findViewById(R.id.webview);
        cloudPrintIntent = this.getIntent();
        
        WebSettings setting = dialogWebView.getSettings();
        setting.setJavaScriptEnabled(true);
        
        dialogWebView.setWebViewClient(new PrintDialogWebClient());
        dialogWebView.addJavascriptInterface(new PrintDialogJavaScriptInterface(), JS_INTERFACE);
        
        dialogWebView.loadUrl(PRINT_DIALOG_URL);
    }
    
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent intent){
        if(requestCode == ZXING_SCAN_REQUEST && resultCode == RESULT_OK){
            dialogWebView.loadUrl(intent.getStringExtra("SCAN_RESULT"));
        }
    }
    
    final class PrintDialogJavaScriptInterface{
        public String getType(){
            return cloudPrintIntent.getType();
        }
        
        public String getTitle(){
            return cloudPrintIntent.getExtras().getString("title");
        }
        
        public String getContent(){
            try{
                ContentResolver contentResolver = getContentResolver();
                InputStream is = contentResolver.openInputStream(cloudPrintIntent.getData());
                ByteArrayOutputStream boas = new ByteArrayOutputStream();
                
                byte[] buffer = new byte[4096];
                int n = is.read(buffer);
                while(n >= 0){
                    boas.write(buffer, 0, n);
                    n = is.read(buffer);
                }
                is.close();
                boas.flush();
                return Base64.encodeToString(boas.toByteArray(), Base64.DEFAULT);
            }catch(FileNotFoundException e){
                e.printStackTrace();
            }catch(IOException e){
                e.printStackTrace();
            }
            return "";
        }
        
        public String getEncoding(){
            return CONTENT_TRANSFER_ENCODING;
        }
        
        public void onPostMessage(String message){
            if(message.startsWith(CLOSE_POST_MESSAGE_NAME))
                finish();
        }
    }
    
    private final class PrintDialogWebClient extends WebViewClient{
        
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url){
            if(url.startsWith(ZXING_URL)){
                Intent intentScan = new Intent("com.google.zxing.client.android.SCAN");
                intentScan.putExtra("SCAN_MODE""QR_CODE_MODE");
                try{
                    startActivityForResult(intentScan, ZXING_SCAN_REQUEST);
                }catch(ActivityNotFoundException error){
                    view.loadUrl(url);
                }
            }else{
                view.loadUrl(url);
            }
            return false;
        }
        
        @Override
        public void onPageFinished(WebView view, String url){
            if(PRINT_DIALOG_URL.equals(url)){
                view.loadUrl("javascript:printDialog.setPrintDocument(printDialog.createPrintDocument("
                          + "window." + JS_INTERFACE + ".getType(),window." + JS_INTERFACE + ".getTitle(),"
                          + "window." + JS_INTERFACE + ".getContent(),window." + JS_INTERFACE + ".getEncoding()))");
                
                view.loadUrl("javascript:window.addEventListener('message',"
                        + "function(evt){window." + JS_INTERFACE + ".onPostMessage(evt.data)}, false)");
            }
        }
    }
}
 
cs


위의 코드는 구글사이트에서 그대로 퍼온것이다. pdf파일을 웹뷰로 보내주는 기능을 하는거 같다.



이 소스는 화면을 캡쳐하여 PNG파일로 저장하는 기능을 하는 매서드이다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
private void screenShot(View view, long Time) throws Exception{
        pd.show();
        view.setDrawingCacheEnabled(true);
        view.getDrawingCache(true);
        Bitmap screen = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
        Log.e("monkey""Width > "+screen.getWidth()+" / Height > "+screen.getHeight());
        Canvas canvas = new Canvas(screen);
        view.draw(canvas);
        String fileName = Time+".png";
        String path = Environment.getExternalStorageDirectory()+"/MonkeysPhone/";
        try{
            File dir = new File(path);
            dir.mkdirs();                
            File f = new File(path, fileName);
            f.createNewFile();
            OutputStream outStream = new FileOutputStream(f);
            screen.compress(Bitmap.CompressFormat.PNG, 100, outStream);
            outStream.close();
            new MediaScanning(act, f);
        }catch(IOException e){
            e.printStackTrace();
        }
        imgToPdf(path+fileName, screen.getWidth(), screen.getHeight());
        view.setDrawingCacheEnabled(false);
    }
        imgToPdf(path+fileName, screen.getWidth(), screen.getHeight());
        view.setDrawingCacheEnabled(false);
    }
cs



이 소스는 PNG파일을 pdf파일로 변환하는 메서드 이다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
private void imgToPdf(String filepath, int wid, int hei){
        try{
            String path = filepath;
            File file = new File(path);
            Document document = new Document();
            PdfWriter.getInstance(document, new FileOutputStream(path+"파일.pdf"));
            document.open();
            Image image = Image.getInstance(path);
            
            //크기 조정
//            float scaler = ((document.getPageSize().width()-document.leftMargin()-document.rightMargin()-indentation)/image.width())*100;
            float width = (wid/document.getPageSize().width());
            float height = (hei/document.getPageSize().height());
            Log.e("LOSA""Pdf wid > "+width+" / Pdf height > "+height);
            image.scalePercent(40,18);
//            image.scalePercent(width, height);
            image.setAbsolutePosition((document.getPageSize().width()-image.scaledWidth())/2,
                    (document.getPageSize().height()-image.scaledHeight())/2);
            document.add(image);
            Log.e("LOSA""GOGOGOGO");
            document.newPage();
            document.close();
        }catch(Exception e){
            e.printStackTrace();
        }
        pd.dismiss();
        Uri uri = Uri.parse("file://"+filepath+"파일.pdf");
        Intent printIntent = new Intent(act, PrintDialogAct.class);
        printIntent.setDataAndType(uri, "application/pdf");
        printIntent.putExtra("title""testPrint");
        act.startActivity(printIntent);
    }
cs


마지막에 인텐트로 파일을 보내주면 웹뷰가 실행이 되면서 구글계정에 등록이 된 프린터로 연결이 된다.


구글계정에 프린터를 지정하는 방법은 인터넷 검색하면 많이 나와있다.


계정에 등록된 프린터만 사용 가능하니 코드구현 하기 전에 프린터를 꼭 등록하고 하면 될것이다.