Я использую openxml в своем мобильном приложении HTML5 для создания текстовых документов на мобильном устройстве. В целом openxml работает нормально и прямолинейно, но я борюсь с неприятной проблемой. Генерация документов работает только в первый раз после того, как я запустил приложение. На этот раз я могу открыть и просмотреть документ. Перезапуск приложения означает: - Повторное развертывание с компьютера для разработки - Удаление приложения из области задач (отталкивание в сторону; я предполагаю, что приложение удалено?)
Во второй раз я получаю сообщение о том, что документ поврежден, и я не могу просмотреть файл.
ОБНОВЛЕНИЕ: я не могу воспроизвести это поведение, когда запускаю приложение, подключенное к удаленному отладчику, без установленной точки останова. Делая это таким образом, я всегда получаю рабочий документ.
Мне все равно, внесу ли я какие-либо изменения в документ или нет. Просто откройте и сохраните воспроизвести эту ошибку.
Проведя некоторое исследование, я обнаружил, что структура файла docx.zip рабочего и поврежденного файла одинакова. Они также имеют одинаковую длину файла. Но в поврежденном docx есть несколько файлов, которые я нашел в некоторых файлах с неправильным/недействительным CRC. См. здесь пример при попытке получить поврежденный файл из zip. Другие файлы работают как положено.
Свойства этого файла:-> (CRC в рабочей версии: 44D3906C)
Код для обработки шаблона документа:
/*
* Process the template
*/
function processTemplate(doc64, callback)
{
"use strict";
console.log("PROCESS TEMPLATE");
var XAttribute = Ltxml.XAttribute;
var XCData = Ltxml.XCData;
var XComment = Ltxml.XComment;
var XContainer = Ltxml.XContainer;
var XDeclaration = Ltxml.XDeclaration;
var XDocument = Ltxml.XDocument;
var XElement = Ltxml.XElement;
var XName = Ltxml.XName;
var XNamespace = Ltxml.XNamespace;
var XNode = Ltxml.XNode;
var XObject = Ltxml.XObject;
var XProcessingInstruction = Ltxml.XProcessingInstruction;
var XText = Ltxml.XText;
var XEntity = Ltxml.XEntity;
var cast = Ltxml.cast;
var castInt = Ltxml.castInt;
var W = openXml.W;
var NN = openXml.NoNamespace;
var wNs = openXml.wNs;
var doc = new openXml.OpenXmlPackage(doc64);
// add a paragraph to the beginning of the document.
var body = doc.mainDocumentPart().getXDocument().root.element(W.body);
var tpl_row = ((doc.mainDocumentPart().getXDocument().descendants(W.tbl)).elementAt(1).descendants(W.tr)).elementAt(2);
var newrow = new XElement(tpl_row);
doc.mainDocumentPart().getXDocument().descendants(W.tbl).elementAt(1).add(newrow);
// callback(doc);
var mod_file = null;
var newfile;
var path;
if (doc != null && doc != undefined ) {
mod_file = doc.saveToBlob();
// Start writing document
path = "Templates";
newfile = "Templates/Bau.docx";
console.log("WRITE TEMPLATE DOCUMENT");
fs.root.getFile("Templates/" + "MyGenerated.docx", {create: true, exclusive: false},
function(fileEntry)
{
fileEntry.createWriter(
function(fileWriter)
{
fileWriter.onwriteend = function(e) {
console.log("TEMPLATE DOCUMENT WRITTEN:"+e.target.length);
};
fileWriter.onerror = function(e) {
console.log("ERROR writing DOCUMENT:" + e.code + ";" + e.message);
};
var blobreader = new FileReader();
blobreader.onloadend = function()
{
fileWriter.write(blobreader.result); // reader.result contains the contents of blob as a typed array
};
blobreader.readAsArrayBuffer(mod_file);
},
null);
}, null);
};
Любые идеи, что я делаю неправильно?