我正在尝试将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);
}
}
答案 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))
{ }
});
}
}
}