昨日の
gogowaten.hatenablog.com
続き
PDFファイルをロックしないで画像として表示したい
表示しているPDFファイルは
農林水産省 トマトの種類と見分け方
http://www.maff.go.jp/j/pr/aff/1708/pdf/1708_04.pdf
より引用
アプリを終了すれば削除できるけどめんどくさい、これを解決したい
private async void ButtonLock_Click(object sender, RoutedEventArgs e)
{
Windows.Storage.StorageFile file = await Windows.Storage.StorageFile.GetFileFromPathAsync(@"D:\ブログ用\1708_04.pdf");
Windows.Data.Pdf.PdfDocument MyPdfDocument = await Windows.Data.Pdf.PdfDocument.LoadFromFileAsync(file);
using (Windows.Data.Pdf.PdfPage page = MyPdfDocument.GetPage(0))
{
using (var stream = new Windows.Storage.Streams.InMemoryRandomAccessStream())
{
await page.RenderToStreamAsync(stream);
var image = new BitmapImage();
image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad;
image.StreamSource = stream.AsStream();
image.EndInit();
MyImage.Source = image;
}
}
}
private async void ButtonFree_Click(object sender, RoutedEventArgs e)
{
Windows.Storage.StorageFile file = await Windows.Storage.StorageFile.GetFileFromPathAsync(@"D:\ブログ用\1708_04.pdf");
using (Windows.Storage.Streams.IRandomAccessStream RAStream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read))
{
Windows.Data.Pdf.PdfDocument MyPdfDocument = await Windows.Data.Pdf.PdfDocument.LoadFromStreamAsync(RAStream);
using (Windows.Data.Pdf.PdfPage page = MyPdfDocument.GetPage(0))
{
using (var stream = new Windows.Storage.Streams.InMemoryRandomAccessStream())
{
await page.RenderToStreamAsync(stream);
var image = new BitmapImage();
image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad;
image.StreamSource = stream.AsStream();
image.EndInit();
MyImage.Source = image;
}
}
}
}
違うのは太字のところだけで、ストリームで開けばいいみたい、そのためには
StorageFile.OpenAsyncでストリームにしたのを
Windows.Data.Pdf.PdfDocument.LoadFromStreamAsyncで読み込めばいいみたい
ストリームまでの道のり
画像ファイルをロックしないで開くときもストリームを使っていたから、PDFもおなじようにできないかなあって思っていて
ファイルからPdfDocumentを作成するところでLoadFromStreamAsyncってそれっぽいのがあったので
たまによく使うFileStreamで試してみたら
できない
なんでも型が違うからできないって言われる
このWindows.Storage.Streams.IRandomAccessStreamってのにすればいいみたいだけど、コレガワカラナイ
ようやく見つけたのがStrageFileのOpenAsyncメソッド
使用法のところを見るとWindows.Storage.Streams.IRandomAccessStreamってある!
使ってみるとアクセスモードを指定するみたいで
ReadとReadWriteのどちらか、書き込みはしないのでRead指定
あとはさっきのLoadFromStreamAsyncに渡したら期待通りの動きにできたわけ
今回のロックされないPdfDocument取得
- Windows.Storage.StorageFile.GetFileFromPathAsyncにファイルパスを渡して、StorageFile作成
- StorageFile.OpenAsyncでWindows.Storage.Streams.IRandomAccessStream(ストリーム)作成
- Windows.Data.Pdf.PdfDocument.LoadFromStreamAsyncにストリームを渡して、PdfDocument作成
前回のロックされてしまうPdfDocument取得
- Windows.Storage.StorageFile.GetFileFromPathAsyncにファイルパスを渡して、StorageFile作成
- Windows.Data.Pdf.PdfDocument.LoadFromFileAsyncにStorageFileを渡して、PdfDocument作成
開いている状態でも削除(ゴミ箱へ移動)できた
<Grid>
<StackPanel>
<Button Content="Free" Click="ButtonFree_Click"/>
<Button Content="Lock" Click="ButtonLock_Click"/>
<Image Name="MyImage"/>
</StackPanel>
</Grid>
using System;
using System.Windows;
using System.Windows.Media.Imaging;
using System.IO;
namespace _20200102_PDFファイルをロックしないで開く
{
<summary>
</summary>
public partial class MainWindow : Window
{
Windows.Data.Pdf.PdfDocument MyPdfDocument;
string MyPdfFilePath;
public MainWindow()
{
InitializeComponent();
MyPdfFilePath = @"D:\ブログ用\1708_04.pdf";
}
private async void ButtonFree_Click(object sender, RoutedEventArgs e)
{
Windows.Storage.StorageFile file = await Windows.Storage.StorageFile.GetFileFromPathAsync(MyPdfFilePath);
using (Windows.Storage.Streams.IRandomAccessStream RAStream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read))
{
MyPdfDocument = await Windows.Data.Pdf.PdfDocument.LoadFromStreamAsync(RAStream);
using (Windows.Data.Pdf.PdfPage page = MyPdfDocument.GetPage(0))
{
using (var stream = new Windows.Storage.Streams.InMemoryRandomAccessStream())
{
await page.RenderToStreamAsync(stream);
var image = new BitmapImage();
image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad;
image.StreamSource = stream.AsStream();
image.EndInit();
MyImage.Source = image;
}
}
}
}
private async void ButtonLock_Click(object sender, RoutedEventArgs e)
{
Windows.Storage.StorageFile file = await Windows.Storage.StorageFile.GetFileFromPathAsync(MyPdfFilePath);
MyPdfDocument = await Windows.Data.Pdf.PdfDocument.LoadFromFileAsync(file);
using (Windows.Data.Pdf.PdfPage page = MyPdfDocument.GetPage(0))
{
using (var stream = new Windows.Storage.Streams.InMemoryRandomAccessStream())
{
await page.RenderToStreamAsync(stream);
var image = new BitmapImage();
image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad;
image.StreamSource = stream.AsStream();
image.EndInit();
MyImage.Source = image;
}
}
}
}
}
ギットハブ
wpf_test2/20200102_PDFファイルをロックしないで開く
ファイルを開いた状態でもファイル削除できるようになった、いいかどうかはわからないけどねえ、jpegに変換したら元のPDFファイルは要らなーい
ダウンロード
PDFtoJPEG_1.2.zip
関連記事
続きは翌日
gogowaten.hatenablog.com