2013-04-09 31 views
13

Próbuję użyć docx.js (Github repo) do wygenerowania dokumentu programu Word, ale nie mogę go uruchomić.Generowanie dokumentu Word w języku JavaScript za pomocą Docx.js?

I skopiowany kod surowego do konsoli Google Chrome po zmianie linii 247, aby naprawić błąd „nieokreśloną«textAlign»”

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

co sprawia, że ​​funkcja convertContent dostępny. Rezultatem jest obiekt, np.

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

Wyniki w -

"{"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}" 

skopiowane

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

w Notepad ++ i zapisać go jako plik z rozszerzeniem 'docx', ale kiedy go otworzyć w programie MS Word, ale jest napisane "nie można otworzyć, ponieważ występuje problem z zawartością".

Czy brakuje mi niektórych tagów atrybutów lub XML?

+0

Czy próbowałeś skorzystać z repozytorium Github w M4rio? ma jeden przykład użycia: https://github.com/MrRio/DOCX.js – edi9999

+0

Po uruchomieniu przykładowego kodu otrzymuję ten błąd - 'TypeError: Object function bound (var_args) {return func.apply (thisObject, args .concat (slice (argumenty))); } nie ma metody 'ajax'' – Peter

+0

Czy załadowałeś jQuery? Zależności są następujące: ' \t \t ' – edi9999

Odpowiedz

4

Kod ten nie może pracować na JSFiddle powodu ajaxCalls do plików lokalnych (wszystko, co jest w folderze blank), czy należy wprowadzić wszystkie pliki w formacie ByteArray i użyć jsFiddle echa API: http://doc.jsfiddle.net/use/echo.html

+1

Dzięki. Postanowiłem zrobić to po stronie serwera przy użyciu biblioteki o nazwie https://docx.codeplex.com/ Byłoby fajnie zrobić to z JavaScriptem, ale no cóż. :-) – Peter

+2

Jeśli potrzebujesz tylko javascript do generowania dokumentów docx z szablonów docx, zajrzyj do biblioteki, którą utworzyłem: https://github.com/edi9999/docxgenjs – edi9999

+0

wow. to jest spoko. czy możesz użyć obrazów base64 lub elementów canvas? masz stronę demonstracyjną lub przykłady hello_word.docx? – Peter

0

Robisz poprawne hasło, ale Twój plik nie jest prawidłowym plikiem docx. Jeśli przejrzysz funkcję docx() w docx.js, zobaczysz, że plik docx jest w rzeczywistości plikiem zip zawierającym kilka plików xml.

+0

Dzięki. Jak przekonwertować pliki zip/xml do prawidłowego formatu docx? – Peter

+1

Myślę, że możesz przekazać kompletny plik html do parametru pliku funkcji "docx()". Zwróci wynik. –

1

wiem, że to starsza pytanie i masz już odpowiedź, ale zmagał się to do pracy na jeden dzień, więc pomyślałem, że podzielę moje wyniki.

Podobnie jak ty, miałem naprawić textAlign błąd zmieniając linię do tego:

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

Również nie obsługiwać komentarzy HTML. Tak, musiałem dodać następujący wiersz powyższej kontroli na węźle „#text” w pętli for:

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

Aby utworzyć docx było trudne, ponieważ nie ma absolutnie żadnej dokumentacji dotyczącej tej sprawy, jak dotąd. Ale przeglądając kod, widzę, że oczekuje on, że HTML będzie w obiekcie File. Do moich celów chciałem użyć renderowanego HTMLa, a nie jakiegoś pliku HTML, który użytkownik musi wybrać do przesłania. Musiałem więc oszukać go, tworząc własny obiekt z tą samą właściwością, której szukał i przekazać. Aby zapisać go do klienta, używam FileSaver.js, który wymaga kropli. I included this function który konwertuje base64 na obiekt typu blob.Więc mój kod do jego realizacji to:

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

W końcu, to będzie działać dla prostych dokumentów Word, ale nie jest tak wyrafinowany o nic więcej. Nie mogłem uzyskać żadnego z moich stylów do renderowania i nawet nie próbowałem tworzyć obrazów. Od tego czasu porzuciłem to podejście i obecnie badam DocxgenJS lub rozwiązanie po stronie serwera.

0

używam Open XML SDK dla JavaScriptu.

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

Zasadniczo na serwerze WWW, mam pusty plik docx jako nowego szablonu. , gdy użytkownik w przeglądarce kliknie nowy plik docx, pobierze pusty plik docx jako szablon, przekonwertuję go na BASE64 i zwrócę go jako odpowiedź Ajax.

w skryptach klienta konwertujesz ciąg znaków BASE64 na tablicę bajtów i używasz pliku openxmlsdk.js do załadowania tablicy bajtów jako obiektu javascript OpenXmlPackage.

raz masz pakiet załadowane, można użyć zwykłego OpenXmlPart stworzyć prawdziwy dokument. (wstawianie obrazu, tworzenie tabeli/wiersza).

Ostatnim krokiem jest przesłanie go użytkownikowi końcowemu jako dokumentowi. ta część jest związana z bezpieczeństwem. w moim kodzie wysyłam go z powrotem do serwera sieciowego i tymczasowo zapisuję. i przygotować odpowiedź http, aby powiadomić użytkownika końcowego, aby ją pobrać.

Sprawdź URL powyżej, są użyteczne próbki robi to w JavaScript.

Powiązane problemy