2013-04-05 7 views
7

में विफल रहता है मेरे पास सी # .NET में लिखा गया एक विंडोज सेवा अनुप्रयोग है। इस एप्लिकेशन का उपयोग स्थानीय सॉफ्टवेयर प्रिंटर को दस्तावेज़ प्रिंट करके पीडीएफ उत्पन्न करने के लिए किया जाता है जो पीडीएफ उत्पन्न करता है। यह विंडोज एक्सपी और विंडोज 7 पर अच्छी तरह से काम करता है। दुर्भाग्य से मैंने पाया कि विंडोज 8 पर यह विफल हो जाता है। तब मुझे पता चला कि विंडोज 8 पर किसी भी (यहां तक ​​कि भौतिक) प्रिंटर को प्रिंट करना विफल रहता है जब मैं अपनी सेवा से प्रिंट करता हूं। मेरे कार्यक्रम में काम करने के लिए क्या गुम है? मैं इस तरह से मुद्रण कर रहा हूँ:विंडोज 8 पर विंडोज़ सेवा से प्रिंटिंग

FlowDocument document = MyDocument; 
var source = document as IDocumentPaginatorSource; 
var documentPaginator = source.DocumentPaginator; 

using (var printServer = new LocalPrintServer()) 
{ 
    PrintQueue queue = printServer.GetPrintQueue(printerName); 
    XpsDocumentWriter docWriter = PrintQueue.CreateXpsDocumentWriter(queue); 

    // Print ticket - Approach 1 
    // PrintTicket printTicket = queue.DefaultPrintTicket.Clone(); 

    // Print ticket - Approach 2 
    var printTicket = new PrintTicket 
    { 
     PageOrientation = PageOrientation.Landscape, 
     PageMediaSize = new PageMediaSize(PageMediaSizeName.ISOA4), // set size of media (paper) 
    }; 


    documentPaginator.PageSize = new Size(document.PageWidth, document.PageHeight); 
    docWriter.Write(documentPaginator, printTicket); 
} 

सेवा के बिना 'डेस्कटॉप के साथ बातचीत' 'सिस्टम खाते' पर सेट है (लेकिन मैं वह भी या स्थानीय उपयोगकर्ता के रूप में प्रवेश करने की कोशिश की)।

यह विंडोज 8 पर अपवाद में परिणाम का उपयोग करते समय 'प्रिंट टिकट - दृष्टिकोण 1':

System.Printing.PrintQueueException: PrintTicket provider failed to bind to printer. Win32 error: -2147467231 
at MS.Internal.Printing.Configuration.PTProvider..ctor(String deviceName, Int32 maxVersion, Int32 clientVersion) 
at MS.Internal.Printing.Configuration.PTProviderBase.Create(String deviceName, Int32 maxVersion, Int32 clientVersion) 
at System.Printing.PrintTicketManager..ctor(String deviceName, Int32 clientPrintSchemaVersion) 
at System.Printing.PrintQueue.get_DefaultPrintTicket() 

का उपयोग करते हुए 'प्रिंट टिकट - दृष्टिकोण 2':

Exception encountered: System.Printing.PrintQueueException: Fehler beim Binden des PrintTicket-Anbieters an den Drucker. Win32-Fehler: -2147467231 
bei MS.Internal.Printing.Configuration.PTProvider..ctor(String deviceName, Int32 maxVersion, Int32 clientVersion) 
bei MS.Internal.Printing.Configuration.PTProviderBase.Create(String deviceName, Int32 maxVersion, Int32 clientVersion) 
bei System.Printing.PrintTicketManager..ctor(String deviceName, Int32 clientPrintSchemaVersion) 
bei System.Printing.PrintQueue.get_UserPrintTicket() 
bei System.Printing.PrintQueue.get_CurrentJobSettings() 
bei System.Printing.PrintQueue.CreateSerializationManager(Boolean isBatchMode, Boolean mustSetJobIdentifier) 
bei System.Windows.Xps.XpsDocumentWriter.BeginWrite(Boolean batchMode, Boolean asyncMode, Boolean setPrintTicketHandler, PrintTicket printTicket, PrintTicketLevel printTicketLevel, Boolean printJobIdentifierSet) 
bei System.Windows.Xps.XpsDocumentWriter.Write(DocumentPaginator documentPaginator, PrintTicket printTicket) 

मुझे लगता है कि सेवा कहेंगे उन प्रिंटर को खोजने में सक्षम है क्योंकि जब मैंने गैर-मौजूदा प्रिंटर पर प्रिंट करने का प्रयास किया है और मुझे "अवैध प्रिंटर नाम" अपवाद मिला है।

यहाँ मैं कुछ संबंधित सवालों के खुद के लिए रखना होगा: Printing from a Windows Service, Printing from a Windows Service, http://social.msdn.microsoft.com/Forums/en-US/ieextensiondevelopment/thread/b74bd27d-1cc8-4fca-a6de-2cd1371cf3b7/,

कमतर संबंधित: Printing from a .NET Service,

संपादित करें:

मामले किसी में में रुचि रखता है कोशिश कर रहा है - यहां मेरा नमूना सेवा अनुप्रयोग है जो कॉन्फ़िगर फ़ाइल में चयनित प्रिंटर को सरल दस्तावेज़ मुद्रित करने का प्रयास करता है: http://bin.mypage.sk/FILES/PrintTestService.rar

संपादन 2:

दिलचस्प।

using (var printDocument = new PrintDocument()) 
{ 
    printDocument.PrinterSettings.PrinterName = printerName; 
    printDocument.Print(); 
} 

दुर्भाग्य से यह एक बड़े GDI + कोड System.Drawing.Graphics पुस्तकालय जो मेरे कोड है कि सिस्टम के रूप में पृष्ठवार दस्तावेज़ का उत्पादन साथ संगत नहीं है का उपयोग कर रहा है: मैं एक अलग मुद्रण कोड की कोशिश की तो कोई त्रुटि है। विंडोज़। मीडिया। विज़ुअल ऑब्जेक्ट्स। इसलिए मैं इसका उपयोग अपने दस्तावेज़ को मुद्रित करने के लिए नहीं कर सकता जबतक कि मैं अपने दस्तावेज़ के पेजिंग को स्क्रैच से बनाने के दो सप्ताह बिताना नहीं चाहता।

edit3:

इस मुद्दे के बारे में यहाँ चर्चा है: http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/96e7fc10-3f08-4808-b748-692e30377293 यह anyCPU 'मंच का उपयोग करने के लिए वहाँ एक' वैकल्पिक हल 'है। यह कामकाज वास्तव में काम करता है (मैंने कोशिश की) लेकिन यह मेरे मामले में प्रयोग योग्य नहीं है जब मेरी सेवा x86 होने की आवश्यकता है। मैंने वास्तविक समाधान खोजने के लिए हमारी कंपनी के माध्यम से एमएस समर्थन से संपर्क किया है।

+1

आपको डेस्कटॉप प्लस के साथ बातचीत करने के लिए सेवा को कॉन्फ़िगर करने का प्रयास करना चाहिए मशीन पर इंटरैक्टिव सेवाएं सक्षम करें। यहां देखें http://msdn.microsoft.com/en-us/library/windows/desktop/ms683502.aspx Windows 8 में नोट NoInteractiveServices रजिस्ट्री कुंजी का मान डिफ़ॉल्ट रूप से 1 है, आपको इसे 0 –

+0

पर सेट करना चाहिए @ SimonMourier: मैंने रजिस्ट्री ध्वज को 0 पर संशोधित किया है और फिर रीबूट किया है और मैंने सेवा पर 'डेस्कटॉप से ​​बातचीत करने की अनुमति दें' की जांच की है। परिणाम वही है। – MiroJanosik

उत्तर

2

समाधान: इस बग को ठीक करने के लिए माइक्रोसॉफ्ट की प्रतीक्षा करने के लिए। मैंने बग की रिपोर्ट की है (आरईजी: 113040910349062), उन्होंने इसकी पुष्टि की है, लेकिन फिक्स जल्द ही नहीं होगा (अगले महीनों में) और इसके लिए कोई तारीख निर्दिष्ट नहीं है।

वर्कअराउंड है कि हम का उपयोग करें: एक छोटे से आवेदन है कि मुद्रण संभालती बनाएँ 'anyCPU' आवेदन के रूप में यह संकलन और (जो मैं 'के रूप में anyCPU' संकलन नहीं कर सकते सेवा आवेदन से चलाने - मैं 'एक्स 86' क्योंकि जरूरत इसकी निर्भरताओं का)। इस कामकाज का परीक्षण और काम किया गया था। लेकिन यह गंदे + ओवरहेड + अतिरिक्त देखभाल का कारण बनता है।

संपादित करें: http://support.microsoft.com/kb/2872151/EN-US ("आप Windows 8 या Windows Server 2012 की एक 64-आधारित संस्करण में एक 32-बिट WPF आवेदन से प्रिंट कर सकते")

: माइक्रोसॉफ्ट एक हॉटफिक्स जो Windows 8 में इस समस्या को ठीक करना चाहिए प्रदान करता है

संपादित करें (2013-11-04): हमने हॉटफिक्स का परीक्षण किया है और यह विंडोज 8 या विंडोज 8.1 पर काम नहीं करता है। वर्तमान में हम फिर से माइक्रोसॉफ्ट के साथ संवाद करने के एक चरण में हैं।

संपादित करें (वर्ष की शुरुआत 2014): हमें माइक्रोसॉफ्ट से एक प्रतिक्रिया मिली है कि वे नहीं जानते कि इस बग को कैसे ठीक किया जाए और बग बंद हो। तो इस समय हमारे लिए केवल समाधान ही एक छोटा ऐप एक्सई है जिसे एएनसीपीयूयू के रूप में संकलित किया गया है जिसे हमारी x86 सेवा द्वारा बुलाया जाता है। यह दृष्टिकोण काम करता है, लेकिन मंदी का कारण बनता है और इसके कारण हमारे उत्पाद को बनाए रखना भी कठिन होता है।

+0

क्या आपने मेरे उत्तर में रजिस्ट्री परिवर्तन का परीक्षण किया है? यह हमारे लिए कई अलग-अलग मशीनों पर काम करता है। – NineBerry

+0

हाय, मैंने अभी तक इसका परीक्षण नहीं किया है। मैं इसे निम्नलिखित हफ्तों या महीनों में कोशिश करूंगा। दुर्भाग्यवश इस कार्य की प्राथमिकता अब कम है, और मैं अपनी परियोजना पर प्राइवेटिटी सेट नहीं कर सकता। – MiroJanosik

-1

मुझे विंडोज़ सेवा से एक ही अनुभव प्रिंटिंग था, लेकिन मेरी समस्या विंडोज सर्वर 2008 में थी, मुझे लगता है क्योंकि विंडोज़ सेवाओं का यह कार्यशीलता नहीं है। मैंने बहुत सारे ब्लॉग पढ़े और मुझे समाधान नहीं मिला। अंततः मुझे एक तरीका मिला जिसमें सेवा माइक्रोसॉफ्ट टास्क लाइब्रेरी का उपयोग करके प्रिंट करने के लिए एक और exe आमंत्रित करती है।

+0

ठीक है लेकिन सेवा से प्रिंटिंग इस तरह से विंडोज 7 से काम करता है और विंडोज एक्सपी में काम करता है। मैं कोई उपयोगकर्ता इंटरैक्शन नहीं चाहता (प्रिंटर या कुछ भी चुनना) तो यह क्यों काम नहीं करेगा। साथ ही जैसे मैंने अपने दूसरे संपादन में पोस्ट किया - मैं अभी भी विरासत जीडीआई + मार्ग का उपयोग करने पर कुछ प्रिंट कर सकता हूं (लेकिन पर्याप्त नहीं)। – MiroJanosik

+1

मैंने आपके सुझाव की कोशिश की है - मैंने एक निष्पादन योग्य बनाया है जो मुद्रण कार्य करता है। निष्पादन योग्य स्वयं अच्छी तरह से काम करता है और मुझे जो चाहिए वह प्रिंट करता है लेकिन जब मैं इसे सेवा से चलाता हूं तो अपवाद को उसी तरह से फेंक दिया जाता है जैसा कि यह सेवा में पहले हुआ था। मैं Process.Start() के साथ निष्पादन योग्य चला रहा हूँ। – MiroJanosik

+0

उस बिंदु पर, आप एक विंडो सेवा में एक प्रक्रिया को कॉल नहीं कर सकते हैं। मैं आपको माइक्रोसॉफ्ट टास्क लाइब्रेरी पर एक नज़र डालने की सलाह देता हूं और अपने कंसोल एप्लिकेशन को चलाने के लिए विंडोज़ कार्य सेट करता हूं। एमएसडीएन और कोडप्रोजेक्ट में बहुत सारे दस्तावेज हैं। – serdna

2

http://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/fdcfa0fa-50aa-4a61-be79-5b4c8f65fbf7/ हम देखते हैं कि इस माइक्रोसॉफ्ट को सूचना दी और Windows 8 में एक बग और Windows Server के रूप में पुष्टि की गई 2012

इस बग शुरू हो रहा है जब गैर मानक उपयोगकर्ता सत्र में एक 32bit प्रक्रिया (से प्रिंट करने का प्रयास जैसे एक सेवा)।

माइक्रोसॉफ्ट के अनुसार, यह एक बग विंडोज 8.1 और विंडोज सर्वर 2012 आर 2 में हल किया गया था। हालांकि, हम इसे अभी भी विंडोज 8.1 पर पुन: पेश कर सकते हैं।

उसी साइट पर, माइक्रोसॉफ्ट द्वारा एक वर्कअराउंड दिया जाता है। इस कामकाज ने विंडोज 8.1 पर हमारे लिए समस्या हल की। यह शायद भी Windows 8 और Windows Server 2012 पर काम करता है

वैकल्पिक हल इस प्रकार है:

  1. ओपन Regedit और HKEY_CLASSES_ROOT \ CLSID के लिए जाना {BA7C0D29-81CA-4901-B450-634E20BB8C34}

  2. "AppID" रजिस्ट्री प्रविष्टि का मान देखें। हमारे मामले में यह था {AA0B85DA-FDDF-4272-8D1D-FF9B966D75B0}

  3. अब HKEY_CLASSES_ROOT \ AppId {AA0B85DA-FDDF-4272-8D1D-FF9B966D75B0} पर जाएं (या संबंधित मान से आप अपने सिस्टम पर पाया)
  4. इस रजिस्ट्री कुंजी के अंतर्गत, नाम "AccessPermission", "LaunchPermission" और "RunAs" के साथ प्रविष्टियों को हटा

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

+0

हाय, मैंने कुछ बुनियादी परीक्षण किया और यह कामकाज काम करता है। मुझे विभिन्न मशीनों पर और परीक्षण करना है। – MiroJanosik

संबंधित मुद्दे