Exemple #1
0
        // 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();
        }
Exemple #2
0
        // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

        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
            });
        }