У меня есть настольное приложение на C# Net Core WinUI 3, которое шифрует файлы. Мне удалось расшифровать PDF-файл, и теперь я хочу отобразить его в своем приложении. У меня есть расшифровка PDF-файла в потоке, и из этого потока я хочу отобразить файл в своем приложении без использования его с другой программой и без установки внешней программы. Мне нужно только отображать PDF-файл только для чтения без возможности редактирования. Кроме того, мое приложение должно работать в автономном режиме.
Я попробовал WebView2, но мне нужно установить WebView2 на компьютер. Я также пытаюсь конвертировать PDF в изображение, но мне нужна внешняя программа. Что я могу сделать?
Вы можете использовать класс PdfDocument для загрузки PDF-файла.
Позвольте мне показать вам пример с функцией Drag and Drop.
Shell.xaml
<Page
x:Class = "PdfDemo.Shell"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns:local = "using:PdfDemo"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
Background = "{ThemeResource ApplicationPageBackgroundThemeBrush}"
mc:Ignorable = "d">
<Grid RowDefinitions = "Auto,*">
<Grid
x:Name = "DroppingSpaceGrid"
Grid.Row = "0"
AllowDrop = "True"
Background = "Transparent"
DragOver = "DroppingSpaceGrid_DragOver"
Drop = "DroppingSpaceGrid_Drop">
<TextBlock
HorizontalAlignment = "Center"
VerticalAlignment = "Center"
Text = "Drop your PDF here." />
</Grid>
<GridView
Grid.Row = "1"
ItemsSource = "{x:Bind Pages, Mode=OneWay}">
<GridView.ItemTemplate>
<DataTemplate x:DataType = "BitmapImage">
<Image Source = "{x:Bind}" />
</DataTemplate>
</GridView.ItemTemplate>
</GridView>
</Grid>
</Page>
Shell.xaml.cs
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Media.Imaging;
using System;
using System.Collections.ObjectModel;
using System.Linq;
using Windows.ApplicationModel.DataTransfer;
using Windows.Data.Pdf;
using Windows.Storage;
using Windows.Storage.Streams;
namespace PdfDemo;
public sealed partial class Shell : Page
{
public Shell()
{
InitializeComponent();
}
private void DroppingSpaceGrid_DragOver(object sender, DragEventArgs e)
{
e.AcceptedOperation = DataPackageOperation.Copy;
e.DragUIOverride.IsCaptionVisible = false;
e.DragUIOverride.IsGlyphVisible = false;
}
private async void DroppingSpaceGrid_Drop(object sender, DragEventArgs e)
{
if ((await e.DataView.GetStorageItemsAsync()).FirstOrDefault() is not StorageFile file ||
file.FileType is not ".pdf")
{
return;
}
PdfDocument pdfDocument = await PdfDocument.LoadFromFileAsync(file);
Pages.Clear();
for (int i = 0; i < pdfDocument.PageCount; i++)
{
PdfPage pdfPage = pdfDocument.GetPage((uint)i);
using var stream = new InMemoryRandomAccessStream();
await pdfPage.RenderToStreamAsync(stream);
var bitmapImage = new BitmapImage();
await bitmapImage.SetSourceAsync(stream);
Pages.Add(bitmapImage);
}
}
public ObservableCollection<BitmapImage> Pages { get; } = [];
}
большое спасибо. ты мне помогаешь!