为什么WebBrowser不立即打印? (有一个随机的延迟)

时间:2014-05-02 22:25:32

标签: c# winforms printing webbrowser-control

我正在处理需要按顺序打印图像的打印应用程序。该列表包含tif图像和xml格式的文档。我使用WebBrowser导航到xml,在DocumentComplete之后我调用WebBrowser.Print()开始打印。

问题是WebBrowser没有立即开始打印。当WebBrowser真正想要打印时,它看起来像是零星的。

以下是与我的代码类似的代码。

任何人都知道是什么触发了打印开始或远离它的工作?

public partial class Form1 : Form
{
    private WebBrowser _webBrowser1 = new WebBrowser();
    private List<string> _list = new List<string>();

    public Form1()
    {
        InitializeComponent();

        this._webBrowser1.Name = "webBrowser1";
        this._webBrowser1.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(this.webBrowser1_DocumentCompleted);

        this._list.Add("test1.tif");
        this._list.Add("http://bing.com");
        this._list.Add("test2.tif");
        this._list.Add("test3.tif");
    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.StartPrinting();
    }

    private void StartPrinting()
    {
        if (this._list.Count == 0)
            return;

        string imgPath = this._list[0];
        this._list.RemoveAt(0);

        if (imgPath.EndsWith(".tif") == true)
        {
            // Code to print tif
            System.Threading.Thread.Sleep(3000);

            // Print Next Image
            this.StartPrinting();
        }
        else
        {
            // ex. http://test.com/mytest.xml
            this._webBrowser1.Navigate(imgPath);
        }
    }

    private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        // THIS IS THE PROBLEM, it doesn't show the prompt until later in the loop
        this._webBrowser1.ShowPrintDialog();

        // Print Next Image
        this.StartPrinting();
    }
}

1 个答案:

答案 0 :(得分:0)

WebBrowser打印是异步的。当打印的假脱机部分完成时,底层WebBrowser ActiveX控件会触发PrintTemplateTeardown事件。我发布了example说明如何处理它,因此可以异步打印一系列网址。

或者,您可以强制打印(假脱机)与PRINT_WAITFORCOMPLETION标志同步完成:

const int OLECMDID_PRINT = 6;
const int OLECMDEXECOPT_DONTPROMPTUSER = 2;
const int PRINT_WAITFORCOMPLETION = 2;

dynamic webBrowserAx = webBrowser.ActiveXInstance;
webBrowserAx.ExecWB(
    OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, PRINT_WAITFORCOMPLETION);

请注意,这将阻止UI线程,直到假脱机结束。

有关WebBrowser/MSHTML打印的详情:https://stackoverflow.com/a/19172580/1768303