WinUI & Windows PDF library integration

This guide will help you to integrate a free trial of the Apryse WinUI SDK into WinUI 3 desktop application on Windows. Your free trial includes unlimited trial usage and support from solution engineers.

Prerequisites

  • Visual Studio 2019 16.8 or higher.Note: This guide will use Visual Studio 2019.
  • .NET 5+ installed.
  • Apryse's WinUI PDF library for Windows:

Download the SDK

Download

No trial license key required.

The trial of Apryse Mobile SDK does not require a trial key. A commercial license key is required for use in a production environment. Please contact sales to purchase a commercial key or if you need any other license key assistance.

Keep your license keys confidential.

License keys are uniquely generated. Please make sure that it is not publicly available (e.g. in your public GitHub).

Create a WinUI 3 desktop application

  1. Open a new instance of Visual Studio and create a new Project (File -> New -> Project...). In the new project dialog, select C# and WinUI development. Call the application SimplePDFViewer.

Apryse Docs Image
  1. During the creation make sure to choose one of the templates that uses MVVM for easy setup

Apryse Docs Image

Integrate into your application

You can follow a manual or nuget integration as described below.

Manually

  1. In your WinUI 3 application project right-click on Dependencies and Add Project Reference.... Navigate to PDFNET_BASE/Lib/ and choose folder with project's .NET version (.NET 5 or 6) and add PDFNetWinUI.dll.

PDFNetWinUI.dll is an interop module that allows different version of projects using .NET to consume native libraries, which will be added to the solution next.

  1. Now we will add the native librar to the project by right-clicling on the project and selecting Add -> Existing item, then navitate to PDFNET_BASE/Lib/ and select which platform (x64 or x86) the project is targeting and select pdftron.dll native library.

Once the pdftron.dll is added to the project, clikc on it and under it's properties change Copy to Output Directory to Copy always

  1. The result for your project should look similar to the image below.

Apryse Docs Image

NuGet using Visual Studio

This section will go through the nuget integration steps.

  1. Find your project in the Solution Explorer. Right Click on the project and click on Manage NuGet Packages.... In the package manager, select the Browse tab and search for PDFTron.WinUI. Install this package.

You can also find the package on nuget.org.

  1. Done integrating Apryse WinUI SDK to your WinUI 3 desktop app. Now you can go to the next step View a document below.

Viewing a document in your WinUI 3 desktop application

These steps must be follow reusing the aplication created above for either Manual or NuGet integration.

Step 1: Update xaml

Using the MainPage.xaml of your WinUI 3 application project create a Border and a Button in the Grid We will use the Border to host the PDFViewCtrl which will be used to view the PDF document. The Button will be used to open the PDF document using WinRT calls.

Your XAML should look like the following:

XML

1<Grid Grid.Row="1" Background="{ThemeResource SystemControlPageBackgroundChromeLowBrush}">
2 <Grid.RowDefinitions>
3 <RowDefinition Height="*"/>
4 <RowDefinition Height="Auto"/>
5 </Grid.RowDefinitions>
6
7 <Border x:Name="PDFViewBorder" Grid.Row="0"/>
8
9 <StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Right" Margin="5">
10 <Button x:Name="OpenButton" Click="OpenButton_Click">Open</Button>
11 </StackPanel>
12</Grid>

Note we added a OpenButton_Click event to the button which will be used to write the logic to open a document. We will get to it later in the guide.

Step 2: Add the viewer

Now, we want to add the PDFViewCtrl to the app. We do this in MainPage.xaml.cs (code-behind). Create a PDFViewCtrl variable to be used in the scope of this page:

C#

1public sealed partial class MainPage : Page
2{
3 pdftron.PDF.PDFViewCtrl MyPDFViewCtrl;
4 ...

Next, we need to initialize PDFNet and create a PDFViewCtrl, so let's do this in the constructor of the MainPage. We also need to make the PDFViewCtrl the child of the PDFViewBorder to it can be host and rendered properly.

C#

1public MainPage()
2{
3 this.InitializeComponent();
4
5 pdftron.PDFNet.Initialize("YOUR_APRYSE_LICENSE_KEY");
6 MyPDFViewCtrl = new pdftron.PDF.PDFViewCtrl();
7 PDFViewBorder.Child = MyPDFViewCtrl;
8}

We also have to add a handler for the Open button. Let's do that in MainPage's constructor after we have created a PDFViewCtrl. Make sure to make the event async:

C#

1private async void OpenButton_Click(object sender, Microsoft.UI.Xaml.RoutedEventArgs e)
2{
3
4}

Before we add the proper logic, ensure to add the following namespaces:

C#

1using System;
2using System.Runtime.InteropServices; // used to make WinRT calss
3using WinRT; // this namespace must be added in roder to use WinRT classes
4
5using Microsoft.UI.Xaml;
6using Windows.Storage;
7using Windows.Storage.Pickers;

Now we need to add the logic to open a document, in this case we are using the FileOpenPicker from WinRT and using interop to ensure the logic works properly. Below we have also added a helper logic to make sure the file picker will run on a win32 desktop app by setting the proper handle (HWND).

C#

1private async void OpenButton_Click(object sender, Microsoft.UI.Xaml.RoutedEventArgs e)
2{
3 // Get a file from the file picker.
4 FileOpenPicker fileOpenPicker = new FileOpenPicker();
5 fileOpenPicker.ViewMode = PickerViewMode.List;
6 fileOpenPicker.FileTypeFilter.Add(".pdf");
7
8 // When running on win32, FileOpenPicker needs to know the top-level hwnd via IInitializeWithWindow::Initialize.
9 if (Window.Current == null)
10 {
11 IInitializeWithWindow initializeWithWindowWrapper = fileOpenPicker.As<IInitializeWithWindow>();
12 IntPtr hwnd = GetActiveWindow();
13 initializeWithWindowWrapper.Initialize(hwnd);
14 }
15
16 var file = await fileOpenPicker.PickSingleFileAsync();
17
18 // Create a PDFDocument and use it as the source for the PDFViewCtrl
19 if (file != null)
20 {
21 Windows.Storage.Streams.IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite);
22 pdftron.PDF.PDFDoc doc = pdftron.PDF.PDFDoc.CreateFromStream(stream);
23 MyPDFViewCtrl.SetDoc(doc);
24 }
25}
26
27/// <summary>
28/// "In Desktop, or Win32, it's required to specify which Window Handle (HWND) owns the File/Folder Picker"
29/// Github issue: https://github.com/microsoft/microsoft-ui-xaml/issues/4100
30/// </summary>
31[ComImport, System.Runtime.InteropServices.Guid("3E68D4BD-7135-4D10-8018-9FB6D9F33FA1"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
32public interface IInitializeWithWindow
33{
34 void Initialize([In] IntPtr hwnd);
35}
36
37[DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto, PreserveSig = true, SetLastError = false)]
38public static extern IntPtr GetActiveWindow();

Now you can build and launch the app and we should now have a very basic PDF document viewer.

Did you find this helpful?

Trial setup questions?

Ask experts on Discord

Need other help?

Contact Support

Pricing or product questions?

Contact Sales