एक .NET सेवा से प्रिंटिंग

मैं अभी एक परियोजना पर काम कर रहा हूं जिसमें किसी अन्य एप्लिकेशन से संदेश प्राप्त करना, उस संदेश की सामग्री को स्वरूपित करना और उसे प्रिंटर पर भेजना शामिल है। पसंद की तकनीक सी # विंडोज सेवा है। आउटपुट को एक रिपोर्ट कहा जा सकता है, मुझे लगता है, लेकिन एक रिपोर्टिंग इंजन आवश्यक नहीं है। एक सरल टेम्पलेटिंग इंजन, जैसे स्ट्रिंग टेम्पलेट, या यहां तक ​​कि एक्सएसएलटी आउटपुट एचटीएमएल भी ठीक होगा। मेरी समस्या यह है कि इस तरह के आउटपुट को सेवा से प्रिंट करने का एक स्वतंत्र तरीका मिल रहा है। चूंकि यह लगता है यह काम करेगा, मैं माइक्रोसॉफ्ट के आरडीएलसी का उपयोग कर एक प्रोटोटाइप पर काम कर रहा हूं, स्थानीय रिपोर्ट को पॉप्युलेट कर रहा हूं और फिर इसे एक मेमोरी स्ट्रीम में एक छवि के रूप में प्रस्तुत कर रहा हूं, जिसे मैं प्रिंट करूंगा। इसके साथ मुद्दे हैं:

  • मल्टी-पेज प्रिंटिंग एक बड़ा सिरदर्द होगा।
  • अभी भी स्मृति सेवा मुद्रित करने के लिए प्रिंट डॉक्यूमेंट का उपयोग करना है, जो कि विंडोज सेवा में असमर्थित है (हालांकि यह काम कर सकता है - अभी तक प्रोटोटाइप के साथ अब तक नहीं मिला है)
  • यदि डेटा परिवर्तनों में आ रहा है, तो मुझे डेटासेट और उस श्रेणी को बदलना होगा जिसमें डेटा को deserialized किया जा रहा है। बुरा बुरा बुरा।

क्या किसी को इस तरह से कुछ भी दूरस्थ रूप से करना पड़ा है? कोई सलाह? मैंने पहले से ही उपयोगकर्ता इनपुट के बिना एचटीएमएल प्रिंट करने के बारे में एक सवाल उठाया है, और उस पर लगभग 3 दिन बर्बाद करने के बाद, मैं इस निष्कर्ष पर आया हूं कि कम से कम किसी भी उपलब्ध उपकरण के साथ नहीं किया जा सकता है।

सभी मदद की सराहना की है।

संपादित करें: हम .NET ढांचे के संस्करण 2.0 पर हैं।

0
ro fr bn

10 उत्तर

I think we are going to go the third party route. I like the XSL -> HTML -> PDF -> Printer flow... Winnovative's HTML to PDF looks good for the first part, but I'm running into a block finding a good PDF printing solution... any suggestions? Ideally the license would be on a developer basis, not on a deployed runtime basis.

0
जोड़ा

मेरा विश्वास करो, आप तीसरे पक्ष के घटक को खरीदने की तुलना में इसके लिए समाधान खोजने/विकसित करने के लिए अधिक पैसे खर्च करेंगे। पहिया को पुन: पेश न करें और भुगतान समाधान के लिए जाएं।

प्रिंटिंग एक जटिल समस्या है और मुझे उस दिन को देखना अच्छा लगेगा जब इसके लिए बेहतर ढांचा समर्थन जोड़ा जाता है।

0
जोड़ा

विंडोज सेवा से प्रिंटिंग वास्तव में दर्दनाक है। ऐसा लगता है ... कभी-कभी ... लेकिन आखिर में यह किसी भी स्पष्ट कारण के बिना, समय-समय पर अपवाद को फेंकता या फेंकता है। यह वास्तव में निराशाजनक है। आधिकारिक तौर पर, यह भी समर्थित नहीं है , बिना किसी स्पष्टीकरण के, न ही वैकल्पिक समाधान के लिए कोई प्रस्ताव।

हाल ही में, मुझे समस्या का सामना करना पड़ा है और कई असफल परीक्षणों और प्रयोगों के बाद, मैं अंततः दो व्यवहार्य समाधानों के साथ आया:

  • Win32 API (उदाहरण के लिए सी/सी ++ में) का उपयोग करके अपना स्वयं का प्रिंटिंग डीएलएल लिखें, फिर इसे पी/Invoke (ठीक काम करता है) के साथ अपनी सेवा से उपयोग करें
  • अपना प्रिंटिंग COM + घटक लिखें, फिर इसे अपनी सेवा से उपयोग करें। मैंने हाल ही में सफलता के साथ इस समाधान को चुना है (लेकिन यह तीसरा पक्ष COM + घटक था, जो स्वयं लिखा नहीं था) यह बिल्कुल ठीक काम करता है।
0
जोड़ा
जीडीआई + सेवा संदर्भ में काम करने के लिए कभी भी डिजाइन/परीक्षण नहीं किया गया था। Thats क्यों यह काम नहीं करता है। आपको जीडीआई का उपयोग करना चाहिए और यह आकर्षित करने के लिए काम करता है। समकक्ष Win32 कॉल खोजने के लिए इस दस्तावेज़ का संदर्भ लें: msdn.microsoft.com/ en-us/पुस्तकालय/& hellip;
जोड़ा लेखक Signcodeindie, स्रोत

यदि आप स्क्रिप्ट पोस्ट करने के लिए आउटपुट कर सकते हैं तो कुछ प्रिंटर कुछ भी प्रिंट करेंगे जो उन पर एक निश्चित निर्देशिका में एफ़टीपी हो जाता है।

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

0
जोड़ा

हम बिना किसी समस्या के सेवा से प्रिंट करने के लिए DevExpress 'XtraReports का उपयोग कर रहे हैं। उनका रिपोर्ट मॉडल विंडोज फॉर्म के समान है, इसलिए आप गतिशील रूप से टेक्स्ट तत्वों को सम्मिलित कर सकते हैं और फिर प्रिंट कमांड जारी कर सकते हैं।

0
जोड़ा

एक सेवा से प्रिंटिंग एक बुरा विचार है। नेटवर्क प्रिंटर "प्रति उपयोगकर्ता" जुड़े हुए हैं। आप सेवा को किसी विशेष उपयोगकर्ता के रूप में चलाने के लिए चिह्नित कर सकते हैं, लेकिन मैं उस पर एक खराब सुरक्षा अभ्यास मानता हूं। आप स्थानीय प्रिंटर से कनेक्ट करने में सक्षम हो सकते हैं, लेकिन मैं इस मार्ग पर जाने से पहले भी संकोच करूंगा।

सबसे अच्छा विकल्प यह है कि सेवा डेटा संग्रहित करे और उपयोगकर्ता के लॉन्च किए गए एप्लिकेशन को डेटा के लिए सेवा पूछकर प्रिंटिंग करें। या एक सामान्य स्थान जिसे डेटा संग्रहीत किया जाता है, डेटाबेस की तरह।

यदि आपको नियमित अंतराल के रूप में मुद्रित डेटा होना आवश्यक है, तो कार्य शेड्यूलर के माध्यम से कार्य ईवेंट सेट करें। किसी सेवा से प्रक्रिया को लॉन्च करने के लिए उपयोगकर्ता नाम और पासवर्ड जानने की आवश्यकता होगी, जो कि फिर से खराब सुरक्षा अभ्यास है।

प्रिंटिंग के लिए, रिपोर्ट उत्पन्न करने के लिए किसी तृतीय-पक्ष टूल का उपयोग करना सबसे आसान होगा।

0
जोड़ा

मेंने यह किया है। यह ए * एस में दर्द है। समस्या यह है कि मुद्रण के लिए जीडीआई इंजन की आवश्यकता होती है, जिसका सामान्यतः मतलब है कि आपके पास डेस्कटॉप होना है, जो केवल लॉग इन होने पर ही लोड होता है। अगर आप किसी सर्वर पर किसी सेवा से ऐसा करने का प्रयास कर रहे हैं, तो आप आमतौर पर लॉग इन नहीं हैं।

तो सबसे पहले आप सामान्य सेवा उपयोगकर्ता के रूप में नहीं चल सकते हैं, बल्कि वास्तविक उपयोगकर्ता के रूप में इंटरैक्टिव लॉगिन अधिकार हैं। फिर आपको सेवा रजिस्ट्री प्रविष्टियों को ट्विक करना होगा (मैं भूल जाता हूं कि इस समय, कोड को ढूंढना होगा जो मैं आज रात कर सकता हूं यदि आप वास्तव में रूचि रखते हैं)। अंत में, आपको प्रार्थना करनी है।

आपका सबसे बड़ा दीर्घकालिक सिरदर्द प्रिंट ड्राइवरों के साथ होगा। यदि आप लॉग इन उपयोगकर्ता के बिना सेवा के रूप में चल रहे हैं, तो कुछ प्रिंट ड्राइवर समय-समय पर संवाद पॉप अप करना पसंद करते हैं। क्या होता है जब आपका प्रिंटर टोनर से बाहर होता है? या कागज से बाहर? चालक एक संवाद पॉप अप कर सकता है जिसे कभी नहीं देखा जाएगा, और प्रिंटर कतार को पकड़ें क्योंकि कोई भी लॉग इन नहीं है!

0
जोड़ा

अपने पहले प्रश्न का उत्तर देने के लिए, यह डेटा के आधार पर काफी सीधे आगे हो सकता है। हमारे पास विभिन्न प्रकार के सेवा-आधारित अनुप्रयोग हैं जो आप जो भी पूछ रहे हैं वही करते हैं। आम तौर पर, हम आने वाली फ़ाइल को पार्स करते हैं और इसके चारों ओर अपनी पोस्टस्क्रिप्ट या पीसीएल लपेटते हैं। यदि आप लेआउट काफी सरल हैं, तो कुछ बहुत ही बुनियादी पीसीएल कोड हैं जिन्हें आप अपने इच्छित फ़ॉन्ट/प्रिंट लेप प्रदान करने के लिए लपेट सकते हैं (मैं आपको ऑफ़लाइन यहां कुछ मार्गदर्शन देने के लिए और अधिक खुश हूं)।

आपके पास एक प्रिंट तैयार फ़ाइल है जिसे आप इसे एक यूएनसी प्रिंटर पर भेज सकते हैं जो साझा किया जाता है, सीधे स्थानीय रूप से स्थापित प्रिंटर पर या यहां तक ​​कि डिवाइस के आईपी (रॉ या एलपीआर प्रकार डेटा) तक भी।

यदि, हालांकि, आप पीडीएफ पथ नीचे जा रहे हैं, तो सबसे आसान तरीका है कि पीडीएफ आउटपुट को प्रिंटर पर भेजना जो सीधे पीडीएफ प्रिंटिंग का समर्थन करता है (कई अब करते हैं)। इस मामले में आप बस डिवाइस पर पीडीएफ भेजते हैं और इसे प्रिंट करते हैं।

दूसरा विकल्प घोस्टस्क्रिप्ट लॉन्च करना है जो आपकी आवश्यकताओं के लिए स्वतंत्र होना चाहिए (लाइसेंसिंग की जांच करें क्योंकि उनके पास कुछ अलग संस्करण हैं, कुछ जीएनयू, कुछ जीपीएल इत्यादि) और या तो इसे प्रिंट फ़ंक्शन में बनाया गया है या बस पोस्टस्क्रिप्ट में कनवर्ट करें और डिवाइस पर भेजें। मैंने सर्विस ऐप में कई बार घोस्टस्क्रिप्ट का उपयोग किया है, लेकिन एक बड़ा प्रशंसक नहीं है क्योंकि आप मूल रूप से रूपांतरण करने के लिए कमांड लाइन ऐप खोल रहे हैं और निष्पादित कर रहे हैं। ऐसा कहा जा रहा है, यह एक स्थिर ऐप है जो शानदार तरीके से असफल रहता है

0
जोड़ा

This may not be what you're looking for, but if I needed to do this quick&dirty, I would:

  1. एक अलग wpf एप्लिकेशन बनाएं (इसलिए मैं अंतर्निहित दस्तावेज़ हैंडलिंग का उपयोग कर सकता हूं)
  2. सेवा को डेस्कटॉप से ​​बातचीत करने की क्षमता दें (ध्यान दें कि आपको वास्तव में डेस्कटॉप पर कुछ भी दिखाना नहीं है, या इसके लिए लॉग इन करने के लिए लॉग इन होना चाहिए)
  3. सेवा को एप्लिकेशन चलाएं, और इसे प्रिंट करने के लिए डेटा दें।

आप संभवतः सेवा से चलने वाले वेब ब्राउजर से प्रिंट करने के लिए इसे भी जिगर कर सकते हैं (हालांकि मैं एक पूर्ण ब्राउज़र का उपयोग करने के बजाए अपना खुद का खोल आईई बनाने की सिफारिश करता हूं)।

अधिक विस्तृत (मुफ़्त) समाधान के लिए, आपकी सबसे अच्छी शर्त शायद दस्तावेज़ को मैन्युअल रूप से प्रारूपित करने के लिए है (जीडीआई + का उपयोग करके आपके लिए लेआउट करने के लिए)। यह थकाऊ, त्रुटि प्रवण, समय लेने वाला है, और विकास के दौरान बहुत सारे कागज़ को बर्बाद कर देता है, लेकिन आपको प्रिंटर पर क्या चल रहा है पर सबसे अधिक नियंत्रण देता है।

0
जोड़ा

Yann Trevin की प्रतिक्रिया के अनुसार, सिस्टम का उपयोग कर प्रिंटिंग। ड्रॉइंग.प्रिंटिंग एमएस द्वारा समर्थित नहीं है। हालांकि, आप नए, WPF- आधारित, System.Printing (I think ) का उपयोग करने में सक्षम हो सकते हैं

0
जोड़ा