// https://github.com/LanderVe/WPF_PDFDocument/blob/master/WPF_PDFDocument/WPF_PDFDocument.csproj // https://blogs.u2u.be/lander/post/2018/01/23/Creating-a-PDF-Viewer-in-WPF-using-Windows-10-APIs // https://docs.microsoft.com/en-us/uwp/api/windows.data.pdf.pdfdocument.getpage?view=winrt-20348 private async Task ImportImages(ProgressDialog progress, CancellationToken token) { logger.Start(); logger.StartClock(); progress.SetMaximum(4); progress.SetMessage($"Importing {address}..."); var pdfFile = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); // WebView2 needs to run in an STA thread await SingleThreaded.Invoke(() => { // WebView2 needs a message pump so host in its own invisible worker dialog using (var form = new WebViewWorkerDialog( new WebViewWorker(async(webview) => { webview.Source = new Uri(address); progress.Increment(); await Task.Yield(); return(true); }), new WebViewWorker(async(webview) => { progress.Increment(); await Task.Delay(2000); await webview.CoreWebView2.PrintToPdfAsync(pdfFile); progress.Increment(); return(true); }))) { form.ShowDialog(progress); } }); if (token.IsCancellationRequested) { return; } if (!File.Exists(pdfFile)) { logger.WriteLine($"PDF file not found, {pdfFile}"); return; } // convert PDF pages to images... logger.WriteLine("rendering images"); try { Page page = null; using (var one = new OneNote()) { page = target == ImportWebTarget.Append ? one.GetPage() : await CreatePage(one, target == ImportWebTarget.ChildPage?one.GetPage() : null, address); } var ns = page.Namespace; var container = page.EnsureContentContainer(); var file = await StorageFile.GetFileFromPathAsync(pdfFile); var doc = await Windows.Data.Pdf.PdfDocument.LoadFromFileAsync(file); await file.DeleteAsync(); progress.SetMaximum((int)doc.PageCount); for (int i = 0; i < doc.PageCount; i++) { progress.SetMessage($"Rasterizing image {i} of {doc.PageCount}"); progress.Increment(); //logger.WriteLine($"rasterizing page {i}"); var pdfpage = doc.GetPage((uint)i); using (var stream = new InMemoryRandomAccessStream()) { await pdfpage.RenderToStreamAsync(stream); using (var image = new Bitmap(stream.AsStream())) { var data = Convert.ToBase64String( (byte[])new ImageConverter().ConvertTo(image, typeof(byte[])) ); container.Add(new XElement(ns + "OE", new XElement(ns + "Image", new XAttribute("format", "png"), new XElement(ns + "Size", new XAttribute("width", $"{image.Width}.0"), new XAttribute("height", $"{image.Height}.0")), new XElement(ns + "Data", data) )), new Paragraph(ns, " ") ); } } } progress.SetMessage($"Updating page"); using (var one = new OneNote()) { await one.Update(page); } } catch (Exception exc) { logger.WriteLine(exc.Message, exc); } logger.WriteTime("import complete"); logger.End(); }
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = private async Task <WebPageInfo> DownloadWebContent(Uri uri) { // This JavaScript copies the HTML of the entire web page to the clipboard // and returns the text of the page <title> const string javascript = @"var range = document.createRange(); range.selectNodeContents(document.body); var selection = window.getSelection(); selection.removeAllRanges(); selection.addRange(range); document.execCommand('copy'); document.getElementsByTagName('title')[0].innerText;"; string content = null; string title = null; // WebView2 needs to run in an STA thread await SingleThreaded.Invoke(() => { // WebView2 needs a message pump so host in its own invisible worker dialog using (var form = new WebViewWorkerDialog( startup: new WebViewWorker(async(webview) => { //logger.WriteLine($"starting up webview with {uri}"); webview.Source = uri; await Task.Yield(); return(true); }), work: new WebViewWorker(async(webview) => { //logger.WriteLine("getting webview content"); await Task.Delay(200); title = await webview.ExecuteScriptAsync(javascript); //logger.WriteLine($"title=[{title}]"); await Task.Delay(100); if (Win.Clipboard.ContainsText(Win.TextDataFormat.Html)) { content = Win.Clipboard.GetText(Win.TextDataFormat.Html); var index = content.IndexOf( "<html", StringComparison.InvariantCultureIgnoreCase); if (index > 0) { content = content.Substring(index); } } else { content = null; } //logger.WriteLine($"content=[{content}]"); await Task.Yield(); return(true); }))) { form.ShowDialog(); } }); if (title != null && title.Length > 1 && title[0] == '"' && title[title.Length - 1] == '"') { title = title.Substring(1, title.Length - 2); } var bycount = content == null ? 0 : content.Length; logger.WriteLine($"retrieved {bycount} bytes from {title} ({uri.AbsoluteUri})"); return(new WebPageInfo { Content = content, Title = title }); }