我正在尝试使用 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() 的脚本块,如果我执行它而不是“窗口”,它似乎也可以工作。
不过这可靠吗?感觉就像一个黑客。