2010-07-28 28 views
5

मैं एक ऐप लिख रहा हूं जो उपयोगकर्ताओं को राफेल.जेएस के साथ छवियां उत्पन्न करने देता है। मैं चाहता हूं कि माध्यमिक सुविधाओं में से एक राफेल कैनवास का एक पीएनजी उत्पन्न करना है।प्रोग्रामेटिक रूप से राफेल.जेएस छवि से पीएनजी उत्पन्न करें

यहाँ मेरे सिर में सामान्य पाइपलाइन है:

  1. उपयोगकर्ता आदानों पैरामीटर
  2. हम जे एस उत्पन्न राफेल साथ
  3. कॉल हम एक जे एस आवरण है कि ऊपर करता है और युक्त div पर .innerHTML कॉल उत्पन्न , हमें एसवीजी (जिसे हम तो कहीं भेज)
  4. दे रही है हम जे एस आवरण
  5. एसवीजी ImageMagick के लिए भेजा और बाहर एक PNG पॉप है निष्पादित

चरण 4 वह चरण है जिस पर मुझे कुछ मार्गदर्शन की आवश्यकता है। उपयोगकर्ता आईई का उपयोग कर सकता है; हमें कोई गारंटी नहीं है कि जेएस को कभी भी एक एसवीजी ब्राउज़र में निष्पादित किया जाता है। किसी भी मामले में, हमें विश्वसनीय होने के लिए सर्वर-साइड चलाने के लिए इसकी आवश्यकता होगी। तो यहां तक ​​कि तीन संभावनाएं हैं जिनके साथ मैं अभी तक आया हूं:

  • फ़ायरफ़ॉक्स में फ़ायरफ़ॉक्स इंस्टॉल करें और फ़ायरफ़ॉक्स में (3) का परिणाम चलाएं। यह विकल्प बेकार है क्योंकि एफएफ स्थापित करना मतलब है कि हमारे सर्वर पर एक्स सामान का एक गुच्छा स्थापित करना, एफएफ चलाने से बहुत अधिक ओवरहेड होता है, और मैं वास्तव में प्रक्रिया को ट्रैक करने और इसे पूरा करने के बाद इसे मारने के बारे में नहीं चाहता हूं।
  • Node.js + jsdom (http://github.com/tmpvar/jsdom) का उपयोग करें। यहां नीचे की ओर यह है कि यह स्पष्ट नहीं है कि जेएसडॉम कैसे समर्थित है - अधिकृत साइट, jsdom.org, वास्तव में मौजूद नहीं है। इसके अलावा, मुझे कोई दस्तावेज नहीं मिल रहा है।
  • शायद राइनो के साथ कुछ करें? जहां तक ​​मैं कह सकता हूं, राइनो के पास नोड की तुलना में और भी कम डोम समर्थन है।

तो ... उन सभी तीन विकल्पों में से चूसना। मुझे लगता है। क्या मैं कुछ गलत हूँ? क्या कोई और तरीका है?

उत्तर

3

wkhtmltoimage के साथ इसे हल किया गया। बदसूरत समाधान, लेकिन यह काम करता है।

0

आप ImageMagick के माध्यम से इसे चलाने से पहले transforming the VML to SVG on the server को आजमा सकते हैं। मुझे पता है कि प्रोजेक्ट स्वयं PHP है, लेकिन एक्सएसएल के साथ रूपांतरण किया जाता है (फाइल डाउनलोड आर्काइव में है) इसलिए किसी भी सर्वर प्लेटफॉर्म पर पोर्टेबल होना चाहिए।

+0

कूल ... धन्यवाद। यह वास्तव में काम कर सकता है - हालांकि मेरी स्पाइडी भावना उपयोगकर्ता के ब्राउज़र के आउटपुट पर भरोसा करने के विचार पर झुका रही है। मैं अपनी अंगुली को जोखिम पर नहीं डाल सकता, लेकिन उस चल रहे क्लाइंट-साइड प्रकार पर भरोसा करता हूं। आप क्या सोचते हैं - क्या मैं सिर्फ पागल हूं?किसी उपयोगकर्ता को एक पृष्ठ लोड किए बिना राफेल छवि बनाने का कोई तरीका नहीं है, और मुझे लगता है कि हम उम्मीद करते हैं कि हमारे उपयोगकर्ताओं के पास जेएस सक्षम है ... – rfrankel

+0

@rfrankel आप निश्चित रूप से ब्राउज़र से इनपुट पर भरोसा नहीं कर सकते और हमेशा अच्छी तरह से गठित इनपुट के साथ संभावित शोषण (उदाहरण के लिए एक्सएसएलटी इंजन में) होने जा रहा है, लेकिन मुझे यह मानना ​​चाहिए कि आपका इनपुट वास्तव में एसवीजी एक अच्छी शुरुआत होगी। – robertc

+0

निश्चित रूप से - मैं वास्तव में सुरक्षा जोखिमों के बारे में भी सोच नहीं रहा था (जो मुझे पता है कि कैसे निपटना है) उतना ही बढ़िया मामलों जहां हम सफलतापूर्वक राफेल छवि बनायेंगे लेकिन पीएनजी नहीं क्योंकि उपयोगकर्ता का ब्राउज़र कुछ अजीब या क्रैश करता है जो कुछ भी। – rfrankel

1

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

एसवीजी रेंडरर/रास्टराइज़र बस एक सीजीआई स्क्रिप्ट हो सकता है जो ImageMagick को कॉल करता है, या कुछ और परिष्कृत हो सकता है। व्यक्तिगत रूप से, मैं Apache Batik चलाने वाले एक सर्वलेट को स्थापित करने की अनुशंसा करता हूं, जिसमें SVG Rasterizer शामिल है, और इसे प्रोग्रामेटिक रूप से कहा जा सकता है। एक त्वरित Google खोज इंगित करता है कि यह Batik के लिए एक बहुत ही आम काम है: http://www.mail-archive.com/[email protected]/msg06116.html

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