Динамическое создание 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;