c# प्रिंट संवाद के बिना विंडोज़ सेवा से एचटीएमएल दस्तावेज़ प्रिंट करें




windows-services printing (4)

सबसे पहले, यह कोड है:

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();
    }
  }
}
  1. आप 'माइक्रोसॉफ्ट इंटरनेट कंट्रोल्स' के संदर्भ को जोड़कर SHDocVw नामस्थान का उपयोग कर सकते हैं, संदर्भ संदर्भ जोड़ें के COM टैब पर मिले।
  2. इंटरनेट एक्सप्लोरर ऑब्जेक्ट पर अधिक जानकारी MSDN पर मिल सकती है
  3. नेविगेट () विधि HTML फ़ाइल लोड करेगा। अन्य पैरामीटर आपको वैकल्पिक पैरामीटर निर्दिष्ट करने की अनुमति देता है, जैसे झंडे और हेडर
  4. दस्तावेज़ लोड होने तक हम प्रिंट नहीं कर सकते। यहां, मैं जब तक DocumentComplete घटना को बुलाया जाता है, तब तक प्रतीक्षा करने के लिए एक लूप दर्ज किया जाता है, जिस पर एक ध्वज हमें सूचित करता है कि नेविगेशन पूरा हो गया है। ध्यान दें कि जब भी नेविगेशन समाप्त हो जाता है - सफलता या असफलता पर DocumentCpleplete कहा जाता है।
  5. एक बार दस्तावेज़ लोड किए गए ध्वज सेट हो जाने पर, मुद्रण स्थिति सक्षम होने पर क्वेरी स्टेटस (WB) के माध्यम से पूछताछ की जाती है।
  6. मुद्रण ExecWB () कॉल के साथ शुरू किया गया है OLECMDID_PRINT कमांड, उपयोगकर्ता इंटरैक्शन के बिना स्वचालित रूप से प्रिंट करने के लिए OLECMDEXECOPT_DONTPROMPTUSER विकल्प के साथ निर्दिष्ट है। एक महत्वपूर्ण नोट यह है कि यह डिफ़ॉल्ट प्रिंटर पर प्रिंट होगा। एक प्रिंटर निर्दिष्ट करने के लिए, आपको डिफ़ॉल्ट प्रिंटर सेट करना होगा (कोड में, आप SetDefaultPrinter () पर कॉल कर सकते हैं)। दो अंतिम पैरामीटर वैकल्पिक इनपुट और आउटपुट पैरामीटर की अनुमति देते हैं
  7. हम मुद्रण समाप्त होने तक छोड़ना नहीं चाहते हैं, इसलिए एक बार फिर एक लूप दर्ज किया गया है। PrintTemplateTeardown घटना को निकाल दिया गया है, के बाद दस्तावेज़ मुद्रित ध्वज सेट है। वस्तुओं को तब साफ किया जा सकता है

मैं एक खिड़की सेवा का उपयोग कर रहा हूँ और जब मैं सेवा प्रारंभ करूँगा तो मैं .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();
}

प्रिंट डायलॉग बॉक्स को प्रदर्शित किए बिना प्रिंट करने का कोई अन्य तरीका क्या है?

अद्यतन: इस के जवाब में:

लेकिन मैंने पहले से ही इस वर्ग का उपयोग किया है लेकिन जब मैं कॉल कर रहा हूं

axW.ExecWB(SHDocVw.OLECMDID.OLECMDID_PRINT,SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_PROMPTUSER , ref em, ref em);

मेरा प्रोग्राम यहां ब्लॉक हो रहा है जब मैं विंडो सेवा से उपयोग कर रहा हूं लेकिन यह विंडोज़ एप्लिकेशन से ठीक काम कर रहा है


एक प्रिंट संवाद के बिना प्रिंट करने का एक और तरीका है आप एक PrintDialog वस्तु बनाते हैं, इसे इनिशियलाइज़ करें और फिर प्रिंट () विधि को कॉल करें।

नीचे दिए गए फ़ंक्शन का इस्तेमाल छोटा 2 "x0.75" बारकोड लेबल मुद्रित करने के लिए किया जाता है। आपको HTML फ़ाइल से एक Document ऑब्जेक्ट प्राप्त करने का एक तरीका निकालने की आवश्यकता होगी।

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");
    }
}

आप PrintDocument क्लास को System.Drawing.Printing नामस्थान में उपयोग कर सकते हैं ताकि आपको प्रिंटिंग पर अधिक नियंत्रण मिल सके, अधिक जानकारी के लिए यहां देखें।

उदाहरण के लिए आप निम्न कर सकते हैं:

using (PrintDocument doc = new PrintDocument())
{
    doc.PrintPage += this.Doc_PrintPage;
    doc.DefaultPageSettings.Landscape = true;
    doc.DocumentName = fileNameOfYourDocument;
    doc.Print();
}

फिर प्रत्येक पृष्ठ को मुद्रित करने के लिए एक फ़ंक्शन उठाया जाता है और आपको एक ग्राफ़िक्स क्षेत्र दिया जाता है जिससे वह आकर्षित हो

private void Doc_PrintPage(object sender, PrintPageEventArgs ev)
{
    ....
    ev.Graphics.DrawImage(image, x, y, newWidth, newHeight);
}

इसके लिए आपको पाठ / छवि पर वास्तविक ड्राइंग को पृष्ठ पर संभालना आवश्यक है, अधिक जानकारी के लिए यहां देखें।


OLECMDEXECOPT_PROMPTUSER उपयोगकर्ता को प्रिंटर और सभी संबद्ध सामान चुनने के लिए एक संकेत को बलपूर्वक OLECMDEXECOPT_PROMPTUSER है, जो मुझे पूरा यकीन है कि किसी सेवा से अनुमति नहीं है क्या कोई यह सत्यापित कर सकता है?





printing