Open password-protected PDFs in UWP

Opening password-protected documents might require some extra work depending on your specific use case. Nutrient UWP SDK provides two different ways of opening them: through the UI, or programmatically.

By default, Nutrient UWP SDK will prompt your user with a password dialog, asking to unlock the PDF if necessary. This guide will go over the second option, detailing how to open password-protected documents programmatically.

Programmatically opening password-protected PDFs

If you want to programmatically supply a password, use the Password property of DocumentSource:

DocumentSource documentSource = ...

// Set the password in the document source.
documentSource.Password = "document-password";

await PDFView.Controller.ShowDocumentAsync(documentSource);

Handling password events

If you want to asynchronously provide the password whenever encountering a locked PDF, or if you want to implement your own password dialog, PDFView.Controller exposes the OnRequestPassword event, which is triggered whenever a password-protected PDF is opened without the correct password:

public async void OpenPDF(DocumentSource source)
{
    // Register the event handler that will asynchronously provide
    // the password for opening the encrypted PDF.
    PDFView.Controller.OnRequestPassword += Controller_OnRequestPassword;
    await PDFView.Controller.ShowDocumentAsync(documentSource);
}

/// <summary>
/// Event handler that's called every time Nutrient encounters a password-protected PDF.
/// </summary>
private async void Controller_OnRequestPassword(Controller sender, PasswordEventArgs args)
{
    // It's essential that you call `Complete()` on the `Deferral` at the end.
    var deferral = args.Deferral;

    try
    {
        // This can be synchronous or asynchronous (e.g. a user-facing dialog).
        var password = await GetPassword();
        args.Response = new PasswordRequestResponse(success: true, password: password, mayTryAgain: true);
    }
    finally
    {
        deferral.Complete();
    }
}

You can check our PasswordDialogViewModel example inside the UWP Catalog for an example of this API in action, including the implementation of a custom password dialog.

Checking if a PDF is protected

To achieve this, you must attempt to open the DocumentSource through the Document.OpenDocumentAsync method, catching the relevant exception as such:

try {
    var documentSource = DocumentSource.CreateFromStorageFile(file);
    await Document.OpenDocumentAsync(documentSource);
}
catch (COMException e)
{
    if (e.ErrorCode == PSPDFKit.ExceptionCodes.InvalidPassword)
    {
        isProtected = true;
    }
}