2015-05-04 234 views
3

使用javascript,我需要创建一个.odt文件并使用javascript变量中的数据填充内容。我发现的唯一可能的工作是WebODF。一个似乎与它相似的例子是here使用WebODF/Javascript动态创建ODT

当我试图做pdfkit(使用节点)类似PDF什么事情我可以做这样的事情:

PDFDocument = require('pdfkit'); 
var doc = new PDFDocument(); 
doc.pipe(fs.createWriteStream(fileName)); 
doc.text("Fist line"); 
doc.text("Second line"); 

是否有可能使用WebODF做类似它的东西?我发现ops.OpInsertText,但我不确定如何使用它来实际插入文本。

同样,理想的解决方案只在javascript

回答

1

如果我的问题是正确的,您希望使用JavaScript变量中的数据动态创建一个新文件。

您可以参考this answer以字节数组的形式从javascript变量载入文件。 这将使您启动并运行一个odt文件,您可以将它保存到所需的位置。

function saveByteArrayLocally(error, data) { 
    var mime = "application/vnd.oasis.opendocument.text"; 
    var blob = new Blob([data.buffer], {type: mime}); 

    var res = $http({ 
     method: 'POST', url: myWebServiceUrl, 
     headers: {'Content-Type': undefined}, 
     data: blob 
    }); 

    res.success(function(data, status, headers, config) { 
     console.log(status); 
    }); 
} 

注意:您可以使用multer,express.js框架将服务设计为后端以保存文件。

1

这可能会帮助你。在这个例子中,我将从promt返回的值附加到webodf中的光标位置。您可以类似地将数据插入到任何其他元素()。 按crtl +空格将显示一个提示,并且我们键入的任何内容都会插入到odf中。

function insertBreakAtPoint(e) { 
    var range; 
    var textNode; 
    var offset; 
    var key = prompt("Enter the JSON Key", "name"); 
    {% raw %} 
    var key_final = '{{address.'+key+'}}'; 
    {% endraw %} 

    var caretOverlay=$('.webodf-caretOverlay').offset(); 
    if (document.caretPositionFromPoint) { 
     range = document.caretPositionFromPoint(
      caretOverlay.left, caretOverlay.top 
     ); 
     textNode = range.offsetNode; 
     offset = range.offset; 
    } else if (document.caretRangeFromPoint) { 
     range = document.caretRangeFromPoint(
      caretOverlay.left, caretOverlay.top 
     ); 
     textNode = range.startContainer; 
     offset = range.startOffset; 
    } 

    #only split TEXT_NODEs 
    if (textNode.nodeType == 3) { 
     var replacement = textNode.splitText(offset); 
     var keynode = document.createTextNode(key_final); 
     textNode.parentNode.insertBefore(keynode, replacement); 
    } 
} 

function KeyPress(e) { 
    var evtobj = window.event? event : e 
    if (evtobj.keyCode == 32 && evtobj.ctrlKey) 
     insertBreakAtPoint(); 
} 

document.onkeydown = KeyPress;