Динамическое создание ODT с использованием WebODF / Javascript

С помощью javascriptМне нужно создать .odt файл и заполнить содержимое данными в javascript переменные. Единственное, что я нашел, что может сработать, это WebODF, Пример, который кажется похожим на это, здесь.

Когда я пытаюсь сделать что-то похожее на 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,

2 ответа

Решение

Если я правильно понял ваш вопрос, вы хотите динамически создать новый файл, используя данные в переменной JavaScript.

Вы могли бы сослаться на этот ответ, чтобы загрузить файл из переменной 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 framework для разработки сервисов в качестве бэкэнда для сохранения файлов.

Это может вам помочь. В этом примере я прикрепляю значение, возвращаемое из Promt, к позиции курсора внутри webodf. Вы можете аналогичным образом вставить данные в любые другие элементы offest(). нажатие crtl+ пробел покажет 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;
Другие вопросы по тегам