Some test text!
UWP / Guides / WinUI
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.
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:
(File -> New -> Project...)
. In the new project dialog, select C# and WinUI development. Call the application SimplePDFViewer
.You can follow a manual or nuget integration as described below.
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.
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
This section will go through the nuget integration steps.
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.
View a document
below.These steps must be follow reusing the aplication created above for either Manual or NuGet integration.
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:
<Grid Grid.Row="1"
Background="{ThemeResource SystemControlPageBackgroundChromeLowBrush}">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Border x:Name="PDFViewBorder" Grid.Row="0"/>
<StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Right" Margin="5">
<Button x:Name="OpenButton" Click="OpenButton_Click">Open</Button>
</StackPanel>
</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.
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:
public sealed partial class MainPage : Page
{
pdftron.PDF.PDFViewCtrl MyPDFViewCtrl;
...
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.
public MainPage()
{
this.InitializeComponent();
pdftron.PDFNet.Initialize("YOUR_APRYSE_LICENSE_KEY");
MyPDFViewCtrl = new pdftron.PDF.PDFViewCtrl();
PDFViewBorder.Child = MyPDFViewCtrl;
}
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
:
private async void OpenButton_Click(object sender, Microsoft.UI.Xaml.RoutedEventArgs e)
{
}
Before we add the proper logic, ensure to add the following namespaces:
using System;
using System.Runtime.InteropServices; // used to make WinRT calss
using WinRT; // this namespace must be added in roder to use WinRT classes
using Microsoft.UI.Xaml;
using Windows.Storage;
using 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).
private async void OpenButton_Click(object sender, Microsoft.UI.Xaml.RoutedEventArgs e)
{
// Get a file from the file picker.
FileOpenPicker fileOpenPicker = new FileOpenPicker();
fileOpenPicker.ViewMode = PickerViewMode.List;
fileOpenPicker.FileTypeFilter.Add(".pdf");
// When running on win32, FileOpenPicker needs to know the top-level hwnd via IInitializeWithWindow::Initialize.
if (Window.Current == null)
{
IInitializeWithWindow initializeWithWindowWrapper = fileOpenPicker.As<IInitializeWithWindow>();
IntPtr hwnd = GetActiveWindow();
initializeWithWindowWrapper.Initialize(hwnd);
}
var file = await fileOpenPicker.PickSingleFileAsync();
// Create a PDFDocument and use it as the source for the PDFViewCtrl
if (file != null)
{
Windows.Storage.Streams.IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite);
pdftron.PDF.PDFDoc doc = pdftron.PDF.PDFDoc.CreateFromStream(stream);
MyPDFViewCtrl.SetDoc(doc);
}
}
/// <summary>
/// "In Desktop, or Win32, it's required to specify which Window Handle (HWND) owns the File/Folder Picker"
/// Github issue: https://github.com/microsoft/microsoft-ui-xaml/issues/4100
/// </summary>
[ComImport, System.Runtime.InteropServices.Guid("3E68D4BD-7135-4D10-8018-9FB6D9F33FA1"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IInitializeWithWindow
{
void Initialize([In] IntPtr hwnd);
}
[DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto, PreserveSig = true, SetLastError = false)]
public static extern IntPtr GetActiveWindow();
Now you can build and launch the app and we should now have a very basic PDF document viewer.
Trial setup questions? Ask experts on Discord
Need other help? Contact Support
Pricing or product questions? Contact Sales