当前位置: 首页 > news >正文

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();}
}
http://www.lqws.cn/news/502075.html

相关文章:

  • Windows WSL安装Emscripten‌/emsdk(失败)
  • Netty内存池核心PoolArena源码解析
  • OSS监控体系搭建:Prometheus+Grafana实时监控流量、错误码、存储量(开源方案替代云监控自定义视图)
  • RAG大模型开发初探 || 动手大模型应用开发
  • 医疗AI数智立体化体系V2.0泛化多模块编程操作手册--架构师版(下)
  • 第一篇Anaconda/Pytorch/Opencv/Yolov5环境搭建
  • 本地部署搜索引擎 Elasticearch 并实现外网访问(Windows 版本)
  • 6.24_JAVA_微服务day07_RabbitMQ高级
  • 基于C#实现(WinForm)P2P聊天小程序
  • NLP基础1_word-embedding
  • SQL关键字三分钟入门:UPDATE —— 修改数据
  • 秋招Day14 - MySQL - 场景题
  • 3D看房实现房屋的切换
  • 基于目标驱动的分布式敏捷开发
  • 使用ffmpeg根据时间戳自动截取音频
  • 集成 Odoo、n8n 与 Dify,实现智能业务流程自动化
  • 《AI大模型应用技术开发工程师》学习总结
  • 工作流会使用到Webhook是什么
  • ArkTS与仓颉开发语言:鸿蒙编程的双子星
  • MySQL深分页性能瓶颈:问题分析与解决方案
  • Leetcode 3588. Find Maximum Area of a Triangle
  • 做上门私厨/上门做饭App小程序,到底是定制开发,还是选成品系统?
  • 开源跨平台的轻量 C# 编辑器
  • 软件设计模式_期末复习
  • 时序数据库IoTDB可实现的基本操作及命令汇总
  • Idea新UI
  • C++ 运行、编译和链接基础内容
  • gRPC在Windows DLL构建中的问题与现状
  • 云电脑,“死”于AI时代前夕 | 数智化观察
  • 麒麟V10操作系统离线安装Docker、Docker compose和1Panel