Couple of days ago a colleague started a question with “wouldn’t it be cool if..”. This kind of start will always mean that:
- It’s something off the books
- It eat up your spare time
- You can’t ignore it, cause it’s too cool
That’s exactly what happened. He asked me “wouldn’t it be cool if we could use the raspberry pi 2 to view our monitoring systems”. Yes that would be cool, but there is one problem. Those monitoring system rely on pdf’s with information and the WebView xaml control doesn’t support pdf.
I tried the IoTBrowser sample from github, but as expected, didn’t show the pdf. A quick look around didn’t get me any further so I posted a question on the repository for the iot samples. I didn’t expect an answer any time soon, but I was proven otherwise. A couple of hours later a got a reply with a hint to Windows.Data.Pdf. I started to play with this namespace and ended up with a working sample, this is the code:
private async void WebView_NavigationStarting(WebView sender, WebViewNavigationStartingEventArgs args) { if (args.Uri.AbsolutePath.EndsWith(".pdf")) { try { // 1. Download the pdf var getPdfHttpClient = new HttpClient(); var pdf = await getPdfHttpClient.GetByteArrayAsync(args.Uri.AbsoluteUri); // 2. Store it in a temp file StorageFolder folder = ApplicationData.Current.TemporaryFolder; StorageFile pdfFileOriginal = await folder.CreateFileAsync(Guid.NewGuid().ToString() + ".pdf"); using (IRandomAccessStream pdfFileStream = await pdfFileOriginal.OpenAsync(FileAccessMode.ReadWrite)) { await pdfFileStream.WriteAsync(pdf.AsBuffer()); await pdfFileStream.FlushAsync(); } // 3. Load pdf as PdfDocument var _pdfDoc = await PdfDocument.LoadFromFileAsync(pdfFileOriginal); // 4. Create png file StorageFile pngFileOriginal = await folder.CreateFileAsync(Guid.NewGuid().ToString() + ".png"); // 5. As a test, only show first page using (IRandomAccessStream pngFileStream = await pngFileOriginal.OpenAsync(FileAccessMode.ReadWrite)) { await _pdfDoc.GetPage(0).RenderToStreamAsync(pngFileStream); await pngFileStream.FlushAsync(); } // 6. Set image as source for xaml image pdfImage.Source = new BitmapImage(new Uri(pngFileOriginal.Path, UriKind.Absolute)); } catch (Exception ex) { } } }