Google은 흑인 공동체를 위한 인종 간 평등을 진전시키기 위해 노력하고 있습니다. Google에서 어떤 노력을 하고 있는지 확인하세요.

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
    }
    

자바

    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
    )
    

자바

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

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

Kotlin

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

자바

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

자바

    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 객체의 인스턴스를 저장하지만, 인스턴스를 꼭 저장할 필요는 없습니다. 애플리케이션은 이 객체를 사용하여 처리 중인 인쇄 작업의 진행 상황을 추적할 수 있습니다. 이 접근법은 애플리케이션의 인쇄 작업 상태가 완료, 실패 또는 사용자 취소인지 모니터링하려는 경우에 유용합니다. 인앱 알림을 만들 필요는 없습니다. 인쇄 프레임워크가 인쇄 작업에 관한 시스템 알림을 자동으로 만들기 때문입니다.