HTML 문서 인쇄

Android에서 간단한 사진 외의 콘텐츠를 인쇄하려면 인쇄 문서에 텍스트와 그래픽을 작성해야 합니다. Android 프레임워크는 HTML을 사용하여 문서를 작성하고 최소한의 코드로 인쇄할 수 있는 방법을 제공합니다.

Android 4.4 (API 수준 19)에서는 HTML 콘텐츠를 인쇄할 수 있도록 WebView 클래스가 업데이트되었습니다. 이 클래스를 사용하면 로컬 HTML 리소스를 로드하거나 웹에서 페이지를 다운로드하고 인쇄 작업을 만든 후 Android의 인쇄 서비스에 전달할 수 있습니다.

이 과정에서는 텍스트와 그래픽이 포함된 HTML 문서를 빠르게 빌드하고 WebView를 사용하여 인쇄하는 방법을 보여줍니다.

HTML 문서 로드

WebView를 사용하여 HTML 문서를 인쇄하려면 HTML 리소스를 로드하거나 HTML 문서를 문자열로 빌드해야 합니다. 이 섹션에서는 HTML 문자열을 빌드하고 출력하기 위해 WebView에 로드하는 방법을 설명합니다.

일반적으로 이 뷰 객체는 활동 레이아웃의 일부로 사용됩니다. 그러나 애플리케이션에서 WebView를 사용하지 않는다면 특별히 인쇄 목적으로 이 클래스의 인스턴스를 만들 수 있습니다. 이러한 사용자설정 인쇄 뷰를 만드는 기본 단계는 다음과 같습니다.

  1. HTML 리소스가 로드된 후 인쇄 작업을 시작하는 WebViewClient를 만듭니다.
  2. HTML 리소스를 WebView 객체로 로드합니다.

다음 코드 샘플에서는 간단한 WebViewClient를 만들고 만들어진 HTML 문서를 즉시 로드하는 방법을 보여줍니다.

Kotlin

private var mWebView: WebView? = null

private fun doWebViewPrint() {
    // Create a WebView object specifically for printing
    val webView = WebView(activity)
    webView.webViewClient = object : WebViewClient() {

        override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest) = false

        override fun onPageFinished(view: WebView, url: String) {
            Log.i(TAG, "page finished loading $url")
            createWebPrintJob(view)
            mWebView = null
        }
    }

    // Generate an HTML document on the fly:
    val 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
}

Java

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;
}

참고: 이전 섹션에서 만든 WebViewClientonPageFinished() 메서드에서 인쇄 작업 생성 호출이 이루어지는지 확인하세요. 페이지 로드가 완료될 때까지 기다리지 않으면 인쇄 출력이 불완전하거나 비어 있거나 완전히 실패할 수 있습니다.

참고: 위의 코드 예에는 WebView 객체의 인스턴스가 있으므로 인쇄 작업을 만들기 전에 수집된 가비지가 아닙니다. 자체 구현에서도 동일하게 실행해야 합니다. 그러지 않으면 인쇄 프로세스가 실패할 수 있습니다.

페이지에 그래픽을 포함하려면 다음 코드 예와 같이 그래픽 파일을 프로젝트의 assets/ 디렉터리에 배치하고 loadDataWithBaseURL() 메서드의 첫 번째 매개변수에 기본 URL을 지정합니다.

Kotlin

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

Java

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

아래와 같이 loadDataWithBaseURL() 메서드를 loadUrl()로 바꿔 인쇄할 웹페이지를 로드할 수도 있습니다.

Kotlin

webView.loadUrl("https://developer.android.com/about/index.html")

Java

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

인쇄 문서를 만들기 위해 WebView를 사용할 경우 다음 제한사항에 유의해야 합니다.

  • 페이지 번호를 포함하여 머리글이나 바닥글을 문서에 추가할 수 없습니다.
  • HTML 문서의 인쇄 옵션에는 페이지 범위를 인쇄하는 기능이 없습니다. 예를 들어 10페이지 HTML 문서의 2~4페이지 인쇄는 지원되지 않습니다.
  • WebView 인스턴스는 한 번에 하나의 인쇄 작업만 처리할 수 있습니다.
  • 가로 모드 속성과 같은 CSS 인쇄 속성이 포함된 HTML 문서는 지원되지 않습니다.
  • HTML 문서에서 JavaScript를 사용하여 인쇄를 트리거할 수 없습니다.

참고: 레이아웃에 포함된 WebView 객체의 콘텐츠도 문서를 로드한 후에 인쇄할 수 있습니다.

좀 더 맞춤설정된 인쇄 출력을 만들고 인쇄된 페이지에 콘텐츠 그리기를 완전히 제어하려면 다음 과정 맞춤 문서 인쇄로 이동하세요.

WebView를 만들고 HTML 콘텐츠를 로드하면 인쇄 프로세스에서 애플리케이션의 역할은 거의 끝납니다. 다음 단계는 PrintManager에 액세스하여 인쇄 어댑터를 만들고 마지막으로 인쇄 작업을 만드는 것입니다. 다음 예는 이러한 단계를 실행하는 방법을 보여줍니다.

Kotlin

private fun createWebPrintJob(webView: WebView) {

    // Get a PrintManager instance
    (activity?.getSystemService(Context.PRINT_SERVICE) as? PrintManager)?.let { printManager ->

        val jobName = "${getString(R.string.app_name)} Document"

        // Get a print adapter instance
        val printAdapter = webView.createPrintDocumentAdapter(jobName)

        // Create a print job with name and adapter instance
        printManager.print(
                jobName,
                printAdapter,
                PrintAttributes.Builder().build()
        ).also { printJob ->

            // Save the job object for later status checking
            printJobs += printJob
        }
    }
}

Java

private void createWebPrintJob(WebView webView) {

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

    String jobName = getString(R.string.app_name) + " Document";

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

    // Create a print job with name and adapter instance
    PrintJob printJob = printManager.print(jobName, printAdapter,
            new PrintAttributes.Builder().build());

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

이 예에서는 애플리케이션에서 사용하도록 PrintJob 객체의 인스턴스를 저장합니다. 이는 필수가 아닙니다. 애플리케이션은 이 객체를 사용하여 처리 중인 인쇄 작업의 진행 상황을 추적할 수 있습니다. 이 접근 방식은 애플리케이션의 인쇄 작업 상태가 완료, 실패 또는 사용자 취소인지 모니터링하려는 경우에 유용합니다. 인쇄 프레임워크가 인쇄 작업에 관한 시스템 알림을 자동으로 생성하므로 인앱 알림을 만들 필요가 없습니다.