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 { /// /// 使用 Windows.Data.Pdf(WinRT)将 PDF 页渲染为 WPF 可用的位图。 /// internal static class PdfWinRtHelper { public static async Task 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 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(); } } } }