2008-08-11 16 views
19

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

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

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

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

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

उत्तर

13

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

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

1

यह आप के लिए क्या देख रहे हैं नहीं हो सकता है, लेकिन अगर मैं इस त्वरित & गंदा, मैं करूंगा क्या करने की जरूरत:

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

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

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

8

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

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

  • के लिए ++ Win32 एपीआई (सी/सी में उपयोग कर अपने खुद मुद्रण DLL लिखें उदाहरण), फिर पी/Invoke (ठीक काम करता है) के साथ अपनी सेवा से इसका उपयोग करें
  • अपना खुद का प्रिंटिंग COM + घटक लिखें, फिर इसे अपनी सेवा से उपयोग करें। मैंने हाल ही में सफलता के साथ इस समाधान को चुना है (लेकिन यह तीसरा पक्ष COM + घटक था, जो स्वयं लिखा नहीं था) यह बिल्कुल ठीक काम करता है।
+2

जीडीआई + सेवा संदर्भ में काम करने के लिए कभी भी डिजाइन/परीक्षण नहीं किया गया था। Thats क्यों यह काम नहीं करता है। आपको जीडीआई का उपयोग करना चाहिए और यह आकर्षित करने के लिए काम करता है। समकक्ष Win32 कॉल खोजने के लिए इस दस्तावेज़ का संदर्भ लें: http://msdn.microsoft.com/en-us/library/aa302340.aspx#win32map_printingfunctions – Signcodeindie

0

मुझे लगता है कि हम तीसरे पक्ष के मार्ग पर जा रहे हैं। मुझे एक्सएसएल -> एचटीएमएल -> पीडीएफ -> प्रिंटर प्रवाह पसंद है ... विनोवेटिव का HTML to PDF पहले भाग के लिए अच्छा लग रहा है, लेकिन मैं एक अच्छा पीडीएफ प्रिंटिंग समाधान ढूंढने वाले ब्लॉक में भाग रहा हूं ... कोई सुझाव? आदर्श रूप से लाइसेंस एक डेवलपर आधार पर होगा, तैनात रनटाइम आधार पर नहीं।

4

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

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

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

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

3

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

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

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

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

5

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

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

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

1

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

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

0

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

मैं अभी भी उत्पादन गुणवत्ता रिपोर्ट जो वेब सर्वर से उत्पादन किया जा सकता है के लिए एक अच्छा तरीका खोजने के लिए उत्सुक हूँ ...

0

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

1

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

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