2013-04-09 7 views
13

मैं वर्ड दस्तावेज़ उत्पन्न करने के लिए docx.js (Github repo) का उपयोग करने का प्रयास कर रहा हूं लेकिन मुझे इसे काम करने के लिए प्रतीत नहीं होता है।Docx.js के साथ जावास्क्रिप्ट में एक वर्ड दस्तावेज़ जेनरेट करें?

मैं एक " 'textAlign' अपरिभाषित त्रुटि"

if (inNode.style && inNode.style.textAlign){..} 

कौन सा समारोह convertContent उपलब्ध बनाता ठीक करने के लिए लाइन 247 में संशोधन के बाद गूगल क्रोम कंसोल में कच्चे कोड की नकल की। जिसके परिणामस्वरूप एक वस्तु है उदा। में

JSON.stringify(convertContent($('<p>Word!</p>)[0])) 

परिणाम -

"{"string": 
     "<w:body> 
      <w:p> 
       <w:r> 
        <w:t xml:space=\"preserve\">Word!</w:t> 
       </w:r> 
      </w:p> 
     </w:body>" 
,"charSpaceCount":5 
,"charCount":5, 
"pCount":1}" 

मैं नोटपैड में ++

<w:body> 
    <w:p> 
     <w:r> 
      <w:t xml:space="preserve">Word!</w:t> 
     </w:r> 
    </w:p> 
</w:body> 

की नकल की और 'docx' का ही विस्तार के साथ एक फ़ाइल के रूप में सहेजा गया लेकिन जब मैं एमएस वर्ड में खोलने लेकिन यह कहता है 'खोला नहीं जा सकता क्योंकि सामग्री के साथ कोई समस्या है'।

क्या मुझे कुछ विशेषता या एक्सएमएल टैग या कुछ याद आ रही है?

+0

क्या आपने एम 4rio के गिथब रेपो का उपयोग करने का प्रयास किया है? इसका उपयोग करने का एक उदाहरण है: https://github.com/MrRio/DOCX.js – edi9999

+0

उदाहरण कोड चलाने के बाद मुझे यह त्रुटि मिल रही है - 'TypeError: ऑब्जेक्ट फ़ंक्शन बाउंड (var_args) {वापसी func.apply (thisObject, args .concat (टुकड़ा (तर्क))); } में कोई विधि नहीं है 'AJAX' – Peter

+0

क्या आपने jQuery लोड किया है? निर्भरता निम्न हैं: ' \t \t <स्क्रिप्ट टाइप = "टेक्स्ट/जावास्क्रिप्ट" src = "./ libs/jszip/jszip.js"> ' – edi9999

उत्तर

4

इस कोड क्योंकि स्थानीय फ़ाइलों की ajaxCalls (सब कुछ blank फ़ोल्डर में है कि) के एक JSFiddle पर काम नहीं कर सकते हैं, या आप bytearray प्रारूप में सभी फाइलों को दर्ज करें और jsFiddle गूंज एपीआई का उपयोग करना चाहिए: http://doc.jsfiddle.net/use/echo.html

+1

धन्यवाद। मैंने https://docx.codeplex.com/ नामक लाइब्रेरी का उपयोग करके इस सर्वर पक्ष को करने का निर्णय लिया है, यह जावास्क्रिप्ट के साथ ऐसा करने के लिए अच्छा होगा लेकिन ओह ठीक है। :-) – Peter

+2

यदि आप डॉक्स टेम्पलेट्स से डॉक्क्स उत्पन्न करने के लिए जावास्क्रिप्ट केवल समाधान चाहते हैं, तो मैंने बनाई गई लाइब्रेरी पर एक नज़र डालें: https://github.com/edi9999/docxgenjs – edi9999

+0

वाह। यह वास्तव में अच्छा है। क्या आप इसके साथ बेस 64 छवियों या कैनवास तत्वों का उपयोग कर सकते हैं? क्या आपके पास डेमो पेज या हैलो_वर्ड.docx उदाहरण है? – Peter

0

आप सही चीज भी कर रहे हैं, लेकिन आपकी फ़ाइल वैध डॉक्स फ़ाइल नहीं है। यदि आप docx.js में docx() फ़ंक्शन देखते हैं, तो आप देखेंगे कि एक डॉक्क्स फ़ाइल वास्तव में एक ज़िप है जिसमें कई एक्सएमएल फ़ाइलें हैं।

+0

धन्यवाद बनाने के लिए 'AJAX' के माध्यम से इस रिक्त दस्तावेज़ को लोड करता है। मैं उन ज़िप/एक्सएमएल फ़ाइलों को एक वैध डॉक्क्स प्रारूप में कैसे परिवर्तित करूं? – Peter

+1

मुझे लगता है कि आप 'docx()' फ़ंक्शन के फ़ाइल पैरामीटर में एक पूर्ण HTML फ़ाइल पास कर सकते हैं। यह परिणाम वापस कर देगा। –

18

आप docxtemplater (लाइब्रेरी मैंने बनाए गए) का उपयोग कर टेम्पलेट से डॉक्स दस्तावेज़ उत्पन्न कर सकते हैं।

यह टैग को उनके मूल्यों (जैसे टेम्पलेट इंजन) से प्रतिस्थापित कर सकता है, और छवियों को भी प्रतिस्थापित कर सकता है।

यहाँ templating इंजन का एक डेमो है: http://javascript-ninja.fr/docxtemplater/v1/examples/demo.html

1

मैं जानता हूँ कि यह एक पुराने सवाल है और आप पहले से ही एक जवाब है, लेकिन मैं एक दिन के लिए काम करने के लिए इस हो रही संघर्ष किया, तो मैंने सोचा कि मैं साझा करते हैं मेरे परिणाम।

if (inNode.style && inNode.style.textAlign) 

इसके अलावा, यह एचटीएमएल टिप्पणियों को संभाल नहीं किया:

आप की तरह, मैं इस के लिए लाइन बदलकर textAlign बग को ठीक करने के लिए किया था। तो, मैं for पाश में एक "#text" नोड के लिए चेक ऊपर निम्न पंक्ति जोड़ने के लिए किया था:

if (inNodeChild.nodeName === '#comment') continue; 

docx बनाने के लिए मुश्किल था के बाद से वहाँ बिल्कुल अभी तक इस बात पर कोई प्रलेखन है। लेकिन कोड को देखकर, मुझे लगता है कि यह एचटीएमएल को फाइल ऑब्जेक्ट में होने की उम्मीद कर रहा है। मेरे उद्देश्यों के लिए, मैं प्रस्तुत किए गए HTML का उपयोग करना चाहता था, कुछ HTML फ़ाइल नहीं जिसे उपयोगकर्ता को अपलोड करने के लिए चुनना है। तो मुझे अपनी खुद की ऑब्जेक्ट को उसी संपत्ति के साथ बनाकर उसे चालना पड़ा जिसे वह ढूंढ रहा था और इसे पास कर रहा था। इसे क्लाइंट को सहेजने के लिए, मैं FileSaver.js का उपयोग करता हूं, जिसके लिए ब्लॉब की आवश्यकता होती है। मैं included this function जो बेस 64 को ब्लॉब में परिवर्तित करता है।तो इसे लागू करने के लिए अपने कोड यह है:

var result = docx({ DOM: $('#myDiv')[0] }); 
var blob = b64toBlob(result.base64, "application/vnd.openxmlformats-officedocument.wordprocessingml.document"); 
saveAs(blob, "test.docx"); 

अंत में, इस सरल Word दस्तावेज़ों के लिए काम करेंगे, लेकिन ज्यादा कुछ के लिए लगभग परिष्कृत नहीं है। मुझे प्रस्तुत करने के लिए मेरी कोई भी शैली नहीं मिल सका और मैंने छवियों को काम करने का भी प्रयास नहीं किया। मैंने तब से इस दृष्टिकोण को त्याग दिया है और अब DocxgenJS या कुछ सर्वर-साइड समाधान का शोध कर रहा हूं।

0

मैं जावास्क्रिप्ट के लिए खुला है Xml SDK का उपयोग कर रहा हूँ।

http://ericwhite.com/blog/open-xml-sdk-for-javascript/

मूल रूप से, वेब सर्वर पर, मैं नया टेम्पलेट के रूप में एक खाली docx फ़ाइल है। जब ब्राउज़र में उपयोगकर्ता नई docx फ़ाइल पर क्लिक करता है, तो मैं खाली docx फ़ाइल को टेम्पलेट के रूप में पुनर्प्राप्त कर दूंगा, इसे BASE64 में परिवर्तित कर दूंगा और इसे अजाक्स प्रतिक्रिया के रूप में वापस कर दूंगा।

क्लाइंट स्क्रिप्ट में, आप बाइट सरणी में BASE64 स्ट्रिंग को परिवर्तित करते हैं और बाइट सरणी को जावास्क्रिप्ट OpenXmlPackage ऑब्जेक्ट के रूप में लोड करने के लिए openxmlsdk.js का उपयोग करते हैं।

एक बार आपके पास पैकेज लोड होने के बाद, आप वास्तविक दस्तावेज़ बनाने के लिए नियमित OpenXmlPart का उपयोग कर सकते हैं। (छवि डालने, तालिका/पंक्ति बनाने)।

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

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

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