WPF/Net Core 简单显示PDF
使用自带的WebView2控件显示PDF文件
- 第一种方式:WebView2库导入使用NuGet
- 第二种方式:使用PDF第三方库显示
第一种方式:WebView2库导入使用NuGet
工具–>NuGet包管理器–>管理解决方案的NuGet程序包,搜索WebView2安装
xaml中加入
xmlns:wv2="clr-namespace:Microsoft.Web.WebView2.Wpf;assembly=Microsoft.Web.WebView2.Wpf"
如下:
<Page x:Class="zAssist.PdfView"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:wv2="clr-namespace:Microsoft.Web.WebView2.Wpf;assembly=Microsoft.Web.WebView2.Wpf"xmlns:local="clr-namespace:zAssist"mc:Ignorable="d" d:DesignHeight="600" d:DesignWidth="800"Title="PdfView"><Grid Background="White"><Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="*"/></Grid.RowDefinitions><Button x:Name="btnBack"Background="Transparent"HorizontalAlignment="Left"VerticalAlignment="Top"Content="Sign in" FontSize="20"Width="150" Height="35"Click="btnBack_Click"><Button.Template><ControlTemplate TargetType="Button"><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="Auto"/><ColumnDefinition Width="*"/></Grid.ColumnDefinitions><Image Grid.Column="0" x:Name="btnImage" Stretch="None"><Image.Style><Style TargetType="Image"><Setter Property="Source" Value="/Resources/back.png"/><Style.Triggers><DataTrigger Binding="{Binding IsMouseOver, RelativeSource={RelativeSource AncestorType=Button}}" Value="True"><Setter Property="Source" Value="/Resources/back.png"/></DataTrigger><DataTrigger Binding="{Binding IsPressed, RelativeSource={RelativeSource AncestorType=Button}}" Value="True"><Setter Property="Source" Value="/Resources/back.png"/></DataTrigger></Style.Triggers></Style></Image.Style></Image><TextBlock Grid.Column="1" Text="{TemplateBinding Content}"VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/></Grid></ControlTemplate></Button.Template></Button><!--用于显示Pdf 的 WebView2控件--><wv2:WebView2 Grid.Row="1" Name="webView" Loaded="WebView_Loaded"/> </Grid>
</Page>
代码块:
using PdfViewer.Enums;
using System.ComponentModel;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using System.Windows.Resources;
using System.Windows.Shapes;namespace zAssist;/// <summary>
/// PdfView.xaml 的交互逻辑
/// </summary>
public partial class PdfView : Page
{public PdfView (){InitializeComponent();this.DataContext = this;}private void btnBack_Click(object sender, RoutedEventArgs e){NavigationService.GetNavigationService(this).GoBack();//返回上一个界面,保持之前的操作}private void WebView_Loaded(object sender, RoutedEventArgs e){InitializeAsync();}private async void InitializeAsync(){await webView.EnsureCoreWebView2Async(null);// webView.CoreWebView2.Navigate(Properties.Settings.Default.UrlForget);//必须绝对路径,下面两种方式都可以Uri pdfPath = new Uri(@"file:///E:/Tools/zSolution/Resources/files/test.pdf", UriKind.Absolute);//webView.CoreWebView2.Navigate(@"file:///E:/Tools/zSolution/Resources/files/test.pdf");webView.Source = pdfPath;}
}
第二种方式:使用PDF第三方库显示
使用NuGet 导入 PdfiumViewer.Native.x86.v8-xfa、PdfiumViewer.Native.x86_64-xfa、PropertyChanged.Fody(通知) 和第三方库 PdfiumViewer,在.Net Core工程种PdfiumViewer 库安装了但是不能使用,本人到github中把PdfiumViewer源码下载拿到测试代码移植到我的工程中的,PdfiumViewer github存放位置在NuGet中有
上代码:
<Page x:Class="zAssist.PdfView"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:zAssist"xmlns:pdfiumViewer="clr-namespace:PdfViewer;assembly=PdfViewer"xmlns:core="clr-namespace:PdfViewer.Core;assembly=PdfViewer"mc:Ignorable="d" d:DesignHeight="600" d:DesignWidth="800"Title="PdfView" Loaded="Page_Loaded"><Grid Background="White"><Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="*"/></Grid.RowDefinitions><Button x:Name="btnBack" Background="Transparent"HorizontalAlignment="Left"VerticalAlignment="Top"Content="Register" FontSize="20"Width="120" Height="30" Click="btnBack_Click"><Button.Template><ControlTemplate TargetType="Button"><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="Auto"/><ColumnDefinition Width="*"/></Grid.ColumnDefinitions><Image Grid.Column="0" x:Name="btnImage" Stretch="None"><Image.Style><Style TargetType="Image"><Setter Property="Source" Value="/Resources/back.png"/><Style.Triggers><DataTrigger Binding="{Binding IsMouseOver, RelativeSource={RelativeSource AncestorType=Button}}" Value="True"><Setter Property="Source" Value="/Resources/back.png"/></DataTrigger><DataTrigger Binding="{Binding IsPressed, RelativeSource={RelativeSource AncestorType=Button}}" Value="True"><Setter Property="Source" Value="/Resources/back.png"/></DataTrigger></Style.Triggers></Style></Image.Style></Image><TextBlock Grid.Column="1" Text="{TemplateBinding Content}"VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/></Grid></ControlTemplate></Button.Template></Button><pdfiumViewer:PdfRenderer Grid.Row="1" Name="Renderer" Padding="10"/><StackPanel Grid.Row="1"Background="Transparent"Orientation="Vertical"VerticalAlignment="Center"HorizontalAlignment="Right"Width="40"><Button ToolTip="Previous Page" Click="OnPrevPageClick"><Image Source="Resources/prev.png" /></Button><TextBlock VerticalAlignment="Center" FontSize="14"><Run Text="{Binding Page, Mode=OneWay}"/><Run Text="/"/><Run Text="{Binding ElementName=Renderer, Path=PageCount, Mode=OneWay}"/></TextBlock><Button ToolTip="Next Page" Click="OnNextPageClick"><Image Source="Resources/next.png" /></Button><Button ToolTip="Zoom in" Click="OnZoomInClick"><Image Source="Resources/zoom_in.png" /></Button><TextBlock VerticalAlignment="Center" FontSize="14"><Run Text="{Binding ZoomPercent, Mode=OneWay}"/><Run Text="%"/></TextBlock><Button ToolTip="Zoom out" Click="OnZoomOutClick"><Image Source="Resources/zoom_out.png" /></Button><Button ToolTip="Fit Width" Click="OnFitWidth"><Image Source="Resources/fit_width.png" /></Button><Button ToolTip="Fit Height" Click="OnFitHeight"><Image Source="Resources/fit_height.png" /></Button></StackPanel></Grid>
</Page>
using PdfViewer.Enums;
using System.ComponentModel;
using System.IO;
using System.Runtime.CompilerServices;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using System.Windows.Resources;namespace zAssist;/// <summary>/// PdfView.xaml 的交互逻辑/// </summary>
public partial class PdfView : Page, INotifyPropertyChanged
{public PrivacyNoticeView(){InitializeComponent();this.DataContext = this;Renderer.PropertyChanged += delegate{OnPropertyChanged(nameof(Page));OnPropertyChanged(nameof(ZoomPercent));};Renderer.VerticalScrollBarVisibility = ScrollBarVisibility.Hidden;Renderer.HorizontalScrollBarVisibility = ScrollBarVisibility.Hidden;Renderer.MaxToFitWidth(true);}private void btnBack_Click(object sender, RoutedEventArgs e){OnClosePdf();NavigationService.GetNavigationService(this).GoBack();//返回上一个界面,保持之前的操作}public double ZoomPercent{get => (int)(Renderer.Zoom * 100);}public int Page{get => Renderer.PageNo + 1;set => Renderer.GotoPage(Math.Min(Math.Max(value - 1, 0), Renderer.PageCount - 1));}private void OpenPdf(){StreamResourceInfo info = App.GetResourceStream(new Uri(@"Resources\files\TermsAndConditions.pdf", uriKind: UriKind.Relative));using (var mem = new MemoryStream()){info.Stream.CopyTo(mem);Renderer.OpenPdf(mem);}}private void OnPrevPageClick(object sender, RoutedEventArgs e){Renderer.PreviousPage();}private void OnNextPageClick(object sender, RoutedEventArgs e){Renderer.NextPage();}private void OnFitWidth(object sender, RoutedEventArgs e){Renderer.SetZoomMode(PdfViewerZoomMode.FitWidth);}private void OnFitHeight(object sender, RoutedEventArgs e){Renderer.SetZoomMode(PdfViewerZoomMode.FitHeight);}private void OnZoomInClick(object sender, RoutedEventArgs e){Renderer.ZoomIn();}private void OnZoomOutClick(object sender, RoutedEventArgs e){if (Renderer.Zoom > 0.5){Renderer.ZoomOut();}}public event PropertyChangedEventHandler PropertyChanged;protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}private async void OnClosePdf(){try{Renderer.UnLoad();await Task.Delay(5000);}catch (Exception exception){Console.WriteLine(exception);}}private void Page_Loaded(object sender, RoutedEventArgs e){OpenPdf();}
}