2012-08-02 19 views
14

मैं एक आवेदन जहाँ मैं एक टिकट मुद्रित करने के लिए की जरूरत है। प्रत्येक टिकट अद्वितीय होना चाहिए। एप्लिकेशन विंडोज़ फॉर्म है और पूरी तरह से सी # में लिखा है। हमारे आवेदन के लिए हम सैमसंग एमएल -2525 लेजर मोनोक्रोमैटिक प्रिंटर का उपयोग कर रहे हैं।वहाँ अगर एक मुद्रण प्रक्रिया सफल रहा था की जाँच के लिए एक रास्ता है?

प्रवाह मूल रूप से निम्नलिखित है, ऑपरेटर एक उत्पाद/टिकट चुनता है (जो अद्वितीय है) और फिर इसे एक बटन है कि 2 बातें करता प्रेस: ​​

  1. एक डेटाबेस से कनेक्ट करता है और के रूप में इस्तेमाल उत्पाद अद्यतन करता है
  2. एक समय में टिकट (इस System.Drawing और GDI + का उपयोग किया जाता)

प्रिंट करता है किसी कारण से, हर एक बार, छवि मुद्रित करने की आवश्यकता है कि प्रिंटर को नहीं भेजी जाती। यह एक दुर्लभ मामला है, लेकिन ऐसा होता है।

मैंने Win32_Printer (http://msdn.microsoft.com/en-us/library/Aa394363) का उपयोग कर प्रिंटर से कनेक्ट करने का प्रयास किया लेकिन मुझे वर्तमान प्रिंटर की स्थिति (ऑनलाइन, ऑफलाइन, कम टोनर, पेपर जाम इत्यादि) नहीं मिल सकती है। मैं केवल जांच सकता हूं कि प्रिंटर मौजूद है या नहीं कि पेपर आकार सही ढंग से स्थापित है। मैं निम्नलिखित के समान कोड की कोशिश की, लेकिन यह काम नहीं किया

private string MonitorPrintJobWmi() 
    { 
     var jobMessage = String.Empty; 
     var scope = new ManagementScope(ManagementPath.DefaultPath); 
     scope.Connect(); 

     var selectQuery = new SelectQuery { QueryString = @"select * from Win32_PrintJob" }; 

     var objSearcher = new ManagementObjectSearcher(scope, selectQuery); 
     var objCollection = objSearcher.Get(); 

     foreach (var job in objCollection) 
     { 
      if (job != null) 
      { 
       jobMessage += String.Format("{0} \r\n", job["Name"].ToString()); 
       jobMessage += String.Format("{0} \r\n", job["JobId"].ToString()); 
       _jobId = Convert.ToInt32(job["JobId"]); 
       jobMessage += String.Format("{0} \r\n", job["JobStatus"].ToString()); 
       jobMessage += String.Format("{0} \r\n", job["Status"].ToString()); 
      } 
     } 
     return jobMessage; 
    } 

मैं प्रिंटर के लिए एक API पाने की कोशिश की, लेकिन मैं इसके बारे में एक पकड़ नहीं मिल सका। वैसे, प्रिंटर का सॉफ़्टवेयर विंडोज टूलबार में अलग-अलग त्रुटियों को इंगित करता है।

मेरा प्रश्न है, तो किसी को भी मुझे कैसे एक प्रिंटर से कनेक्ट और यदि मुद्रण सफल रहा था की जांच करने के लिए के रूप में सही दिशा में जन्म दे सकता है।

इसके अलावा, यह अगर किसी को कुछ अन्य विशिष्ट प्रिंटर, जिसमें मैं इस यानी पूरा कर सकते हैं, हार्डवेयर बदलने की पता उपयोगी होगा।

धन्यवाद,

+0

संबंधित देखें: http://stackoverflow.com/questions/1921487/confirm-sccessccess-print-programmatically-in-windows – Eugene

+0

मैंने किया, लेकिन कुछ प्रारंभिक नमूना कोड शुरू करने के लिए फायदेमंद होगा। – lopezbertoni

+2

@lopezbertoni एक छोटा गुगलिंग आपको दिखाएगा कि सी # ऐप्स में उन लिंक किए गए तरीकों का उपयोग कैसे करें ... जैसे http://www.codeproject.com/Articles/51085/Monitor-jobs-in-a-printer-queue-NET –

उत्तर

5

स्थानीय मशीन पर प्रिंट कतारों की एक सूची प्राप्त करने के लिए, PrintServer के GetPrintQueues विधि का प्रयास करें।

एक बार जब आपके पास प्रासंगिक प्रिंटर से जुड़े PrintQueue ऑब्जेक्ट का उदाहरण हो, तो आप प्रिंटर की स्थिति (IsOffline, IsPaperOut, आदि) तक पहुंचने के लिए इसका उपयोग कर सकते हैं। साथ ही, आप इसे दिए गए कतार (GetPrintJobInfoCollection) में नौकरियों की एक सूची प्राप्त करने के लिए उपयोग कर सकते हैं, जो आपको नौकरी-विशिष्ट स्थिति जानकारी (IsInError, IsCompleted, IsBlocked, आदि) प्राप्त करने की अनुमति देगा।

आशा है कि इससे मदद मिलती है!

+1

इनपुट के लिए धन्यवाद। मैंने आपके द्वारा उल्लिखित दृष्टिकोण का उपयोग करने का प्रयास किया लेकिन मैं सफल नहीं था। मुख्य समस्या यह है कि नौकरी कतार में जाती है और फिर उससे गायब हो जाती है, और प्रिंटर प्रिंट नौकरी को पूरा नहीं करता है। – lopezbertoni

+0

यदि आप प्रिंटर पर नौकरी भेजने से पहले कतार देखना शुरू करते हैं, तो मुझे आश्चर्य है कि जैसे ही आप कतार में दिखाई देते हैं, आप नौकरी पकड़ सकते हैं .... –

+0

यह उत्तर के रूप में क्यों नहीं चिह्नित किया गया है? इससे मुझे बहुत मदद मिली है। मैं विशिष्ट क्लाइंट 'PrintQueue.Submitter' से भेजे गए नौकरियों की संख्या को देखकर काम करने में सक्षम था, फिर प्रिंटिंग का प्रयास करने के बाद, मुझे नई अतिरिक्त नौकरियों की सूची मिली और यह सुनिश्चित करने के लिए कि वे पूरा हो गए थे । आप इस एपीआई के माध्यम से प्रत्येक एकल नौकरी या प्रिंटर की स्थिति भी प्राप्त कर सकते हैं। नौकरी आईडी और टिकट की जानकारी भी है। –

0

अपने PrintDocument (System.Drawing.Printing) मुद्रित करने के लिए कोशिश करने के बाद, printjobs की स्थिति की जांच करने के लिए प्रयास करें।

प्रथम चरण: अपने PrintDocument प्रमाणित करें।

दूसरा कदम: System.Drawing.Printing.PrinterSettings.InstalledPrinters.Cast<string>();

से अपने प्रिंटर का नाम प्राप्त करें और अपने printerDocument.PrinterSettings.PrinterName में कॉपी

तीसरा कदम: प्रिंट और निपटाने की कोशिश करें।

printerDocument.Print(); 
printerDocument.Dispose(); 

अंतिम चरण: एक टास्क में जांच चलाएं (यूआई धागा ब्लॉक नहीं है)।

private bool IsPrinterOk(string name,int checkTimeInMillisec) 
    { 
     System.Collections.IList value = null; 
     do 
     { 
      //checkTimeInMillisec should be between 2000 and 5000 
      System.Threading.Thread.Sleep(checkTimeInMillisec); 
      // or use Timer with Threading.Monitor instead of thread sleep 

      using (System.Management.ManagementObjectSearcher searcher = new System.Management.ManagementObjectSearcher("SELECT * FROM Win32_PrintJob WHERE Name like '%" + name + "%'")) 
      { 
       value = null; 

       if (searcher.Get().Count == 0) // Number of pending document. 
        return true; // return because we haven't got any pending document. 
       else 
       { 
        foreach (System.Management.ManagementObject printer in searcher.Get()) 
        { 
         value = printer.Properties.Cast<System.Management.PropertyData>().Where(p => p.Name.Equals("Status")).Select(p => p.Value).ToList(); 
         break; 
        } 
       } 
      } 
     } 
     while (value.Contains("Printing") || value.Contains("UNKNOWN") || value.Contains("OK")); 

     return value.Contains("Error") ? false : true;  
    } 

गुड लक:

Task.Run(()=>{ 
    if (!IsPrinterOk(printerDocument.PrinterSettings.PrinterName,checkTimeInMillisec)) 
    { 
     // failed printing, do something... 
    } 
    }); 

यहाँ कार्यान्वयन है।