我正在尝试使用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;
}
我尝试打印的页面使用挖空呈现。HTML 元素绑定到 Javascript Knockout 模型。当执行Javascript并更新HTML时,模型被初始化。
我只得到一个空白页。
我假设正在发生的事情是主帧的 FinishLoadFrameEvent 在执行 Javascript 之前被触发 --或-- 该事件在 Javascript 执行之后但在绑定的 HTML 元素更新之前触发。
我可以通过在打印调用之前添加以下代码来使打印工作:
browser.FinishLoadingFrameEvent += (sender, e) =>
{
if (e.IsMainFrame)
{
// executing javascript seems to update the DOM
browser.ExecuteJavaScriptAndReturnValue("window");
browser.Print();
}
};
调用 ExecuteJavaScriptAndReturnValue 似乎有效,但我不知道这是否可靠。有没有一种确定的方法可以让 DOM 基于底层 KO 模型进行更新?
页面本身包含一个调用 ko.applyBindings() 的脚本块,如果我执行它而不是"窗口",它似乎也可以工作。
不过这可靠吗?感觉像黑客。
似乎在加载页面后生成 DOM 模型。在这种情况下,DotNetBrowser 报告页面已加载,但挖空库尚未更新内容。
这种情况的选择很少。
选项 1:
执行 'ko。ApplyBindings()' 正如你提到的。方法执行后,网页内容应加载并准备好打印。
选项 2:
通知 .NET 端有关内容已使用 JS-.NET Bridge 加载的信息。在这种情况下,您需要将.NET对象注入Javascript。该对象应包含启动打印的方法。加载 DOM 后,Knockout 应该调用此方法。