LoginSignup
11
8

More than 5 years have passed since last update.

【UWP】UWPアプリでインターネット上のPDFファイルを表示する

Posted at

はじめに

こんにちは!

UWPアプリでネット上のPDFファイルを参照する方法の紹介です。(日本語文献が少なすぎる、、、)
iOSから少しそれてしまいますが、Xamarinにも少し関係するためありかと・・・。

UWPでPDFを表示

まずは全体のソースです。


// HTTPクライアントを生成
using (var client = new HttpClient())
{
    using (var uploadResponse = await client.GetAsync(pdfUrl))
    {
        // URL先からストリームを取得
        var temp = await uploadResponse.Content.ReadAsStreamAsync();

        if (temp.AsRandomAccessStream().Size == 0)
        {
            var err = new TextBlock();
            err.Text = "PDFファイルを読み込めませんでした。";
            this.listView.Items.Add(err);
            return;
        }

        // 一時ファイルストリームをPDFドキュメントとしてパース
        pdfDoc = await PdfDocument.LoadFromStreamAsync(temp.AsRandomAccessStream());

        // PDFを1ページずつ画像に変換し、リストビューに挿入
        for (uint i = 0; i < pdfDoc.PageCount; i++)
        {
            PdfPage page = pdfDoc.GetPage(i);

            var stream = new InMemoryRandomAccessStream();
            await page.RenderToStreamAsync(stream);

            var image = new BitmapImage();
            await image.SetSourceAsync(stream);
            var img = new Image();
            img.Source = image;

            this.listView.Items.Add(img);
        }
    }
}

コメントを適宜記入していますが、分割して説明していきます。

// HTTPクライアントを生成
using (var client = new HttpClient())
{
    using (var uploadResponse = await client.GetAsync(pdfUrl))
    {
        // URL先からストリームを取得
        var temp = await uploadResponse.Content.ReadAsStreamAsync();
                            
                            
                            
    }
}

await client.GetAsync(pdfUrl)でHttpClientのレスポンスを取得します。
その取得したレスポンスをawait uploadResponse.Content.ReadAsStreamAsync()でStreamとして読み出します。

        // 一時ファイルストリームをPDFドキュメントとしてパース
        pdfDoc = await PdfDocument.LoadFromStreamAsync(temp.AsRandomAccessStream());
    }
}

次に、temp.AsRandomAccessStream()で取得したStreamをRandomAccessStream型として抽出し、PdfDocumentクラスでPDFファイルとしてパースします。

        // PDFを1ページずつ画像に変換し、リストビューに挿入
        for (uint i = 0; i < pdfDoc.PageCount; i++)
        {
            PdfPage page = pdfDoc.GetPage(i);

            var stream = new InMemoryRandomAccessStream();
            await page.RenderToStreamAsync(stream);

            var image = new BitmapImage();
            await image.SetSourceAsync(stream);
            var img = new Image();
            img.Source = image;

            this.listView.Items.Add(img);
        }
    }
}

解析したPDFファイルのページ数分ループさせます。

pdfDoc.GetPage(i)でPdfPageオブジェクトを取得し、
それをInMemoryRandomAccessStreamオブジェクトに書き込みます。

UWPではPDFをそのまま表示できないため、BitmapImageに変換して出力します。
書き込んだStreamをawait image.SetSourceAsync(stream)でBitmapImageに変換し、
ImageタグのSourceにBitmapImageを登録して完了です。

さいごに

この実装にはかなり手こずりました。。。
何より参考文献が全くと言っていいほどありません。
この記事が誰かの役に立てば幸いです!

ではでは。

11
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
8