docx-builder
Advanced tools
Comparing version 1.0.4 to 1.0.5
103
index.js
@@ -173,9 +173,74 @@ var fs = require('fs'); | ||
this.insertDocxSync = function(path){ | ||
this.mediaFiles = []; | ||
this.getExternalDocxRawXml = function(docxData) | ||
{ | ||
var zip = new JSZip(docxData); | ||
var xml = Utf8ArrayToString(zip.file("word/document.xml")._data.getContent()); | ||
var zip = new JSZip(fs.readFileSync(path,"binary")); | ||
var xml = Utf8ArrayToString(zip.file("word/document.xml")._data.getContent()); | ||
var mediaFolderName = "word/media"; | ||
var mediaFolder = zip.folder(mediaFolderName); | ||
var relsXml = Utf8ArrayToString(zip.file("word/_rels/document.xml.rels")._data.getContent()); | ||
for(var file in mediaFolder.files) | ||
{ | ||
if(file.startsWith("word/media") && file != "word/media/") | ||
{ | ||
var oldRId = ""; | ||
var newRId = ""; | ||
var rType = ""; | ||
var newFile = file; | ||
var indexOfOldRel = relsXml.indexOf(file.substr(5)); | ||
if(indexOfOldRel != -1) | ||
{ | ||
var left = indexOfOldRel; | ||
var right = indexOfOldRel; | ||
while(left > 0) { left--; if(relsXml[left] == '<') break; } | ||
while(right < relsXml.length) { right++; if(relsXml[right] == '>') break; } | ||
var relTag = relsXml.substr(left); | ||
relTag = relTag.substr(0,right-left+1).split(' '); | ||
for(var i=0; i < relTag.length; i++) | ||
{ | ||
var item = relTag[i]; | ||
if(item.startsWith('Id="')) | ||
{ | ||
oldRId = item.substr(4); | ||
oldRId = oldRId.substr(0, oldRId.length - 1); | ||
} | ||
else if(item.startsWith('Type="')) | ||
{ | ||
rType = item.substr(6); | ||
rType = rType.substr(0, rType.length - 1); | ||
} | ||
} | ||
var hrTime = process.hrtime(); | ||
var newId = hrTime[0] + "" + hrTime[1]; | ||
newRId = "rId" + newId; | ||
var fileExt = "." + newFile.split('.').pop(); | ||
newFile = newFile.substr(0, newFile.length - fileExt.length) + newId + fileExt; | ||
xml = xml.replace("\"" + oldRId + "\"", "\"" + newRId + "\""); | ||
this.mediaFiles.push({ name: newFile, data: mediaFolder.files[file]._data, rId: newRId, rType: rType }); | ||
} | ||
} | ||
} | ||
xml = xml.substring(xml.indexOf("<w:body>") + 8); | ||
xml = xml.substring(0, xml.indexOf("</w:body>")); | ||
xml = xml.substring(0, xml.indexOf("<w:sectPr")); | ||
return xml; | ||
} | ||
this.insertDocxSync = function(path){ | ||
var xml = this.getExternalDocxRawXml(fs.readFileSync(path,"binary")); | ||
this.insertRaw(xml); | ||
@@ -190,8 +255,3 @@ } | ||
{ | ||
var zip = new JSZip(data); | ||
var xml = Utf8ArrayToString(zip.file("word/document.xml")._data.getContent()); | ||
xml = xml.substring(xml.indexOf("<w:body>") + 8); | ||
xml = xml.substring(0, xml.indexOf("</w:body>")); | ||
xml = xml.substring(0, xml.indexOf("<w:sectPr")); | ||
var xml = this.getExternalDocxRawXml(data); | ||
this.insertRaw(xml); | ||
@@ -207,3 +267,21 @@ callback(null); | ||
var zip = new JSZip(template); | ||
var relsXml = ""; | ||
if(this.mediaFiles.length > 0) | ||
{ | ||
relsXml = Utf8ArrayToString(zip.file("word/_rels/document.xml.rels")._data.getContent()); | ||
for(var i=0; i < this.mediaFiles.length; i++) | ||
{ | ||
var mediaFile = this.mediaFiles[i]; | ||
zip.file(mediaFile.name, mediaFile.data); | ||
relsXml = relsXml.replace('</Relationships>', '<Relationship Id="' + mediaFile.rId + '" Type="' + mediaFile.rType + '" Target="' + mediaFile.name.substr(5) + '"/></Relationships>'); | ||
} | ||
zip.file("word/_rels/document.xml.rels", relsXml); | ||
} | ||
//zip.file("word/media/image1.png", algo._data); | ||
var doc = new Docxtemplater().loadZip(zip); | ||
@@ -213,5 +291,8 @@ | ||
doc.render(); | ||
var buf = doc.getZip().generate({type:"nodebuffer"}); | ||
fs.writeFile(filepath,buf, err); | ||
} | ||
@@ -218,0 +299,0 @@ } |
{ | ||
"name": "docx-builder", | ||
"version": "1.0.4", | ||
"version": "1.0.5", | ||
"description": "Easily create or merge DOCX files from Node.js", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
@@ -13,3 +13,3 @@ # docx-builder | ||
View in [npm] (https://www.npmjs.com/package/docx-builder) | ||
View in [npm](https://www.npmjs.com/package/docx-builder) | ||
@@ -89,3 +89,4 @@ # Example | ||
docx.insertDocxSync(__dirname+"/test1.docx"); | ||
//You can also do this asynchronously using the insertDocx method. | ||
docx.insertDocxSync(__dirname+"/test1.docx"); | ||
docx.insertDocxSync(__dirname+"/test2.docx"); | ||
@@ -92,0 +93,0 @@ docx.insertDocxSync(__dirname+"/test3.docx"); |
Sorry, the diff of this file is not supported yet
25109
251
100