【发布时间】:2019-07-26 16:25:21
【问题描述】:
当最终用户单击“打印”按钮时,我想将我的 HTML 文档直接打印到特定的网络打印机没有打印机对话窗口。我确实搜索并关注了这个,但这会打开一个对话框窗口以将文档另存为 pdf。
根据评论:
public static class PrinterClass
{
[DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool SetDefaultPrinter(string Printer);
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
//List<string> st = new List<string>();
//foreach (string strPrinter in PrinterSettings.InstalledPrinters)
//{
// if (strPrinter.Contains("My Printer"))
// {
// PrinterClass.SetDefaultPrinter(strPrinter);
// }
// st.Add(strPrinter);
//}
SetDefaultPrinter("Send To OneNote 2016");
}
WebBrowser webBrowser = new WebBrowser();
void Print(string str)
{
webBrowser.DocumentText = str;
webBrowser.DocumentCompleted += webBrowser_DocumentCompleted;
}
void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
IHTMLDocument2 d2;
d2 = (IHTMLDocument2)((WebBrowser)sender).Document.DomDocument;
d2.execCommand("Print", false, null);
}
private void btn_print_Click(object sender, EventArgs e)
{
Print("<html><body>..some html code..</body></html>");
}
public static bool SetDefaultPrinter(string defaultPrinter)
{
using (ManagementObjectSearcher objectSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_Printer"))
{
using (ManagementObjectCollection objectCollection = objectSearcher.Get())
{
foreach (ManagementObject mo in objectCollection)
{
if (string.Compare(mo["Name"].ToString(), defaultPrinter, true) == 0)
{
mo.InvokeMethod("SetDefaultPrinter", null, null);
return true;
}
}
}
}
return false;
}
}
【问题讨论】:
-
好吧,添加对
mshtml的引用,那么您就拥有了所有可用的标准 IE11/Edge 接口。IHtmlDocument2提供了execCommand("Print")方法。IHTMLDocument2 document = ((WebBrowser)sender)Document..DomDocument as IHTMLDocument2; document.execCommand("Print", false, null);。 (写在这里,应该是~正确的),加一个using mshtml; -
有两个 COM 引用。一个是
Microsoft Internet Controls,另一个是Microsoft Html Object Library。 IIRC,你只需要后者。有一个问题,GAC 经常有一个旧的库在存储中,它非常喜欢并且不想放手。如果是这种情况(例如,您将找不到IHtmlDocument7和IHtmlDocument8),则必须重新构建类型库。 -
现在,我怀疑问题到底是什么。如果你执行这个:
var wb = new WebBrowser(); wb.Navigate(""); wb.Document.Write("<html><body>..some html code..</body></html>"); wb.Refresh(); wb.Print();,会发生什么? -
好吧,在请您试用之前,我已经用我的打印机对其进行了测试。它直接打印到默认打印机(不要求选择一个,如果那是实际问题)。
-
@AnynameDonotcare 显示 pdf 打印机的保存对话框是因为该打印机的行为。因此,如果它不显示打印对话框,则表示它正在工作。您也可以尝试使用 OneNote 等虚拟打印机,它不要求保存文件,只在 OneNote 中打印文件,没有任何提示。
标签: c# windows winforms printing