文档生成仅在第一次有效

时间:2014-05-28 07:49:52

标签: javascript cordova sdk openxml

我在HTML5移动应用中使用openxml在移动设备上生成word文档。 一般来说,openxml工作得很好而且直截了当,但我正在努力解决一个尴尬的问题。 文档生成仅在我启动应用程序后第一次生效。这次我可以打开并查看文档。重启应用意味着: - 从开发机器重新部署 - 从任务窗格中删除应用程序(推开;我认为该应用程序已删除了吗?)

我第二次收到消息时文档已损坏,我无法查看该文件

更新: 当我在没有设置断点的情况下运行连接到远程调试器的应用程序时,我无法重现此行为。这样做我总能得到一份工作文件。

我对文档进行任何更改是否有所作为。只需打开并保存即可重现此错误。

经过一番研究后,我发现工作文件和损坏文件的docx.zip文件结构是一样的。它们也具有相同的文件长度。但是在腐败的docx中有一些文件我发现一些文件的CRC错误/无效。在尝试从zip中获取损坏的文件时,请参见此处的示例。其他文件正在按预期工作。 enter image description here

此文件的属性为 - > (工作版中的CRC为:44D3906C) enter image description here

处理doc-template的代码:

            /*
             * 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);                   
                 };

任何想法我做错了什么?

2 个答案:

答案 0 :(得分:0)

感谢您发布有关错误的信息。我在开发JavaScript的Open XML SDK时遇到了jszip.js的一些问题。

在以下链接中,有一个示例javascript应用程序,用于演示生成文档。

Open XML SDK for JavaScript Demo

在该应用程序中,您可以一个接一个地保存多个DOCX,并且它们没有损坏。

为了解决这个问题,我需要能够在本地重新制作。也许您可以使用那个小工作的Web应用程序并用零件替换零件,直到它生成无效文件?

干杯,埃里克

P.S。我正在旅行并且间歇性地访问互联网。如果你可以继续thread on OpenXmlDeveloper.org,那么它将帮助我更快地回答。 : - )

答案 1 :(得分:0)

使它对我有用的是改变向文档添加图像(部分)的方式。我使用的是"二进制"用于将图像添加到文档。我将其更改为" base64"
所以我改变了来源:

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

为:

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