HTML 문서 인쇄

Android에서 단순한 사진 이외의 콘텐츠를 인쇄하려면 문서를 인쇄합니다. Android 프레임워크는 HTML을 사용하여 문서를 작성하고 최소한의 코드로 출력하세요.

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

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

HTML 문서 로드

WebView를 사용하여 HTML 문서를 인쇄하려면 HTML을 로드해야 합니다. HTML 문서를 문자열로 빌드할 수 있습니다. 이 섹션에서는 HTML 문자열을 빌드하고 WebView에 로드하여 인쇄하는 방법을 설명합니다.

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

  1. 다음 날짜 이후에 인쇄 작업을 시작하는 WebViewClient 만들기 HTML 리소스가 로드됩니다.
  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/에 그래픽 파일을 배치합니다. 디렉터리의 첫 번째 매개변수에 기본 URL을 지정합니다. loadDataWithBaseURL() 메서드( 다음 코드 예를 참고하세요.

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 객체의 인스턴스를 저장합니다. 애플리케이션을 실행할 수 있습니다 애플리케이션은 이 객체를 사용하여 처리 중인 인쇄 작업의 진행 상황을 추적할 수 있습니다. 이 방법은 현재 상태를 모니터링하고 인쇄 작업의 완료, 실패 또는 사용자 취소에 대해 인쇄 작업 을 처리할 수 있습니다. 인앱 알림은 인쇄 프레임워크에서 자동으로 시스템을 생성하므로 필요하지 않음 알림이 표시됩니다.