генерация документа работает только в первый раз

Я использую 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);                   
                 };

Любые идеи, что я делаю неправильно?


person Karl    schedule 28.05.2014    source источник
comment
Не могли бы вы предоставить более подробную информацию о том, что именно происходит? Что не так с CRC? Вы закрываете приложение или просто переводите его в фоновый режим? и т.д, и т.д, и т.д... Очень трудно помочь с проблемой, которую мы не можем, ну, понять.   -  person Cerbrus    schedule 28.05.2014


Ответы (2)


Спасибо за сообщение об ошибке. Были некоторые проблемы с jszip.js, с которыми я столкнулся при разработке Open XML SDK для JavaScript.

По следующей ссылке есть пример приложения javascript, демонстрирующий создание документа.

Демо Open XML SDK для JavaScript

В этом приложении вы можете сохранить несколько файлов DOCX один за другим, и они не будут повреждены.

Чтобы работать над этой проблемой, мне нужно иметь возможность локального воспроизведения. Может быть, вы можете взять это маленькое работающее веб-приложение и заменять части своими частями, пока оно не будет генерировать недопустимые файлы?

Привет, Эрик

P.S. Я путешествую и имею прерывистый доступ к Интернету. Если вы можете продолжить обсуждение на OpenXmlDeveloper.org, тогда это поможет мне быстрее ответить. :-)

person Eric White    schedule 29.05.2014

Что заставило меня работать, так это изменение способа добавления изображений (частей) в документ. Я использовал тип «двоичный» для добавления изображений в документ. Я изменил это на "base64"
Поэтому я изменил источник с:

mydoc.addPart( "/word/"+reltarget, openXml.contentTypes.png, "binary", fotodata );  // add Image Part to doc

to:

mydoc.addPart( "/word/"+reltarget, openXml.contentTypes.png, "base64", window.btoa(fotodata) );                 // add Image Part to doc
person Karl    schedule 06.06.2014