0

我正在尝试使用 DotNetBrowser 使用如下代码进行打印:

    public void PrintUrl(string url)
    {
        using (var browser = BrowserFactory.Create())
        {
            browser.PrintHandler = this;
            _waitEvent = new ManualResetEvent(false);

            browser.FinishLoadingFrameEvent += (sender, e) => 
            {
                if (e.IsMainFrame)
                {
                    browser.Print();
                }
            };

            browser.LoadURL(url);
            _waitEvent.WaitOne();
        }
    }

    public PrintStatus OnPrint(PrintJob printJob)
    {
        printJob.PrintJobEvent += (sender, args) => _waitEvent.Set();
        return PrintStatus.CONTINUE;
    }

我尝试打印的页面是使用 Knockout 呈现的。HTML 元素绑定到 Javascript Knockout 模型。执行 Javascript 并更新 HTML 时会初始化模型。

我只得到一个空白页。

我假设正在发生的是,在执行 Javascript 之前触发了主框架的 FinishLoadingFrameEvent - 或者 - 在执行 Javascript 之后但在更新绑定的 HTML 元素之前触发了该事件。

我可以通过在 print 调用之前添加以下代码来进行打印:

        browser.FinishLoadingFrameEvent += (sender, e) => 
        {
            if (e.IsMainFrame)
            {
                // executing javascript seems to update the DOM
                browser.ExecuteJavaScriptAndReturnValue("window"); 
                browser.Print();
            }
        };

调用 ExecuteJavaScriptAndReturnValue 似乎可行,但我不知道这是否可靠。是否有一种可靠的方法可以根据底层的 KO 模型来更新 DOM?

该页面本身包含一个调用 ko.applyBindings() 的脚本块,如果我执行它而不是“窗口”,它似乎也可以工作。

不过这可靠吗?感觉就像一个黑客。

4

1 回答 1

0

页面加载后似乎正在生成 DOM 模型。在这种情况下,DotNetBrowser 报告页面已加载,但内容尚未由 Knockout 库更新。

这种情况下的选择很少。

选项1:

如您所述,执行“ko.ApplyBindings()”。在方法执行之后,网页内容应该被加载并准备好打印。

选项 2:

使用JS-.NET Bridge通知 .NET 方有关内容的加载。在这种情况下,您需要将 .NET 对象注入 Javascript。该对象应包含启动打印的方法。DOM 加载完成后,Knockout 应该调用这个方法。

于 2017-06-21T10:07:50.130 回答