2015-05-04 5 views
3

Используя javascript, мне нужно создать файл .odt и заполнить содержимое данными в javascript переменных. Единственное, что я нашел, которое может работать, это WebODF. Пример, который похож на него, - here.Динамическое создание ODT с использованием WebODF/Javascript

Когда я пытаюсь сделать что-то похожее на PDF с pdfkit (с помощью узла), я могу сделать что-то вроде этого:

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. Аналогичным образом можно вставлять данные в любые другие элементы offest(). нажатие crtl + space покажет promt, и все, что мы набираем, вставляется в 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; 
Смежные вопросы