C# 在没有打印对话框的情况下从 Windows 服务打印 html 文档
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/419412/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Print html document from Windows Service without print dialog
提问by
I am using a windows service and i want to print a .html page when the service will start. I am using this code and it's printing well. But a print dialog box come, how do i print without the print dialog box?
我正在使用 Windows 服务,我想在服务启动时打印 .html 页面。我正在使用此代码并且打印良好。但是打印对话框来了,没有打印对话框怎么打印?
public void printdoc(string document)
{
Process printjob = new Process();
printjob.StartInfo.FileName = document;
printjob.StartInfo.UseShellExecute = true;
printjob.StartInfo.Verb = "print";
printjob.StartInfo.CreateNoWindow = true;
printjob.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
printjob.Start();
}
Have there any other way to print this without showing the print dialog box.
有没有其他方法可以在不显示打印对话框的情况下打印它。
Update: in response to this:
更新:响应此:
But i have already used this class but when i am calling the
但是我已经使用过这个类但是当我调用
axW.ExecWB(SHDocVw.OLECMDID.OLECMDID_PRINT,SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_PROMPTUSER , ref em, ref em);
My program getting block here when i am using from window service but it is working fine from windows application.
当我从窗口服务使用时,我的程序在此处被阻止,但它在 Windows 应用程序中运行良好。
回答by Hyman B Nimble
From this site http://www.ussbd.com/printhtm.html
从这个网站http://www.ussbd.com/printhtm.html
using HtmlPrinter;
hpObj=new HtmlPrinter.HtmlPrinter();
hpObj.PrintUrlFromMemory(txtUrl.Text);
Now you add the code in your project to print html page from its source text:
现在您在项目中添加代码以从其源文本打印 html 页面:
HtmlPrinter.HtmlPrinter hpObj=new HtmlPrinter.HtmlPrinter();
hpObj.PrintHtml(txtString.Text, true);
If you want to print without the print dialog then use the following line:
如果您想在没有打印对话框的情况下打印,请使用以下行:
hpObj.PrintHtml(txtString.Text, false);
回答by Hyman B Nimble
OLECMDEXECOPT_PROMPTUSER
seems to force a prompt to the user to select printer and all associated stuff, which I am pretty sure is not allowed from a service. Can someone verify this?
OLECMDEXECOPT_PROMPTUSER
似乎强制提示用户选择打印机和所有相关的东西,我很确定服务不允许这样做。有人可以验证这一点吗?
回答by blak3r
Here's another way to print without a print dialog. You create a PrintDialog object, initialize it and then call the Print() method.
这是没有打印对话框的另一种打印方式。您创建一个 PrintDialog 对象,对其进行初始化,然后调用 Print() 方法。
The function below is used to print a small 2"x0.75" barcode label. You'll need to figure out a way to get an Document
object from the html file.
下面的函数用于打印一个小的 2"x0.75" 条码标签。您需要想办法Document
从 html 文件中获取对象。
public void PrintToPrinter(string printerName)
{
PrintDialog pd = new PrintDialog();
pd.Document = userControl11.PrintDoc; // <--- Update this line with your doc
pd.PrinterSettings.PrinterName = printerName;
try
{
pd.Document.DocumentName = "My Label";
pd.Document.DefaultPageSettings.PaperSize = new System.Drawing.Printing.PaperSize("2-.75", 200, 75);
pd.Document.DefaultPageSettings.Margins = new System.Drawing.Printing.Margins(0, 0, 0, 0);
//pd.PrinterSettings.Copies = (short)mNumCopies;
pd.Document.PrinterSettings.Copies = (short) mNumCopies;
pd.Document.Print();
}
catch
{
MessageBox.Show("INVALID PRINTER SPECIFIED");
}
}
回答by Matt Warren
You can use the PrintDocument class in the System.Drawing.Printing namespace to give you more control over the printing, see herefor more info.
您可以使用 System.Drawing.Printing 命名空间中的 PrintDocument 类来让您更好地控制打印,请参阅此处了解更多信息。
For example you can do the following:
例如,您可以执行以下操作:
using (PrintDocument doc = new PrintDocument())
{
doc.PrintPage += this.Doc_PrintPage;
doc.DefaultPageSettings.Landscape = true;
doc.DocumentName = fileNameOfYourDocument;
doc.Print();
}
Then a function is raised for each page to be printed and you are given a Graphics area to draw to
然后为要打印的每一页引发一个函数,并为您提供一个要绘制的图形区域
private void Doc_PrintPage(object sender, PrintPageEventArgs ev)
{
....
ev.Graphics.DrawImage(image, x, y, newWidth, newHeight);
}
This does require you handle the actual drawing on the text/image to the page, see herefor more info.
这确实需要您将文本/图像上的实际绘图处理到页面,有关更多信息,请参见此处。
回答by Tarsier
First off, here's the code:
首先,这是代码:
using System.Reflection;
using System.Threading;
using SHDocVw;
namespace HTMLPrinting
{
public class HTMLPrinter
{
private bool documentLoaded;
private bool documentPrinted;
private void ie_DocumentComplete(object pDisp, ref object URL)
{
documentLoaded = true;
}
private void ie_PrintTemplateTeardown(object pDisp)
{
documentPrinted = true;
}
public void Print(string htmlFilename)
{
documentLoaded = false;
documentPrinted = false;
InternetExplorer ie = new InternetExplorerClass();
ie.DocumentComplete += new DWebBrowserEvents2_DocumentCompleteEventHandler(ie_DocumentComplete);
ie.PrintTemplateTeardown += new DWebBrowserEvents2_PrintTemplateTeardownEventHandler(ie_PrintTemplateTeardown);
object missing = Missing.Value;
ie.Navigate(htmlFilename, ref missing, ref missing, ref missing, ref missing);
while (!documentLoaded && ie.QueryStatusWB(OLECMDID.OLECMDID_PRINT) != OLECMDF.OLECMDF_ENABLED)
Thread.Sleep(100);
ie.ExecWB(OLECMDID.OLECMDID_PRINT, OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER, ref missing, ref missing);
while (!documentPrinted)
Thread.Sleep(100);
ie.DocumentComplete -= ie_DocumentComplete;
ie.PrintTemplateTeardown -= ie_PrintTemplateTeardown;
ie.Quit();
}
}
}
- You can access the SHDocVw namespace by adding a reference to 'Microsoft Internet Controls', found on the COM tab of the Add Reference dialog.
- More information on the InternetExplorer object can be found on MSDN.
- The Navigate() method will load the HTML file. The other parameters allow you to specify optional parameters, such as flags and headers.
- We can't print until the document is loaded. Here, I enter a loop waiting until the DocumentComplete event is called, upon which a flag is set notifying us that navigation has completed. Note that DocumentComplete is called whenever navigation is finished - upon success orfailure.
- Once the documentLoaded flag is set, the printing status is queried via QueryStatusWB() until printing is enabled.
- Printing is started with the ExecWB() call. The
OLECMDID_PRINT
command is specified, along with the optionOLECMDEXECOPT_DONTPROMPTUSER
to automatically print without user interaction. An important note is that this will print to the default printer. To specify a printer, you will have to set the default printer (in code, you could call SetDefaultPrinter()). The two final parameters allow optional input and output parameters. - We don't want to quit until printing is complete, so once again a loop is entered. After the PrintTemplateTeardown event is fired, the documentPrinted flag is set. The objects can then be cleaned up.
- 您可以通过添加对“Microsoft Internet 控件”的引用来访问 SHDocVw 命名空间,该引用位于“添加引用”对话框的“COM”选项卡上。
- 可以在MSDN上找到有关 InternetExplorer 对象的更多信息。
- Navigate() 方法将加载 HTML 文件。其他参数允许您指定可选参数,例如标志和标头。
- 在加载文档之前我们无法打印。在这里,我进入一个循环,等待 DocumentComplete 事件被调用,在此事件上设置一个标志,通知我们导航已完成。请注意,只要导航完成(成功或失败),就会调用 DocumentComplete 。
- 一旦设置了 documentLoaded 标志,就会通过 QueryStatusWB() 查询打印状态,直到启用打印。
- 使用 ExecWB() 调用开始打印。的
OLECMDID_PRINT
命令中指定,还可以选择沿着OLECMDEXECOPT_DONTPROMPTUSER
到而无需用户交互自动打印。一个重要的注意事项是这将打印到默认打印机。要指定打印机,您必须设置默认打印机(在代码中,您可以调用SetDefaultPrinter())。最后两个参数允许可选的输入和输出参数。 - 我们不想在打印完成之前退出,因此再次进入一个循环。触发 PrintTemplateTeardown 事件后,设置 documentPrinted 标志。然后可以清理对象。