2012-11-27 102 views
5

मैं अपना खुद का ग्रिड बनाने की कोशिश कर रहा हूं (यह इस तरह दिखता है: http://tinyurl.com/cdyre6k - ईसीजी पेपर जो मीट्रिक इकाइयों में है मिलीमीटर)।रिपोर्टथैब का उपयोग करके पाइथन/पीडीएफ निर्माण - पैटर्न के साथ स्वयं निर्मित ग्रिड प्रिंट्स लेकिन स्क्रीन पर ठीक दिखता है

मैं इन रिपोर्टों को बनाने के लिए ReportLab/Python (opensource) का उपयोग कर रहा हूं। नीचे मेरे कोड का एक स्निपेट है।

स्क्रीन पर, यह महान लग रहा है !:

>What I see on the screen<

हालांकि, जब मैं इस भेजने के एक प्रिंटर से (और हाँ, मैं भी प्रिंटर सेटिंग्स के साथ tinkered है) यह कुछ लाइनों प्रिंट, और दूसरों को नहीं (कभी-कभी यह एक विधिवत है और एक पैटर्न-एस्क्यू प्लेड प्रिंट करता है, दूसरी बार यह मोटा/पतली रेखा होती है; ध्यान रखें, प्रिंटर पर आउटपुट स्ट्रोकविड्थ्स सेट के आधार पर सुसंगत है)।

>What I see at the printer!<

मैं strokewidth संयोजन के सभी प्रकार की कोशिश की है, और संयोजन की स्थापना प्रिंटर के सभी प्रकार के ... मैं इसे सही ढंग से मुद्रित करने के लिए नहीं मिल सकता है! मैंने एक वैकल्पिक प्रिंटर की कोशिश की है और बहुत अच्छे परिणाम प्राप्त किए हैं, लेकिन मुझे प्रिंटर सेटिंग्स को 1200 डीपीआई (सीएडी स्तर प्रिंटिंग) से अधिक सेट करना होगा। अन्य प्रिंटर 600 डीपीआई पर सेट है। उसी समान प्रिंटर (600 डीपीआई) पर मैं एक पूर्व सहकर्मी द्वारा किए गए दस्तावेज़ को मुद्रित करता हूं और यह प्रिंट ठीक है (कृपया ध्यान दें, वह ReportLab का उपयोग नहीं कर रहा था इसलिए मैं उसका कोड/समाधान का उपयोग नहीं कर सकता)।

क्या चल रहा है? क्या यह प्रिंटर पर एक एलियासिंग मुद्दा है? अगर मैं अपनी ग्रिड को बिटमैप्स (या कुछ अन्य प्रारूप) में घुमाता हूं तो क्या यह मेरी मदद करेगा? मैं इसे कैसे ठीक कर सकता हूं (मेरे केवल विकल्प पायथन और रिपोर्टलैब का उपयोग करना है)? ReportLab मैन्युअल ने मदद नहीं की, "Google" ने मदद नहीं की, और पिछले StackExchange प्रश्न इस विशिष्ट विषय को कवर नहीं करते थे। यदि मैं स्ट्रोकविड्थ को "1" पर सेट करता हूं, तो मैं सभी लाइनों को मुद्रित करने के लिए ग्रिड प्राप्त कर सकता हूं, लेकिन फिर मामूली ग्रिड लाइनें बहुत मोटी होती हैं।

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

किसी भी सलाह की सराहना की जाती है!

TIA,

-J

for i in decimal_range(0, _time, 1): 
     if (i % 5.0 == 0): 
      if (i % 25.0 == 0): 
       grid_pattern.add(shapes.Line(_temp_x, 
              (_temp_y + _height_of_box), 
              _temp_x, 
              (_temp_y + _height_of_box+4), 
              strokeWidth=1, 
              strokeColor=colors.black)) 
      else: 
       pass 

      grid_pattern.add(shapes.Line(_temp_x, _temp_y, _temp_x, 
             (_temp_y + _height_of_box), 
             strokeWidth=.12, 
             strokeColor=colors.pink)) 
     else: 
      grid_pattern.add(shapes.Line(_temp_x, _temp_y, _temp_x, 
             (_temp_y + _height_of_box), 
             strokeWidth=.12, 
             strokeColor=colors.pink)) 
     _temp_x += 1 * mm 

    _temp_x = xorigin 

    for i in range(0, _mv, 1): 
     if (i % 5.0 == 0): 
      grid_pattern.add(shapes.Line(_temp_x, _temp_y, 
             _temp_x + _width_of_box, 
             _temp_y, strokeWidth=.12, 
             strokeColor=colors.pink)) 
     else: 
      grid_pattern.add(shapes.Line(_temp_x, _temp_y, 
             _temp_x + _width_of_box, 
             _temp_y, strokeWidth=.12, 
             strokeColor=colors.pink))  
     _temp_y += 1 * mm 

Update1

मैं स्ट्रोक की चौड़ाई की स्थापना की कोशिश की है करने के लिए "0" के रूप में कई पोस्टर (और ReportLab समुदाय/मेलिंग सूची की सिफारिश) निम्नानुसार है:

grid_pattern.add(shapes.Line(_temp_x, _temp_y, _temp_x, 
          (_temp_y + _height_of_box), 
          strokeWidth=0, 
          strokeColor=colors.pink)) 

यह एक सिंगल पिक्सेल-चौड़ा लाइन बनाता है, जो फिर से, पीसी पर बहुत अच्छा लग रहा है, लेकिन अभी भी पीडीएफ में एक भयानक पैटर्न के साथ प्रिंट करता है।

UPDATE2 + समाधान

नखरे और ReportLab और अपने कंप्यूटर के साथ बहस की बहुत सारी करने के बाद यह पता चला है कि यह मेरे पीसी या ReportLab नहीं था।यह प्रिंटर था (मैं दो पूरी तरह से अलग प्रिंटर कैनन और एचपी - मॉडल के बावजूद था) - मुझे लगा कि मेरे पास प्रिंटर को रद्द करने के लिए पर्याप्त कवरेज था, लेकिन इस समस्या के लिए और भी कुछ है! पढ़ना जारी रखें ...

रिपोर्टलैब वास्तव में रेखा को आकर्षित नहीं करता है, यह सिर्फ एक पोस्टस्क्रिप्ट लाइन जोड़ता है जो रेखा को आकर्षित करने के लिए प्रस्तुत करता है।

मेरे प्रारंभिक डिबगिंग का हिस्सा उन रंगों को बदलने में शामिल था जो मैं देख रहा था कि यह एक मुद्दा था - ठीक है - मैंने रंगों को गुलाबी से लाल रंग में बदल दिया है (कोई बदलाव नहीं, मुझे पता है, लेकिन फिर से, मैं माना मैंने इसे एक मुद्दे के रूप में रंगों को रद्द करने के लिए पर्याप्त रूप से बदल दिया)।

अच्छी तरह से मैंने जो हाल ही में किया है, और दर्द से सीखा है, यह है कि प्रिंटर एक सूत्र का उपयोग करके ग्रेस्केल में रंगों को परिवर्तित करते हैं और उस सूत्र में एंटीअलाइजिंग साइड इफेक्ट्स (जैसे मैं देख रहा था) उत्पन्न करने की प्रवृत्ति है।

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

तो अब हमारा काम इस पीडीएफ दस्तावेज का उपयोग करना है जिसे मैंने रंग में ढूंढने के लिए बनाया है जो प्रिंट (दोनों रंग और ग्रेस्केल) और स्क्रीन पर ठीक दिखता है।

यदि आप डर के लिए स्क्रिप्ट डाउनलोड नहीं करना चाहते हैं तो मैं बुरा हूं - कम से कम पीडीएफ देखें और अपने स्वयं के नमूने प्रिंट करें यह देखने के लिए कि क्या आप समस्या को फिर से बना सकते हैं (मैं 600 डीपीआई पर प्रिंट कर रहा था - मानक - कुछ भी कल्पना नहीं है ... याद रखें, अगर मैंने डीपीआई/गुणवत्ता सेटिंग्स को चालू किया, तो यह ठीक मुद्रित हुआ, लेकिन मानक सेटिंग्स मुझे दुःख दे रही थीं!)।

Script

या

PDF

उत्तर

5

अगर मैं समझ कैसे ReportLab सही ढंग से लाइनों को संभालती है, आप क्रमश: 1 और 0.12 उपयोगकर्ता अंतरिक्ष इकाइयों के साथ लाइनों बनाने के लिए इसका पूछ रहे हैं। पीडीएफ में, एक "यूजर स्पेस यूनिट" प्रभावी रूप से एक इंच का 1/72 है।

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

आपका प्रिंटर संभवतः एंटी-एलाइजिंग द्वारा आउटपुट अनुकूलित करने का प्रयास करेगा जो अंतिम परिणाम को और भी अनिश्चित बना देगा।

आपके प्रिंटर के पिक्सेल ग्रिड के साथ संरेखण प्रभाव शायद आप कुछ लाइनें क्यों देखते हैं और दूसरों को नहीं देखते हैं।

कुछ चीजों को खेलने/खेलने के लिए।

1) 0 लाइन चौड़ाई के साथ अपनी लाइनों को आउटपुट करें। यह पीडीएफ में एक विशेष मामला है और इसका मतलब है "बिल्कुल एक पिक्सेल चौड़ी लाइन की आउटपुट"। ध्यान रखें कि ऐसी लाइन आपकी स्क्रीन पर दिखाई देनी चाहिए (जो केवल 72 या 96 डीपीआई है) लेकिन हो सकता है कि यह आपके प्रिंटर पर न हो (जो अब एक डॉट प्रिंट करेगा जो 1/1200 इंच है)।लेकिन अगर आपका प्रिंटर नियमों का पालन करता है, तो उसे हमेशा उस बिंदु को प्रिंट करना चाहिए।

2) अपनी लाइनों को व्यापक बनाएं - संभवतः लगातार परिणाम प्राप्त करने का एकमात्र तरीका। यदि छोटी रेखाएं बहुत मोटी लगती हैं, तो ठोस के बजाय एक बिंदीदार रेखा मुद्रित करने पर विचार करें (एक डैश पैटर्न सेट करें)।

+0

सुझावों के लिए धन्यवाद, मैं अब उन्हें आजमा रहा हूं और मैं अपने निष्कर्षों के साथ रिपोर्ट करूंगा। –

+0

मैंने 0 की स्ट्रोक चौड़ाई की कोशिश की, लेकिन इससे पैटर्न खराब हो गया = /। मैंने एकाधिक प्रिंटर पर प्रिंटिंग करने की कोशिश की है - एक ही सटीक पैटर्न (इसलिए मुझे लगता है कि यह एडोब रीडर है जिससे समस्या + मेरा कोड)। फिर भी, अगर मैं प्रिंटिंग सेटिंग्स चालू करता हूं, तो मैं मुद्रित करने के लिए ग्रिड प्राप्त कर सकता हूं (बस पहले की तरह)। लाइनों को मोटा बनाना या तो काम नहीं कर रहा है ... कुछ लाइनें दूसरों की तुलना में थोड़ा गहरा/मोटा मुद्रित होती हैं (सुनिश्चित नहीं है कि यह क्यों है)। कोई अन्य सुझाव? –

+0

क्या आपके पास एक उदाहरण पीडीएफ साझा करने का कोई तरीका है जिसे आपने बनाया है ताकि हम इसे देख सकें? साथ ही, जब आप कहते हैं कि आपने "मोटा" मुद्रित किया है, तो क्या आप कह सकते हैं कि आपने लाइन चौड़ाई को कितना बढ़ाया है? –

1

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

+0

धन्यवाद डेमियन, 0 की एक पंक्ति चौड़ाई मुझे मदद करने के लिए प्रतीत नहीं होती है। बजे उदाहरण के रूप में, मैं इस विशेष रूप से उपयोग कर रहा हूँ: grid_pattern.add (shapes.Line (_temp_x, _temp_y, _temp_x, (_temp_y + _height_of_box), strokeWidth = 0, strokeColor = colors.pink)) –

+0

हुंह , जो बहुत अच्छी तरह से पेस्ट नहीं किया था। मैं अपनी मूल पोस्ट संपादित करूंगा। –

2

यह सुनिश्चित नहीं है कि आप जो कर रहे हैं, उसे कैसे लागू करें, लेकिन पारंपरिक पोस्टस्क्रिप्ट तरीका डिवाइस समन्वय को पूर्णांक में गोल करना है।

/roundpoint { % x y -> x' y' 
    transform %convert user-space coords to device-space coords 
    round 
    itransform %convert device-space back to user-space 
} def 

... 
x y roundpoint moveto 
x y roundpoint lineto 
... 

यदि आपकी सभी लाइनें डिवाइस पिक्सेल के संबंध में लगातार रखी जाती हैं, तो उन्हें लगातार भी खींचा जाना चाहिए।