interface ICoreWebView2Experimental17

Note

This reference is no longer being maintained. For the latest API reference, see WebView2 API Reference.

Note

This an experimental API that is shipped with our prerelease SDK. See WebView2 release notes.

interface ICoreWebView2Experimental17
  : public IUnknown

A continuation of the ICoreWebView2 interface to support printing.

Summary

Members Descriptions
Print Print the current web page asynchronously to the specified printer with the provided settings.
PrintToPdfStream Provides the Pdf data of current web page asynchronously for the provided settings.
ShowPrintUI Opens the print dialog to print the current web page.

Applies to

Product Introduced
WebView2 Win32 N/A
WebView2 Win32 Prerelease

Members

Print

Print the current web page asynchronously to the specified printer with the provided settings.

public HRESULT Print(ICoreWebView2PrintSettings * printSettings, ICoreWebView2ExperimentalPrintCompletedHandler * handler)

See ICoreWebView2PrintSettings for description of settings. Passing nullptr for printSettings results in default print settings used.

The handler will return errorCode as S_OK and printStatus as COREWEBVIEW2_PRINT_STATUS_PRINTER_UNAVAILABLE if printerName doesn't match with the name of any installed printers on the user OS. The handler will return errorCode as E_INVALIDARG and printStatus as COREWEBVIEW2_PRINT_STATUS_OTHER_ERROR if the caller provides invalid settings for a given printer.

The async Print operation completes when it finishes printing to the printer. At this time the ICoreWebView2PrintCompletedHandler is invoked. Only one Printing operation can be in progress at a time. If Print is called while a Print or PrintToPdf or PrintToPdfStream job is in progress, the completed handler is immediately invoked with E_ABORT and printStatus is COREWEBVIEW2_PRINT_STATUS_OTHER_ERROR. This is only for printing operation on one webview.

errorCode printStatus Notes
S_OK COREWEBVIEW2_PRINT_STATUS_SUCCEEDED Print operation succeeded.
S_OK COREWEBVIEW2_PRINT_STATUS_PRINTER_UNAVAILABLE If specified printer is not found or printer status is not available, offline or error state.
S_OK COREWEBVIEW2_PRINT_STATUS_OTHER_ERROR Print operation is failed.
E_INVALIDARG COREWEBVIEW2_PRINT_STATUS_OTHER_ERROR If the caller provides invalid settings for the specified printer.
E_ABORT COREWEBVIEW2_PRINT_STATUS_OTHER_ERROR Print operation is failed as printing job already in progress.
// This example prints the current web page to a specified printer with the settings.
bool AppWindow::PrintToPrinter()
{
    std::wstring printerName = GetPrinterName();
    // Host apps custom print settings based on the user selection.
    SamplePrintSettings samplePrintSettings = GetSelectedPrinterPrintSettings(printerName);

    wil::com_ptr<ICoreWebView2Experimental17> webView2Experimental17;
    CHECK_FAILURE(m_webView->QueryInterface(IID_PPV_ARGS(&webView2Experimental17)));

    wil::com_ptr<ICoreWebView2Environment6> webviewEnvironment6;
    CHECK_FAILURE(m_webViewEnvironment->QueryInterface(IID_PPV_ARGS(&webviewEnvironment6)));

    wil::com_ptr<ICoreWebView2PrintSettings> printSettings;
    CHECK_FAILURE(webviewEnvironment6->CreatePrintSettings(&printSettings));

    wil::com_ptr<ICoreWebView2ExperimentalPrintSettings2> printSettings2;
    CHECK_FAILURE(printSettings->QueryInterface(IID_PPV_ARGS(&printSettings2)));

    CHECK_FAILURE(printSettings->put_Orientation(samplePrintSettings.Orientation));
    CHECK_FAILURE(printSettings2->put_Copies(samplePrintSettings.Copies));
    CHECK_FAILURE(printSettings2->put_PagesPerSide(samplePrintSettings.PagesPerSide));
    CHECK_FAILURE(printSettings2->put_PageRanges(samplePrintSettings.Pages.c_str()));
    if (samplePrintSettings.Media == COREWEBVIEW2_PRINT_MEDIA_SIZE_CUSTOM)
    {
        CHECK_FAILURE(printSettings->put_PageWidth(samplePrintSettings.PaperWidth));
        CHECK_FAILURE(printSettings->put_PageHeight(samplePrintSettings.PaperHeight));
    }
    CHECK_FAILURE(printSettings2->put_ColorMode(samplePrintSettings.ColorMode));
    CHECK_FAILURE(printSettings2->put_Collation(samplePrintSettings.Collation));
    CHECK_FAILURE(printSettings2->put_Duplex(samplePrintSettings.Duplex));
    CHECK_FAILURE(printSettings->put_ScaleFactor(samplePrintSettings.ScaleFactor));
    CHECK_FAILURE(
        printSettings->put_ShouldPrintBackgrounds(samplePrintSettings.PrintBackgrounds));
    CHECK_FAILURE(
        printSettings->put_ShouldPrintBackgrounds(samplePrintSettings.PrintBackgrounds));
    CHECK_FAILURE(
        printSettings->put_ShouldPrintHeaderAndFooter(samplePrintSettings.HeaderAndFooter));
    CHECK_FAILURE(printSettings->put_HeaderTitle(samplePrintSettings.HeaderTitle.c_str()));
    CHECK_FAILURE(printSettings->put_FooterUri(samplePrintSettings.FooterUri.c_str()));
    CHECK_FAILURE(printSettings2->put_PrinterName(printerName.c_str()));

    wil::unique_cotaskmem_string title;
    CHECK_FAILURE(m_webView->get_DocumentTitle(&title));

    CHECK_FAILURE(webView2Experimental17->Print(
        printSettings.get(),
        Callback<ICoreWebView2ExperimentalPrintCompletedHandler>(
            [title = std::move(title),
             this](HRESULT errorCode, COREWEBVIEW2_PRINT_STATUS printStatus) -> HRESULT
            {
                std::wstring message = L"";
                if (errorCode == S_OK && printStatus == COREWEBVIEW2_PRINT_STATUS_SUCCEEDED)
                {
                    message = L"Printing " + std::wstring(title.get()) +
                              L" document to printer is succedded";
                }
                else if (
                    errorCode == S_OK &&
                    printStatus == COREWEBVIEW2_PRINT_STATUS_PRINTER_UNAVAILABLE)
                {
                    message = L"Selected printer is not found, not available, offline or "
                              L"error state.";
                }
                else if (errorCode == E_INVALIDARG)
                {
                    message = L"Invalid settings provided for the specified printer";
                }
                else if (errorCode == E_ABORT)
                {
                    message = L"Printing " + std::wstring(title.get()) +
                              L" document already in progress";
                }
                else
                {
                    message = L"Printing " + std::wstring(title.get()) +
                              L" document to printer is failed";
                }

                AsyncMessageBox(message, L"Print to printer");

                return S_OK;
            })
            .Get()));
    return true;
}

PrintToPdfStream

Provides the Pdf data of current web page asynchronously for the provided settings.

public HRESULT PrintToPdfStream(ICoreWebView2PrintSettings * printSettings, ICoreWebView2ExperimentalPrintToPdfStreamCompletedHandler * handler)

Stream will be rewound to the start of the pdf data.

See ICoreWebView2PrintSettings for description of settings. Passing nullptr for printSettings results in default print settings used.

The async PrintToPdfStream operation completes when it finishes writing to the stream. At this time the ICoreWebView2PrintToPdfStreamCompletedHandler is invoked. Only one Printing operation can be in progress at a time. If PrintToPdfStream is called while a PrintToPdfStream or PrintToPdf or Print job is in progress, the completed handler is immediately invoked with E_ABORT. This is only for printing operation on one webview.

// This example prints the Pdf data of the current page to a stream.
bool AppWindow::PrintToPdfStream()
{
    wil::com_ptr<ICoreWebView2Experimental17> webView2Experimental17;
    CHECK_FAILURE(m_webView->QueryInterface(IID_PPV_ARGS(&webView2Experimental17)));

    wil::unique_cotaskmem_string title;
    CHECK_FAILURE(m_webView->get_DocumentTitle(&title));

    // Passing nullptr for `ICoreWebView2PrintSettings` results in default print settings used.
    CHECK_FAILURE(webView2Experimental17->PrintToPdfStream(
        nullptr,
        Callback<ICoreWebView2ExperimentalPrintToPdfStreamCompletedHandler>(
            [title = std::move(title), this](HRESULT errorCode, IStream* pdfData) -> HRESULT
            {
                DisplayPdfDataInPrintDialog(pdfData);

                std::wstring message =
                    L"Printing " + std::wstring(title.get()) + L" document to PDF Stream " +
                    ((errorCode == S_OK && pdfData != nullptr) ? L"succedded" : L"failed");

                AsyncMessageBox(message, L"Print to PDF Stream");

                return S_OK;
            })
            .Get()));
    return true;
}

ShowPrintUI

Opens the print dialog to print the current web page.

public HRESULT ShowPrintUI(COREWEBVIEW2_PRINT_DIALOG_KIND printDialogKind)

See COREWEBVIEW2_PRINT_DIALOG_KIND for descriptions of print dialog kinds.

Invoking browser or system print dialog doesn't open new print dialog if it is already open.

// Shows the user a print dialog. If `printDialogKind` is
// COREWEBVIEW2_PRINT_DIALOG_KIND_BROWSER, opens a browser print preview dialog,
// COREWEBVIEW2_PRINT_DIALOG_KIND_SYSTEM opens a system print dialog.
bool AppWindow::ShowPrintUI(COREWEBVIEW2_PRINT_DIALOG_KIND printDialogKind)
{
    auto webView2Experimental17 = m_webView.try_query<ICoreWebView2Experimental17>();
    CHECK_FEATURE_RETURN(webView2Experimental17);
    CHECK_FAILURE(webView2Experimental17->ShowPrintUI(printDialogKind));
    return true;
}