WPF/Net Core 简单显示PDF

发布于:2025-06-25 ⋅ 阅读:(17) ⋅ 点赞:(0)

第一种方式: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();
	}
}


网站公告

今日签到

点亮在社区的每一天
去签到