HTML 문서를 프린터로 인쇄하기

Android 2014. 2. 13. 13:06

- 간단한 사진 이외에 복잡한 문서를 인쇄하기 위해서, 안드로이드는 HTML 형식의 문서를 출력할 수 있도록 지원해준다. Android 4.4 (API Level 19)부터 WebView에 관련 API를 제공하고 있다.

- HTML이 모두 로딩되는 시점을 알기 위해 WebViewClient를 생성하고, WebView에 HTML 문서를 로딩시간다. 모두 로딩이 되지 않은 상태에서 인쇄를 하고자 시도하면, 비어있는 부분이 출력되는 등의 오동작을 하게 된다. 또한, WebView 객체는 출력이 완료되기까지 GC가 되면 안되므로 주의해야 한다. 아래는 관련 코드이다.

private WebView mWebView;

private void doWebViewPrint() {
   
// Create a WebView object specifically for printing
   
WebView webView = new WebView(getActivity());
    webView
.setWebViewClient(new WebViewClient() {

           
public boolean shouldOverrideUrlLoading(WebView view, String url) {
               
return false;
           
}

           
@Override
           
public void onPageFinished(WebView view, String url) {
               
Log.i(TAG, "page finished loading " + url);
                createWebPrintJob
(view);
                mWebView
= null;
           
}
   
});

   
// Generate an HTML document on the fly:
   
String htmlDocument = "<html><body><h1>Test Content</h1><p>Testing, " +
           
"testing, testing...</p></body></html>";
    webView
.loadDataWithBaseURL(null, htmlDocument, "text/HTML", "UTF-8", null);

   
// Keep a reference to WebView object until you pass the PrintDocumentAdapter
   
// to the PrintManager
    mWebView
= webView;
}

loadDataWithBaseURL() 에서  assets/ 의 내용을 불러오기 위해서는 아래와 같이 한다.

webView.loadDataWithBaseURL("file:///android_asset/images/", htmlBody,
       
"text/HTML", "UTF-8", null);

- 외부 URL에서 불러오기 위해서는 아래와 같이 한다.

// Print an existing web page (remember to request INTERNET permission!):
webView
.loadUrl("http://developer.android.com/about/index.html");

- WebView를 통해 인쇄할때에는 아래와 같은 제약 사항이 있다.

  1. Header, Footer, Page Number등을 추가할 수 없다.
  2. 인쇄 페이지를 지정할 수 없다. (예, 10페이지중 2~4페이지만 출력)
  3. 한번에 하나의 인쇄만 진행할 수 있다.
  4. HTML문서에 CSS 인쇄 항목(Landscape 같은)등은 지원하지 않는다.
  5. 인쇄를 시작하도록 하기 위해 JavaScript를 사용할 수 없다.

- 인쇄 작업을 생성하려면 아래와 같이 한다.
private void createWebPrintJob(WebView webView) {

   
// Get a PrintManager instance
   
PrintManager printManager = (PrintManager) getActivity()
           
.getSystemService(Context.PRINT_SERVICE);

   
// Get a print adapter instance
   
PrintDocumentAdapter printAdapter = webView.createPrintDocumentAdapter();

   
// Create a print job with name and adapter instance
   
String jobName = getString(R.string.app_name) + " Document";
   
PrintJob printJob = printManager.print(jobName, printAdapter,
           
new PrintAttributes.Builder().build());

   
// Save the job object for later status checking
    mPrintJobs
.add(printJob);
}

- 위에서 PrintJob을 저장했는데, 이를 통해서 인쇄 진행 상태등을 확인할 수 있다. 인쇄를 진행하면서 Framework에서 알림표시를 하므로, 따로 앱에서 표시해줄 필요는 없다.


출처 : http://developer.android.com/


설정

트랙백

댓글