批量打印HTML问题假脱机文件

时间:2012-12-18 16:45:29

标签: c# shdocvw

我正在尝试将HTML报告批量打印到我的默认打印机,这是用于自动保存的PDF Creator设置。我通过Internet Explorer加载HTML文件,然后从那里打印,没有用户提示。

我遇到的问题是,当我的程序循环打印HTML文件列表时,它发现某些文档没有假脱机而且没有打印。我确实在网上看到这可以通过使用while循环和Application.Dowork()来解决。当我偶尔实现这一点时,我的所有文档都会打印出来,这是一种改进,但这只是偶尔而且不是一个可靠的修复。

我的问题可能是每个线程在完成处理之前关闭了吗?

如果是这样,我怎么能让线程独立运行,这样它们在处理时就不会关闭?

以下是我用于将文档打印到默认打印机的代码:

foreach (var x in fileList)
                {

                    // Printing files through IE on default printer.
                    Console.WriteLine("{0}", x);
                    SHDocVw.InternetExplorer IE = new SHDocVw.InternetExplorer();
                    IE.DocumentComplete += new SHDocVw.DWebBrowserEvents2_DocumentCompleteEventHandler(IE_DocumentComplete);
                    IE.PrintTemplateTeardown += new SHDocVw.DWebBrowserEvents2_PrintTemplateTeardownEventHandler(IE_PrintTemplateTeardown);
                    IE.Visible = true;
                    IE.Navigate2(x);
                    while (IE.ReadyState != SHDocVw.tagREADYSTATE.READYSTATE_COMPLETE)
                    {
                        System.Windows.Forms.Application.DoEvents();
                    }

                }
            }
        }
    }

    static void IE_PrintTemplateTeardown(object pDisp)
    {
        if (pDisp is SHDocVw.InternetExplorer)
        {
            SHDocVw.InternetExplorer IE = (SHDocVw.InternetExplorer)pDisp;
            IE.Quit();
            System.Environment.Exit(0);
        }
    }

    static void IE_DocumentComplete(object pDisp, ref object URL)
    {
        if (pDisp is SHDocVw.InternetExplorer)
        {
            SHDocVw.InternetExplorer IE = (SHDocVw.InternetExplorer)pDisp;
             IE.ExecWB(SHDocVw.OLECMDID.OLECMDID_PRINT, SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER, 2);
        }
    }

1 个答案:

答案 0 :(得分:1)

您如何看待以下方法?我在使用System.Windows.Forms.WebBrowser修饰符修饰的表单的Form_Load方法内使用async控件来发出请求。在该方法中,我使用await将导航推迟到以下链接,直到打印文件列表包含当前浏览的文件。

namespace WindowsFormsApplication7
{
    public partial class Form1 : Form
    {
        List<string> fileList;
        List<string> printedFileList;
        public Form1()
        {
            InitializeComponent();

            fileList = new List<string>();
            printedFileList = new List<string>(); ;

            fileList.Add("http://www.google.de/");
            fileList.Add("http://www.yahoo.de/");

            webBrowser1.DocumentCompleted += webBrowser1_DocumentCompleted;
        }

        void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            if (!printedFileList.Contains(webBrowser1.Url.AbsoluteUri))
                webBrowser1.Print();
            printedFileList.Add(webBrowser1.Url.AbsoluteUri);
        }

        private async void Form1_Load(object sender, EventArgs e)
        {
            foreach (string link in fileList)
            {
                webBrowser1.Navigate(link);
                await Printed(link);
            }
        }

        private Task Printed(string link)
        {
            return Task.Factory.StartNew(() =>
            {
                while (!printedFileList.Contains(link))
                { }
            });
        }
    }
}