80 lines
2.6 KiB
C#
80 lines
2.6 KiB
C#
using System;
|
||
using System.IO;
|
||
using System.Threading.Tasks;
|
||
using System.Windows;
|
||
using System.Windows.Media.Imaging;
|
||
using Windows.Data.Pdf;
|
||
using Windows.Storage;
|
||
using Windows.Storage.Streams;
|
||
|
||
namespace Ink_Canvas.Helpers
|
||
{
|
||
/// <summary>
|
||
/// 使用 Windows.Data.Pdf(WinRT)将 PDF 页渲染为 WPF 可用的位图。
|
||
/// </summary>
|
||
internal static class PdfWinRtHelper
|
||
{
|
||
public static async Task<uint> GetPageCountAsync(string pdfPath)
|
||
{
|
||
if (string.IsNullOrWhiteSpace(pdfPath) || !File.Exists(pdfPath))
|
||
return 0;
|
||
|
||
var file = await StorageFile.GetFileFromPathAsync(pdfPath).AsTask();
|
||
var doc = await PdfDocument.LoadFromFileAsync(file).AsTask();
|
||
if (doc.IsPasswordProtected)
|
||
return 0;
|
||
return doc.PageCount;
|
||
}
|
||
|
||
public static async Task<BitmapSource> RenderPageToBitmapSourceAsync(string pdfPath, uint pageIndex)
|
||
{
|
||
if (string.IsNullOrWhiteSpace(pdfPath) || !File.Exists(pdfPath))
|
||
return null;
|
||
|
||
var file = await StorageFile.GetFileFromPathAsync(pdfPath).AsTask();
|
||
var doc = await PdfDocument.LoadFromFileAsync(file).AsTask();
|
||
if (doc.IsPasswordProtected)
|
||
return null;
|
||
if (pageIndex >= doc.PageCount)
|
||
return null;
|
||
|
||
var page = doc.GetPage(pageIndex);
|
||
try
|
||
{
|
||
using (var ras = new InMemoryRandomAccessStream())
|
||
{
|
||
await page.RenderToStreamAsync(ras).AsTask();
|
||
ras.Seek(0);
|
||
|
||
var ms = new MemoryStream();
|
||
using (var netStream = ras.AsStreamForRead())
|
||
netStream.CopyTo(ms);
|
||
ms.Position = 0;
|
||
|
||
try
|
||
{
|
||
return await Application.Current.Dispatcher.InvokeAsync(() =>
|
||
{
|
||
var bi = new BitmapImage();
|
||
bi.BeginInit();
|
||
bi.StreamSource = ms;
|
||
bi.CacheOption = BitmapCacheOption.OnLoad;
|
||
bi.EndInit();
|
||
bi.Freeze();
|
||
return (BitmapSource)bi;
|
||
});
|
||
}
|
||
finally
|
||
{
|
||
ms.Dispose();
|
||
}
|
||
}
|
||
}
|
||
finally
|
||
{
|
||
(page as IDisposable)?.Dispose();
|
||
}
|
||
}
|
||
}
|
||
}
|