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