HTML ドキュメントの印刷

Android でシンプルな写真以外のコンテンツを印刷するには、テキストとグラフィックを 印刷します。Android フレームワークは、HTML を使用してドキュメントを作成し、 必要最小限のコードで出力できます

Android 4.4(API レベル 19)で、WebView クラスは次のように更新されました。 HTML コンテンツの印刷を有効にします。このクラスを使用すると、ローカルの 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
}

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/ に配置します。 アプリケーションの最初のパラメータでベース URL を loadDataWithBaseURL() メソッドをご覧ください。 次のコード例:

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 のインスタンスが処理できるのは、一度に 1 つの印刷ジョブだけです。
  • 横向きプロパティなどの 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 オブジェクトのインスタンスを保存して、 必須ではありません。アプリケーションはこのオブジェクトを使用して、 印刷ジョブが処理中ですこの方法は、Google Cloud リソースのステータスを 完了、失敗、ユーザーによるキャンセルなどが発生したときに、自動的に印刷ジョブのステータスに戻ります。作成中の アプリ内通知は不要です。これは、印刷フレームワークが自動的に 通知が送られます。