はじめに
こんにちは!
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を登録して完了です。
さいごに
この実装にはかなり手こずりました。。。
何より参考文献が全くと言っていいほどありません。
この記事が誰かの役に立てば幸いです!
ではでは。