OOXML.js 102 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320
  1. o2.xApplication.process.Xform.widget = o2.xApplication.process.Xform.widget || {};
  2. o2.xApplication.process.Xform.widget.OOXML = o2.xApplication.process.Xform.widget.OOXML || {};
  3. o2.OOXML = o2.OOXML || {};
  4. o2.xApplication.process.Xform.widget.OOXML.WordprocessingML = o2.OOXML.WML = new Class({
  5. Implements: [Options, Events],
  6. options: {
  7. "AppVersion": "16.0000",
  8. "Application": "o2oa",
  9. "Company": "",
  10. "ScaleCrop": "false",
  11. "LinksUpToDate": "false",
  12. "SharedDoc": "false",
  13. "HyperlinksChanged": "false",
  14. "w_document": "<w:document xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\"\n" +
  15. " xmlns:wpc=\"http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas\"\n" +
  16. " xmlns:cx=\"http://schemas.microsoft.com/office/drawing/2014/chartex\"\n" +
  17. " xmlns:cx1=\"http://schemas.microsoft.com/office/drawing/2015/9/8/chartex\"\n" +
  18. " xmlns:cx2=\"http://schemas.microsoft.com/office/drawing/2015/10/21/chartex\"\n" +
  19. " xmlns:cx3=\"http://schemas.microsoft.com/office/drawing/2016/5/9/chartex\"\n" +
  20. " xmlns:cx4=\"http://schemas.microsoft.com/office/drawing/2016/5/10/chartex\"\n" +
  21. " xmlns:cx5=\"http://schemas.microsoft.com/office/drawing/2016/5/11/chartex\"\n" +
  22. " xmlns:cx6=\"http://schemas.microsoft.com/office/drawing/2016/5/12/chartex\"\n" +
  23. " xmlns:cx7=\"http://schemas.microsoft.com/office/drawing/2016/5/13/chartex\"\n" +
  24. " xmlns:cx8=\"http://schemas.microsoft.com/office/drawing/2016/5/14/chartex\"\n" +
  25. " xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n" +
  26. " xmlns:aink=\"http://schemas.microsoft.com/office/drawing/2016/ink\"\n" +
  27. " xmlns:am3d=\"http://schemas.microsoft.com/office/drawing/2017/model3d\"\n" +
  28. " xmlns:o=\"urn:schemas-microsoft-com:office:office\"\n" +
  29. " xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"\n" +
  30. " xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\" xmlns:v=\"urn:schemas-microsoft-com:vml\"\n" +
  31. " xmlns:wp14=\"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing\"\n" +
  32. " xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\"\n" +
  33. " xmlns:w10=\"urn:schemas-microsoft-com:office:word\"\n" +
  34. " xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\"\n" +
  35. " xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\"\n" +
  36. " xmlns:w16cex=\"http://schemas.microsoft.com/office/word/2018/wordml/cex\"\n" +
  37. " xmlns:w16cid=\"http://schemas.microsoft.com/office/word/2016/wordml/cid\"\n" +
  38. " xmlns:w16=\"http://schemas.microsoft.com/office/word/2018/wordml\"\n" +
  39. " xmlns:w16sdtdh=\"http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash\"\n" +
  40. " xmlns:w16se=\"http://schemas.microsoft.com/office/word/2015/wordml/symex\"\n" +
  41. " xmlns:wpg=\"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup\"\n" +
  42. " xmlns:wpi=\"http://schemas.microsoft.com/office/word/2010/wordprocessingInk\"\n" +
  43. " xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\"\n" +
  44. " xmlns:wps=\"http://schemas.microsoft.com/office/word/2010/wordprocessingShape\"\n" +
  45. " xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\"\n" +
  46. " mc:Ignorable=\"w14 w15 w16se w16cid w16 w16cex w16sdtdh wp14\">",
  47. "w_setting": "<w:settings xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n" +
  48. " xmlns:o=\"urn:schemas-microsoft-com:office:office\"\n" +
  49. " xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"\n" +
  50. " xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\" xmlns:v=\"urn:schemas-microsoft-com:vml\"\n" +
  51. " xmlns:w10=\"urn:schemas-microsoft-com:office:word\"\n" +
  52. " xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\"\n" +
  53. " xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\"\n" +
  54. " xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\"\n" +
  55. " xmlns:w16cex=\"http://schemas.microsoft.com/office/word/2018/wordml/cex\"\n" +
  56. " xmlns:w16cid=\"http://schemas.microsoft.com/office/word/2016/wordml/cid\"\n" +
  57. " xmlns:w16=\"http://schemas.microsoft.com/office/word/2018/wordml\"\n" +
  58. " xmlns:w16sdtdh=\"http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash\"\n" +
  59. " xmlns:w16se=\"http://schemas.microsoft.com/office/word/2015/wordml/symex\"\n" +
  60. " xmlns:sl=\"http://schemas.openxmlformats.org/schemaLibrary/2006/main\"\n" +
  61. " mc:Ignorable=\"w14 w15 w16se w16cid w16 w16cex w16sdtdh\">",
  62. "xmlHead": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>",
  63. "divAsP": false,
  64. "protection": false,
  65. "firstPageNumber": true,
  66. "pageHeight": "841.9",
  67. "pageWidth": "595.3",
  68. "page-margin-left": "79.4",
  69. "page-margin-right": "73.7",
  70. "page-margin-top": "104.9",
  71. "page-margin-bottom": "99.25"
  72. },
  73. initialize: function(options){
  74. this.setOptions(options);
  75. this.path = "../x_component_process_Xform/widget/$OOXML/WordprocessingML/";
  76. this.dpi = this.getDPI();
  77. this.rid = 11;
  78. },
  79. getDPI: function(){
  80. var div = new Element("div", {"styles": {"width": "1in", "height": "1in"}}).inject(document.body);
  81. var dpi = div.offsetWidth.toInt();
  82. div.destroy();
  83. return dpi;
  84. },
  85. getZipTemplate: function(){
  86. //var zipFileName = (this.options.firstPageNumber) ? "template.zip" : "template.zip";
  87. var zipFileName = "zsygzhmb.zip";
  88. return fetch(this.path+zipFileName).then(function(res){
  89. return res.blob().then(JSZip.loadAsync);
  90. });
  91. },
  92. load: function(data){
  93. return new Promise(function(resolve){
  94. o2.load(["../o2_lib/jszip/jszip.min.js", "../o2_lib/jszip/FileSaver.js"], function(){
  95. //this.getZipTemplate();
  96. this.getZipTemplate().then(function(zip){
  97. //console.log(zip.files);
  98. this.zip = zip;
  99. return this.processDocument(data);
  100. }.bind(this)).then(function(oo_content){
  101. var word = new Blob( [oo_content], {type : "application/vnd.openxmlformats-officedocument.wordprocessingml.document"} );
  102. //oo_content.type = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
  103. resolve(word);
  104. });
  105. }.bind(this));
  106. }.bind(this));
  107. },
  108. processDocument: function(data){
  109. var promise = [];
  110. var p1 = this.zip.file("word/document.xml").async("text").then(function(oo_string){
  111. return this.processWordDocument(oo_string, data);
  112. }.bind(this)).then(function(oo_str){
  113. if (oo_str.substring(0, 5)!=="<?xml"){
  114. oo_str = oo_str.replace(/<w:document.*\>/, this.options.w_document);
  115. oo_str = this.options.xmlHead + oo_str;
  116. }
  117. this.zip.file("word/document.xml", oo_str);
  118. if (this.pics && this.pics.length){
  119. return this.zip.file("word/_rels/document.xml.rels").async("text").then(function(oo_relString){
  120. return this.processWordRel(oo_relString);
  121. }.bind(this)).then(function(oo_relStr){
  122. //return oo_relStrPromise.then(function(oo_relStr){
  123. if (oo_relStr.substring(0, 5)!=="<?xml"){
  124. oo_relStr = this.options.xmlHead + oo_relStr;
  125. }
  126. //return this.zip.file("word/_rels/document.xml.rels", oo_relStr).generateAsync({type:"blob"});
  127. return this.zip.file("word/_rels/document.xml.rels", oo_relStr);
  128. //}.bind(this));
  129. }.bind(this));
  130. }
  131. return this.zip;
  132. // this.zip.file("word/document.xml", oo_str).generateAsync({type:"blob"}).then(function(oo_content) {
  133. // this.saveAs(oo_content, "example.docx");
  134. // }.bind(this));
  135. }.bind(this));
  136. promise.push(p1);
  137. if (this.options.protection){
  138. var p2 = this.zip.file("word/settings.xml").async("text").then(function(oo_string){
  139. return this.processWordSetting(oo_string);
  140. }.bind(this)).then(function(oo_settingStr){
  141. if (oo_settingStr.substring(0, 5)!=="<?xml"){
  142. oo_settingStr = oo_settingStr.replace(/<w:settings.*\>/, this.options.w_setting);
  143. oo_settingStr = this.options.xmlHead + oo_settingStr;
  144. }
  145. return this.zip.file("word/settings.xml", oo_settingStr);
  146. }.bind(this));
  147. promise.push(p2);
  148. }
  149. return Promise.all(promise).then(function(){
  150. return this.zip.generateAsync({type:"blob"});
  151. }.bind(this));
  152. },
  153. processWordSetting: function(oo_string){
  154. var domparser = new DOMParser();
  155. var oo_doc = domparser.parseFromString(oo_string, "text/xml");
  156. var oo_settings = oo_doc.documentElement;
  157. return new Promise(function(resolve){
  158. o2.require("o2.widget.Base64", function(){
  159. o2.load(["../o2_lib/CryptoJS/tripledes.js", "../o2_lib/CryptoJS/components/aes.js"], function () {
  160. var keyStr = (new o2.widget.UUID()).toString();
  161. var key = CryptoJS.enc.Utf8.parse(keyStr.substr(0, 16));
  162. var iv = CryptoJS.enc.Utf8.parse(keyStr.substr(0, 16));
  163. var ps = new o2.widget.UUID().toString();
  164. //var srcs = CryptoJS.enc.Utf8.parse(ps);
  165. encrypted = CryptoJS.AES.encrypt(ps, key, {
  166. iv: iv,
  167. mode: CryptoJS.mode.CBC,
  168. padding: CryptoJS.pad.Pkcs7
  169. });
  170. var hash = o2.widget.Base64.encode(encrypted.ciphertext.toString());
  171. var salt = o2.widget.Base64.encode(keyStr);
  172. var oo_protection = this.createEl(oo_doc, "documentProtection");
  173. this.setAttrs(oo_protection, {
  174. "salt": salt,
  175. "hash": hash,
  176. "cryptSpinCount": "100000",
  177. "cryptAlgorithmSid": "4",
  178. "cryptAlgorithmType": "typeAny",
  179. "cryptAlgorithmClass": "hash",
  180. "cryptProviderType": "rsaAES",
  181. "enforcement": "1",
  182. "formatting": "1",
  183. "edit": "readOnly"
  184. });
  185. oo_settings.appendChild(oo_protection);
  186. var s = new XMLSerializer();
  187. resolve(s.serializeToString(oo_doc));
  188. }.bind(this));
  189. }.bind(this));
  190. }.bind(this));
  191. },
  192. saveAs: function(content, name){
  193. o2.saveAs(content, name);
  194. },
  195. getPageRule: function(cssRules){
  196. var pageRule = null;
  197. if (cssRules){
  198. for (var i=0; i<cssRules.length; i++){
  199. if (cssRules[i].type===CSSRule.PAGE_RULE){
  200. pageRule = cssRules[i];
  201. break;
  202. }
  203. }
  204. }
  205. return pageRule;
  206. },
  207. getPicExt: function(contentType){
  208. switch (contentType.toLowerCase()){
  209. case "image/tiff": return "tif";
  210. case "image/gif": return "gif";
  211. case "image/jpeg": return "jpg";
  212. case "image/png": return "png";
  213. }
  214. return "";
  215. },
  216. processWordRel_createRel: function(name, idx, oo_doc, oo_relationships){
  217. var oo_relationship = this.createEl(oo_doc, "Relationship", "rel");
  218. this.setAttrs(oo_relationship, {"Target": "media/"+name, "Type": "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", "Id": "rId"+idx}, false);
  219. oo_relationships.appendChild(oo_relationship);
  220. },
  221. processWordRel_getPicByUrl: function(pic, idx, oo_doc, oo_relationships){
  222. var name = "image"+idx;
  223. var headers = {
  224. "Authorization": layout.session.user.token
  225. };
  226. headers[o2.tokenName] = layout.session.user.token;
  227. return fetch(pic,{
  228. credentials: 'include', // include, same-origin, *omit
  229. headers: headers,
  230. mode: 'cors', // no-cors, cors, *same-origin
  231. }).then(function(res){
  232. var ext = this.getPicExt(res.headers.get("content-type"));
  233. var fullName = name+"."+ext;
  234. return res.blob().then(function(d){
  235. this.zip.file("word/media/"+fullName, d);
  236. this.processWordRel_createRel(fullName, idx, oo_doc, oo_relationships);
  237. }.bind(this));
  238. }.bind(this))
  239. },
  240. processWordRel_getPicByBase64: function(pic, idx, oo_doc, oo_relationships){
  241. var name = "image"+idx;
  242. var arr = pic.split(','), contentType = arr[0].match(/:(.*?);/)[1];
  243. var data = arr[1];
  244. var ext = this.getPicExt(contentType);
  245. var fullName = name+"."+ext;
  246. this.zip.file("word/media/"+fullName, data, {"base64": true});
  247. this.processWordRel_createRel(fullName, idx, oo_doc, oo_relationships);
  248. return Promise.resolve();
  249. },
  250. processWordRel: function(oo_string, data){
  251. var domparser = new DOMParser();
  252. var oo_doc = domparser.parseFromString(oo_string, "text/xml");
  253. var oo_relationships = oo_doc.documentElement;
  254. // var oo_relationshipList = oo_relationships.querySelectorAll("relationship");
  255. // var idx = oo_relationshipList.length+1;
  256. var promises = [];
  257. var idx = 11;
  258. this.pics.each(function(pic){
  259. if (pic.substring(0, 4).toLowerCase()==="data"){
  260. promises.push( this.processWordRel_getPicByBase64(pic, idx, oo_doc, oo_relationships));
  261. }else{
  262. promises.push( this.processWordRel_getPicByUrl(pic, idx, oo_doc, oo_relationships));
  263. }
  264. idx++;
  265. // this.zip.file("word/media/"+pic.name, new Blob(pic.data.data));
  266. //
  267. // var oo_relationship = this.createEl(oo_doc, "Relationship", false);
  268. // this.setAttrs(oo_relationship, {"Target": "media/"+pic.name, "Type": "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", "Id": "rId"+idx}, false);
  269. // oo_relationships.appendChild(oo_relationship);
  270. //
  271. // idx++;
  272. // promises.push(
  273. // res.blob().then(function(d){
  274. //
  275. // }.bind(this), function(){idx++;})
  276. // );
  277. }.bind(this));
  278. return Promise.all(promises).then(function(){
  279. var s = new XMLSerializer();
  280. return s.serializeToString(oo_doc);
  281. });
  282. },
  283. processWordDocument: function(oo_string, data){
  284. //wgxpath.install();
  285. var domparser = new DOMParser();
  286. var oo_doc = domparser.parseFromString(oo_string, "text/xml");
  287. //var oo_body = oo_doc.evaluate("//w:document/w:body", oo_doc, this.nsResolver, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
  288. // var oo_document = oo_doc.documentElement;
  289. // var keys = Object.keys(this.options.xmlns);
  290. // keys.forEach(function(k){
  291. // oo_document.setAttribute(k, this.options.xmlns[k]);
  292. // }.bind(this));
  293. var oo_body = oo_doc.documentElement.querySelector("body");
  294. // var dom_div;
  295. // if (o2.typeOf(data) === "string"){
  296. var dom_div = new Element("div", {"styles": {
  297. "display": "block",
  298. "width": "442.2pt",
  299. "padding": "104.9pt 73.7pt 99.25pt 79.4pt",
  300. }}).set("html", data).inject(document.body);
  301. // }else{
  302. // dom_div = data;
  303. // }
  304. return new Promise(function(resolve){
  305. var imgs = dom_div.getElements("img");
  306. var promises = [];
  307. imgs.each(function(img){
  308. if (!img.complete){
  309. var p = new Promise(function(r){
  310. img.addEvent("load", function(){
  311. r();
  312. }.bind(this))
  313. });
  314. promises.push(p);
  315. }
  316. }.bind(this));
  317. Promise.all(promises).then(function(){
  318. var style= dom_div.getElement("style");
  319. if (style){
  320. var dom_pageRule = this.getPageRule(dom_div.getElement("style").sheet.cssRules);
  321. if (dom_pageRule) this.processPageSection(dom_pageRule, oo_body);
  322. }
  323. var dom_wordSection = dom_div.getElement(".WordSection1");
  324. if (dom_wordSection){
  325. this.processPageSection(dom_wordSection, oo_body);
  326. this.processDom(dom_wordSection, oo_body);
  327. }
  328. dom_div.destroy();
  329. var s = new XMLSerializer();
  330. resolve(s.serializeToString(oo_doc));
  331. }.bind(this));
  332. }.bind(this));
  333. // var style= dom_div.getElement("style");
  334. // if (style){
  335. // var dom_pageRule = this.getPageRule(dom_div.getElement("style").sheet.cssRules);
  336. // if (dom_pageRule) this.processPageSection(dom_pageRule, oo_body);
  337. // }
  338. // var dom_wordSection = dom_div.getElement(".WordSection1");
  339. // if (dom_wordSection){
  340. // this.processPageSection(dom_wordSection, oo_body);
  341. // this.processDom(dom_wordSection, oo_body);
  342. // }
  343. //
  344. //
  345. // dom_div.destroy();
  346. // var s = new XMLSerializer();
  347. // return s.serializeToString(oo_doc);
  348. },
  349. processDom: function(dom, oo_body, append, divAsP){
  350. dom = dom.getFirst();
  351. while (dom){
  352. if (dom.getStyle("display")!=="none"){
  353. if (dom.hasClass("doc_layout_redHeader")){
  354. var node = dom.firstChild;
  355. while (node){
  356. if (node.nodeType===Node.TEXT_NODE){
  357. var text = node.nodeValue.replace(/(?=\s|\n|\r|\t)[^\u3000]/g, '');
  358. if (text){
  359. var oo_p = this.createParagraphFromDom(dom, oo_body, append);
  360. this.processRun(dom, oo_p, dom, text);
  361. }
  362. }else{
  363. this.processParagraph(node, oo_body, append);
  364. //this.processDom(node, oo_body, append, true);
  365. }
  366. node = node.nextSibling;
  367. }
  368. // if (node && node.nodeType===Node.TEXT_NODE && node.nodeValue.trim()){
  369. // var oo_p = this.createParagraphFromDom(dom, oo_body, append);
  370. // this.processRun(dom, oo_p, dom, node.nodeValue);
  371. // }
  372. //
  373. // this.processParagraph(dom, oo_body, append);
  374. }else if (dom.hasClass("doc_layout_filetext")){
  375. this.processFiletext(dom, oo_body, append);
  376. }else if (dom.hasClass("doc_layout_attachment_text")){
  377. this.processFiletext(dom, oo_body, append);
  378. }else if (dom.hasClass("doc_layout_editionArea")){
  379. var wordSection = dom.getParent(".WordSection1");
  380. var h = this.pxToPt(dom.getSize().y);
  381. var top = this.pxToPt(dom.getPosition(wordSection).y);
  382. var pageH = this.pageHeight/20-this["page-margin-top"]/20-this["page-margin-bottom"]/20;
  383. var offsetY = 0;
  384. if (wordSection) {
  385. var pageBreakNodes = wordSection.querySelectorAll(".cke_pagebreak");
  386. pageBreakNodes.forEach(function(node){
  387. var t = this.pxToPt(node.getPosition(wordSection).y);
  388. offsetY += pageH-(t % pageH);
  389. }.bind(this));
  390. }
  391. top += offsetY;
  392. var tmpp = new Element("p").set('class', 'MsoNormal').set('html', '&nbsp;').inject(dom, "top");
  393. var lineHeight = tmpp.getSize().y;
  394. tmpp.destroy();
  395. var tmp = (top+h)/pageH;
  396. var tmp2 = (top+lineHeight)/pageH;
  397. var ps = tmp.toInt();
  398. var ps2 = tmp2.toInt();
  399. if (tmp>ps) ps = ps+1;
  400. if (tmp2>ps2) ps2 = ps2+1;
  401. if ((ps % 2)!=0){
  402. // var p = new Element("p", {"styles": {"page-break-after":"always"}}).inject(dom, "top");
  403. // if ((ps2 % 2)==0){new Element("p", {"styles": {"page-break-after":"always"}}).inject(dom, "top");}
  404. var p = new Element("p").set('class', 'MsoNormal').set('html', '&nbsp;').setStyles({"page-break-after":"always"}).inject(dom, "top");
  405. var lineHeight = p.getSize().y;
  406. new Element("p").set("html", "<br>").inject(dom, "top");
  407. if (ps2<ps) {
  408. if ((ps2 - tmp2) * pageH > this.pxToPt(lineHeight)) {
  409. new Element("p").set('class', 'MsoNormal').setStyles({"page-break-after": "always"}).inject(dom, "top");
  410. }
  411. }
  412. }
  413. this.processDom(dom, oo_body, append, divAsP);
  414. }else if (dom.tagName.toLowerCase() === "p" || ((!!divAsP || !!this.options.divAsP) && dom.tagName.toLowerCase() === "div")){
  415. this.processParagraph(dom, oo_body, append);
  416. // }else if (dom.tagName.toLowerCase() === "span") {
  417. // this.processRun(dom, oo_body, append);
  418. }else if (dom.tagName.toLowerCase() === "hr") {
  419. this.processHr(dom, oo_body, append);
  420. }else if (dom.tagName.toLowerCase() === "img") {
  421. var oo_p = this.createParagraphFromDom(dom, oo_body, append);
  422. this.processPic(dom, oo_p, append);
  423. }else if (dom.tagName.toLowerCase() === "table") {
  424. this.processTable(dom, oo_body, append);
  425. }else if (dom.tagName.toLowerCase() === "span") {
  426. if (!oo_body || oo_body.tagName.toString().toLowerCase()!=="w:p") var oo_body = this.createParagraphFromDom(dom, oo_body, append);
  427. this.processRun(dom, oo_body);
  428. }else{
  429. this.processDom(dom, oo_body, append, divAsP);
  430. }
  431. }
  432. dom = dom.getNext();
  433. }
  434. },
  435. // processFiletextParagraphRun: function(node, oo_p, p){
  436. // node = node.firstChild;
  437. // while (node){
  438. // if (node.nodeType===Node.TEXT_NODE){
  439. // if (node.nodeValue.trim()) this.processRun(node.parentElement, oo_p, p);
  440. // }else if (node.nodeType===Node.ELEMENT_NODE){
  441. // if (node.tagName.toLowerCase() === "span") {
  442. // this.processRun(node, oo_p, p);
  443. // }else if (node.tagName.toLowerCase() === "table") {
  444. // this.processTable(node, oo_p, p);
  445. // }else{
  446. // this.processFiletextParagraphRun(node, oo_p, p);
  447. // }
  448. // }else{
  449. // this.processFiletextParagraphRun(node, oo_p, p);
  450. // }
  451. // node = node.nextSibling;
  452. // }
  453. // },
  454. processFiletext: function(dom, oo_body, append){
  455. var node = dom.firstChild;
  456. if (node && node.nodeType===Node.TEXT_NODE){
  457. var text = node.nodeValue.replace(/(?=\s|\n|\r|\t)[^\u3000]/g, '');
  458. if (text){
  459. var oo_p = this.createParagraphFromDom(dom, oo_body, append);
  460. this.processRun(dom, oo_p, dom, text);
  461. }
  462. }
  463. node = dom.getFirst();
  464. while (node){
  465. if (node.tagName.toLowerCase() === "div" || node.tagName.toLowerCase() === "p") {
  466. this.processParagraph(node, oo_body, append);
  467. }else if (node.tagName.toLowerCase() === "img") {
  468. var oo_p = this.createParagraphFromDom(node, oo_body, append);
  469. this.processPic(node, oo_p, append);
  470. }else if (node.tagName.toLowerCase() === "table") {
  471. this.processTable(node, oo_body, append);
  472. }
  473. node = node.getNext();
  474. }
  475. },
  476. // processFiletextParagraph: function(){
  477. //
  478. // },
  479. isEmptyP: function(p){
  480. var oo_t = p.querySelector("t");
  481. var oo_drawing = p.querySelector("drawing");
  482. var oo_br = p.querySelector("br");
  483. return !oo_t && !oo_drawing && !oo_br;
  484. },
  485. processParagraphRun: function(node, oo_p, p, oo_body, append, ilvl){
  486. node = node.firstChild;
  487. while (node){
  488. if (node.nodeType===Node.TEXT_NODE){
  489. var text = node.nodeValue.replace(/(?=\s|\n|\r|\t)[^\u3000]/g, '');
  490. if (text) this.processRun(node.parentElement || node.parentNode, oo_p, p, text);
  491. }else if (node.nodeType===Node.ELEMENT_NODE){
  492. if (node.getStyle("display") === "none") {
  493. continue;
  494. }else if (node.tagName.toLowerCase() === "span") {
  495. this.processRun(node, oo_p, p);
  496. }else if (node.tagName.toLowerCase() === "br") {
  497. // if (node.nextSibling)
  498. if (node.nextSibling || (!node.nextSibling && !node.previousSibling)){
  499. this.processRun(node, oo_p, p, "", "br");
  500. }
  501. }else if (node.tagName.toLowerCase() === "div" || node.tagName.toLowerCase() === "p") {
  502. if (!this.isEmptyP(oo_p)){
  503. oo_p = this.createParagraphFromDom(node, oo_body, append);
  504. }else{
  505. this.setParagraphAttrFromDom(node, oo_p);
  506. }
  507. this.processParagraphRun(node, oo_p, p, oo_body, append, ilvl);
  508. }else if (node.tagName.toLowerCase() === "ul" || node.tagName.toLowerCase() === "ol") {
  509. this.processNumbering(node, oo_p, p, oo_body, append, ilvl);
  510. }else if (node.tagName.toLowerCase() === "table") {
  511. this.processTable(node, oo_body);
  512. if (this.isEmptyP(oo_p)) oo_p.destroy();
  513. oo_p = this.createParagraphFromDom(p, oo_body, append);
  514. }else if (node.tagName.toLowerCase() === "img") {
  515. this.processPic(node, oo_p, append);
  516. if (this.isEmptyP(oo_p)) oo_p.destroy();
  517. oo_p = this.createParagraphFromDom(p, oo_body, append);
  518. }else{
  519. this.processParagraphRun(node, oo_p, p, oo_body, append, ilvl);
  520. }
  521. }else{
  522. this.processParagraphRun(node, oo_p, p, oo_body, append, ilvl);
  523. }
  524. node = node.nextSibling;
  525. }
  526. },
  527. processNumbering: function(node, oo_p, p, oo_body, append, ilvl){
  528. ilvl = ilvl || 0;
  529. var nextIlvl = ilvl + 1;
  530. var numId = (node.tagName.toLowerCase() === "ul") ? "1" : "2";
  531. var lis = node.getChildren("li");
  532. for (var i=0; i<lis.length; i++){
  533. var li = lis[i];
  534. if (!this.isEmptyP(oo_p)) oo_p = this.createParagraphFromDom(li, oo_body, append);
  535. var oo_pPr = oo_p.querySelector("pPr");
  536. if (!oo_pPr){
  537. oo_pPr = this.createEl(oo_body.ownerDocument, "pPr");
  538. oo_p.appendChild(oo_pPr);
  539. }
  540. oo_numPr = this.createEl(oo_body.ownerDocument, "numPr");
  541. oo_ilvl = this.createEl(oo_body.ownerDocument, "ilvl");
  542. this.setAttrs(oo_ilvl, {"val": ilvl});
  543. oo_numId = this.createEl(oo_body.ownerDocument, "numId");
  544. this.setAttrs(oo_numId, {"val": numId});
  545. oo_numPr.appendChild(oo_ilvl);
  546. oo_numPr.appendChild(oo_numId);
  547. oo_pPr.appendChild(oo_numPr);
  548. this.processParagraphRun(li, oo_p, li, oo_body, append, nextIlvl);
  549. }
  550. },
  551. getPPrs: function(dom){
  552. var pPrs = {};
  553. var align = dom.getStyle("text-align");
  554. if (align){
  555. var jc = "start"
  556. switch (align){
  557. case "center": jc = "center"; break;
  558. case "right":
  559. case "end": jc = "end"; break;
  560. case "justify": jc = "both"; break;
  561. }
  562. pPrs.jc = {"val": jc};
  563. }
  564. var left = dom.getStyle("margin-left");
  565. if (left && left.toFloat()){
  566. var left = this.pxToPt(left)*20;
  567. if (left) {
  568. if (!pPrs.ind) pPrs.ind = {};
  569. pPrs.ind.left = left;
  570. }
  571. }
  572. var right = dom.getStyle("margin-left");
  573. if (right && right.toFloat()){
  574. var right = this.pxToPt(right)*20;
  575. if (right) {
  576. if (!pPrs.ind) pPrs.ind = {};
  577. pPrs.ind.right = right;
  578. }
  579. }
  580. var indent = dom.getStyle("text-indent");
  581. if (indent && indent.toFloat()){
  582. var indent = this.pxToPt(indent)*20;
  583. if (indent) {
  584. if (!pPrs.ind) pPrs.ind = {};
  585. if (indent>0){
  586. pPrs.ind.firstLine = indent;
  587. }else{
  588. pPrs.ind.hanging = Math.abs(indent);
  589. }
  590. }
  591. }
  592. var line = (dom.currentStyle) ? dom.currentStyle["line-height"] : dom.getStyle("line-height");
  593. //var line = dom.getStyle("line-height");
  594. var msoStyle = this.getMsoStyle(dom);
  595. var lineRule = msoStyle["mso-line-rule"] || "exact";
  596. if (line && parseFloat(line)){
  597. var line = this.pxToPt(line)*20;
  598. if (line) {
  599. pPrs.spacing = {
  600. lineRule: lineRule,
  601. line: line
  602. };
  603. }
  604. }
  605. // if (line && line.toFloat()){
  606. // var line = this.pxToPt(line)*20;
  607. // if (line) {
  608. // pPrs.spacing = {
  609. // lineRule: "exact",
  610. // line: line
  611. // };
  612. // }
  613. // }
  614. var pageBreak = dom.getStyle("page-break-after");
  615. if (pageBreak && pageBreak.toString().toLowerCase()=="avoid"){
  616. pPrs.keepNext = {};
  617. }
  618. if (pageBreak && pageBreak.toString().toLowerCase()=="always"){
  619. pPrs.pageBreak = {};
  620. }
  621. return pPrs;
  622. },
  623. setParagraphAttrFromDom: function(dom, oo_p){
  624. var pPrs = this.getPPrs(dom);
  625. var oo_pPr = oo_p.querySelector("pPr");
  626. if (!oo_pPr){
  627. oo_pPr = this.createEl(oo_p.ownerDocument, "pPr");
  628. oo_p.appendChild(oo_pPr);
  629. }
  630. Object.keys(pPrs).each(function(k){
  631. if (k=="pageBreak") {
  632. var oo_r = this.createEl(oo_p.ownerDocument, "r");
  633. var oo_br = this.createEl(oo_p.ownerDocument, "br");
  634. this.setAttrs(oo_br, {"type": "page"});
  635. oo_r.appendChild(oo_br);
  636. oo_p.appendChild(oo_r);
  637. }else{
  638. var node = oo_pPr.querySelector(k);
  639. if (!node) node = this.createEl(oo_p.ownerDocument, k);
  640. this.setAttrs(node, pPrs[k]);
  641. oo_pPr.appendChild(node);
  642. }
  643. }.bind(this));
  644. },
  645. createParagraphFromDom: function(dom, oo_body, append){
  646. var oo_p = this.createParagraph(oo_body.ownerDocument, {"pPrs": this.getPPrs(dom)});
  647. if (append){
  648. oo_body.appendChild(oo_p);
  649. }else{
  650. var oo_sectPr = this.getEl(oo_body, "sectPr");
  651. if (oo_sectPr){
  652. this.insertSiblings(oo_sectPr, [oo_p], "beforebegin");
  653. }else{
  654. this.insertChildren(oo_body, [oo_p]);
  655. }
  656. }
  657. return oo_p;
  658. },
  659. processParagraph: function(dom, oo_body, append){
  660. var oo_p = this.createParagraphFromDom(dom, oo_body, append);
  661. this.processParagraphRun(dom, oo_p, dom, oo_body, append);
  662. if (this.isEmptyP(oo_p)) oo_p.destroy();
  663. return oo_p;
  664. },
  665. getTableTblW: function(table){
  666. var type = "dxa";
  667. var w = table.style.width;
  668. if (!w){
  669. w = table.get("width");
  670. }
  671. if (!w){
  672. w = this.getMsoStyle(table)["mso-width"];
  673. }
  674. if (w && o2.typeOf(w)==="string"){
  675. var u = w.substring(w.length-1, w.length);
  676. if (u==="%"){
  677. w = w.toFloat()*50;
  678. type = "pct";
  679. }else{
  680. u = w.substring(w.length-2, w.length);
  681. if (u.toLowerCase()!=="pt"){
  682. w = this.pxToPt(w);
  683. }
  684. }
  685. }
  686. if (!w || !w.toFloat()){
  687. w = 0;
  688. type = "auto";
  689. }else{
  690. if (type === "dxa") w = w.toFloat()*20;
  691. }
  692. return {"w": w, "type": type};
  693. },
  694. getTableBorder: function(table, where){
  695. var attr = {
  696. "space": "0",
  697. "val": "single",
  698. "color": "auto",
  699. "sz": "0"
  700. }
  701. // var border = (table.currentStyle) ? table.currentStyle[("border-"+where+"-style").camelCase()] : table.getStyle("border-"+where);
  702. // if (border==="none") border = table.get("border");
  703. // if (!border || border==="none"){
  704. // attr.val = "none";
  705. // }else{
  706. var sz;
  707. var border = (table.currentStyle) ? table.currentStyle[("border-"+where+"-style").camelCase()] : table.getStyle("border-"+where);
  708. if (!border || border==="none"){
  709. sz = table.get("border");
  710. if (!sz || sz==="none") sz = table.getStyle("border-"+where+"-width");
  711. }else{
  712. sz = (table.currentStyle) ? table.currentStyle[("border-"+where+"-width").camelCase()] : table.getStyle("border-"+where+"-width");
  713. if (!sz || !sz.toFloat()) sz = table.get("border");
  714. }
  715. if (sz && o2.typeOf(sz)==="string"){
  716. u = sz.substring(sz.length-2, sz.length);
  717. if (u.toLowerCase()!=="pt"){
  718. sz = this.pxToPt(sz);
  719. }
  720. }
  721. if (!sz || !sz.toFloat()) sz = 0;
  722. attr.sz = sz.toFloat()*8;
  723. if (Browser.name=="firefox") attr.sz = attr.sz*1.25; //firefox边框计算问题
  724. var color = this.getColorHex(((table.currentStyle) ? table.currentStyle[("border-"+where+"-color").camelCase()] : table.getStyle("border-"+where+"-color")));
  725. if (!color) color = "auto";
  726. attr.color = color;
  727. var style = (table.currentStyle) ? table.currentStyle[("border-"+where+"-style").camelCase()] : table.getStyle("border-"+where+"-style");
  728. switch (style){
  729. case "dashed": case "dotted": case "double": attr.val = "double"; break;
  730. default: attr.val = "single";
  731. }
  732. if (attr.sz===0) attr.val="none";
  733. // }
  734. // var sz = table.get("border");
  735. // if (sz) sz = this.pxToPt(sz);
  736. // if (!sz) sz = table.getStyle("border-"+where+"-width");
  737. // if (!sz || !sz.toFloat()) sz = 0;
  738. // attr.sz = sz.toFloat()*20;
  739. var space = table.get("cellspacing");
  740. if (space) attr.space = this.pxToPt(space);
  741. return attr;
  742. },
  743. getTableTblGrid(table){
  744. var grids = [];
  745. var trs = table.rows;
  746. for (var i = 0; i < trs.length; i++){
  747. var idx = 0;
  748. var tds = trs[i].cells;
  749. for (var j=0; j<tds.length; j++){
  750. var td = tds[j];
  751. var colspan = td.get("colspan");
  752. var w = this.getTableTblW(td);
  753. var pt = (w.type==='dxa') ? w.w/20 : this.pxToPt(td.clientWidth);
  754. if (!colspan || parseInt(colspan)===1) {
  755. while (grids.length<=idx) grids.push(0);
  756. if (pt>grids[idx]) grids[idx] = pt;
  757. }else{
  758. var n = parseInt(colspan);
  759. pt = pt / n;
  760. for (var m=1; m<=n; m++){
  761. while (grids.length<=idx) grids.push(0);
  762. if (pt>grids[idx]) grids[idx] = pt;
  763. idx++;
  764. }
  765. }
  766. idx++;
  767. }
  768. }
  769. return grids;
  770. },
  771. // getTableTblGrid: function(table){
  772. // var grids = [];
  773. // var trs = table.rows;
  774. // for (var i = 0; i < trs.length; i++){
  775. // var idx = 0;
  776. // tds = trs[i].cells;
  777. // for (var j=0; j<tds.length; j++){
  778. // var td = tds[j];
  779. // var colspan = td.get("colspan");
  780. // if (!colspan || colspan.toInt()===1) {
  781. // while (grids.length<=idx) grids.push(0);
  782. // var pt = this.pxToPt(td.clientWidth);
  783. // if (pt>grids[idx]) grids[idx] = pt;
  784. // }else{
  785. // var addTd = colspan.toInt()-1;
  786. // var tempTds = [];
  787. // for (var n=0; n<addTd; n++) tempTds.push(new Element("td").inject(td, "after"));
  788. //
  789. // while (grids.length<=idx) grids.push(0);
  790. // var pt = this.pxToPt(td.clientWidth);
  791. // if (pt>grids[idx]) grids[idx] = pt;
  792. //
  793. // tempTds.each(function(tmpTd){
  794. // idx++;
  795. // while (grids.length<=idx) grids.push(0);
  796. // var pt = this.pxToPt(tmpTd.clientWidth);
  797. // if (pt>grids[idx]) grids[idx] = pt;
  798. // }.bind(this));
  799. // tempTds.each(function(tmpTd){
  800. // tmpTd.destroy();
  801. // });
  802. // }
  803. // idx++;
  804. // }
  805. // }
  806. // return grids;
  807. // },
  808. getTdValign: function(td){
  809. var v = "";
  810. var valign = td.getStyle("vertical-align") || td.get("valign");
  811. if (valign) {
  812. switch (valign){
  813. case "bottom": v = "bottom"; break;
  814. case "top": v = "top"; break;
  815. default: v = "center";
  816. }
  817. }
  818. return v;
  819. },
  820. getMsoStyle: function(dom){
  821. var o = {};
  822. var s = dom.getAttribute("style");
  823. if (s){
  824. var sList = s.split(/\s*;\s*/g);
  825. sList.map(function(style){
  826. var styles = style.split(/\s*:\s*/g);
  827. if (styles.length===2){
  828. if (styles[0].substr(0,3).toLowerCase()==="mso"){
  829. o[styles[0]] = styles[1];
  830. }
  831. }
  832. return false;
  833. });
  834. }
  835. var d = dom.dataset;
  836. if (d){
  837. Object.keys(d).forEach(function(k){
  838. if (k.substr(0,3).toLowerCase()==="mso"){
  839. o[k.hyphenate()] = d[k];
  840. }
  841. });
  842. }
  843. return o;
  844. },
  845. processTableDom: function(dom, oo_body, append, divAsP, oo_tc){
  846. dom = dom.firstChild;
  847. while (dom){
  848. if (dom.nodeType===Node.ELEMENT_NODE){
  849. if (dom.getStyle("display") === "none") {
  850. continue;
  851. }else if (dom.hasClass("doc_layout_filetext")){
  852. this.processFiletext(dom, oo_body, append);
  853. }else if (dom.tagName.toLowerCase() === "p" || ((!!divAsP || !!this.options.divAsP) && dom.tagName.toLowerCase() === "div")){
  854. this.processParagraph(dom, oo_body, append);
  855. // }else if (dom.tagName.toLowerCase() === "span") {
  856. // this.processRun(dom, oo_body, append);
  857. }else if (dom.tagName.toLowerCase() === "br") {
  858. if (!oo_body || oo_body.tagName.toString().toLowerCase()!=="w:p") var oo_body = this.createParagraphFromDom(dom, oo_body, dom.parentElement);
  859. this.processRun(dom, oo_body, append, "", "br");
  860. }else if (dom.tagName.toLowerCase() === "hr") {
  861. this.processHr(dom, oo_body, append);
  862. }else if (dom.tagName.toLowerCase() === "img") {
  863. if (!oo_body || oo_body.tagName.toString().toLowerCase()!=="w:p") var oo_body = this.createParagraphFromDom(dom, oo_body, dom.parentElement);
  864. this.processPic(dom, oo_body, append);
  865. }else if (dom.tagName.toLowerCase() === "table") {
  866. this.processTable(dom, oo_body, append);
  867. }else if (dom.tagName.toLowerCase() === "span") {
  868. if (!oo_body || oo_body.tagName.toString().toLowerCase()!=="w:p") var oo_body = this.createParagraphFromDom(dom, oo_body, dom.parentElement);
  869. this.processRun(dom, oo_body, append);
  870. }else{
  871. this.processTableDom(dom, oo_body, append, divAsP);
  872. }
  873. }else if (dom.nodeType===Node.TEXT_NODE){
  874. var text = dom.nodeValue.replace(/(?=\s|\n|\r|\t)[^\u3000]/g, '');
  875. if (text){
  876. if (!oo_body || oo_body.tagName.toString().toLowerCase()!=="w:p") var oo_body = this.createParagraphFromDom(dom.parentElement || dom.parentNode, oo_body, dom.parentElement);
  877. this.processRun(dom.parentElement || dom.parentNode, oo_body, append, text);
  878. }
  879. }else{
  880. this.processTableDom(dom, oo_body, append);
  881. }
  882. dom = dom.nextSibling;
  883. }
  884. },
  885. arrangeTable: function(table){
  886. //检查table,不合理的colspan
  887. var tableMatrix = [];
  888. var trs = table.rows;
  889. var rowspan = {};
  890. for (var i=0; i<trs.length; i++){
  891. tableMatrix[i] = [];
  892. //垂直合并单元格处理
  893. var tdIdx = 0;
  894. var rowspanObj = rowspan[tdIdx];
  895. while (rowspanObj && rowspanObj.count){
  896. rowspanObj.count--;
  897. tableMatrix[i].push({"td": rowspanObj.td, type: 0});
  898. if (rowspanObj.count<1) delete rowspan[tdIdx];
  899. tdIdx++;
  900. rowspanObj = rowspan[tdIdx];
  901. }
  902. var tds = trs[i].cells;
  903. for (var j=0; j<tds.length; j++){
  904. var td = tds[j];
  905. //记录实体单元格
  906. tableMatrix[i].push({"td": td, type: 1});
  907. //记录此单元格是否有垂直合并
  908. var cspan = td.get("colspan");
  909. var rspan = td.get("rowspan");
  910. if (rspan && parseInt(rspan)>1){
  911. rowspan[tdIdx] = {
  912. "td": td,
  913. "count": parseInt(rspan)-1
  914. };
  915. if (cspan && parseInt(cspan)>1){
  916. for (var n = 1; n<parseInt(cspan); n++){
  917. rowspan[tdIdx+n] = {
  918. "td": td,
  919. "count": parseInt(rspan)-1
  920. };
  921. }
  922. }
  923. }
  924. //补齐水平合并的虚拟单元格
  925. if (cspan && parseInt(cspan)>1){
  926. for (var n=1; n<parseInt(cspan); n++){
  927. tableMatrix[i].push({"td": td, type: 0});
  928. tdIdx++;
  929. }
  930. }
  931. //检查有没有之前的垂直合并内容
  932. var nextIdx = tdIdx+1;
  933. var rowspanObj = rowspan[nextIdx];
  934. while (rowspanObj && rowspanObj.count){
  935. rowspanObj.count--;
  936. tableMatrix[i].push({"td": rowspanObj.td, type: 0});
  937. if (rowspanObj.count<1) delete rowspan[nextIdx];
  938. nextIdx++;
  939. rowspanObj = rowspan[nextIdx];
  940. }
  941. // if (cspan && parseInt(cspan)>1){
  942. // if (rowspan[tdIdx]){
  943. // rowspan[tdIdx].count = (rowspan[tdIdx].count)*parseInt(cspan);
  944. // for (var n=1; n<parseInt(cspan); n++){
  945. // rowspan[tdIdx+n] = rowspan[tdIdx];
  946. // }
  947. // }
  948. // }
  949. tdIdx = nextIdx-1;
  950. tdIdx++;
  951. }
  952. }
  953. var y = tableMatrix.length;
  954. if (y>0){
  955. var x = tableMatrix[0].length;
  956. for (var x1=0; x1<x; x1++){
  957. var flag = 0;
  958. for (var y1=0; y1<y; y1++){
  959. if (tableMatrix[y1][x1].type!==0){
  960. flag=1;
  961. break;
  962. }
  963. }
  964. if (flag===0){
  965. for (var y1=0; y1<y; y1++){
  966. if (y1==tableMatrix[y1][x1].td.getParent("tr").rowIndex){
  967. if (tableMatrix[y1][x1].td){
  968. var colspan = tableMatrix[y1][x1].td.get("colspan");
  969. colspan = parseInt(colspan)-1;
  970. tableMatrix[y1][x1].td.set("colspan", colspan);
  971. }
  972. }
  973. }
  974. }
  975. }
  976. }
  977. },
  978. processTable(table, oo_body, append) {
  979. this.arrangeTable(table);
  980. var oo_doc = oo_body.ownerDocument;
  981. var oo_tbl = this.createEl(oo_doc, 'tbl');
  982. var oo_tblPr = this.createEl(oo_doc, 'tblPr');
  983. //表格宽度属性
  984. var oo_tblW = this.createEl(oo_doc, 'tblW');
  985. var tblW = this.getTableTblW(table);
  986. this.setAttrs(oo_tblW, tblW);
  987. oo_tblPr.appendChild(oo_tblW);
  988. //表格边框属性
  989. var oo_tblBorders = this.createEl(oo_doc, 'tblBorders');
  990. var oo_top = this.createEl(oo_doc, 'top');
  991. this.setAttrs(oo_top, this.getTableBorder(table, 'top'));
  992. var oo_start = this.createEl(oo_doc, 'start');
  993. this.setAttrs(oo_start, this.getTableBorder(table, 'left'));
  994. var oo_bottom = this.createEl(oo_doc, 'bottom');
  995. this.setAttrs(oo_bottom, this.getTableBorder(table, 'bottom'));
  996. var oo_end = this.createEl(oo_doc, 'end');
  997. this.setAttrs(oo_end, this.getTableBorder(table, 'right'));
  998. this.insertSiblings(oo_tblBorders, [oo_top, oo_start, oo_bottom, oo_end], 'beforeend');
  999. oo_tblPr.appendChild(oo_tblBorders);
  1000. //表格边距
  1001. var mar = parseFloat(table.get('cellpadding'));
  1002. if (!mar) mar = 0;
  1003. //if (mar){
  1004. mar = this.pxToPt(mar) * 20;
  1005. var left = table.getStyle('padding-left');
  1006. var right = table.getStyle('padding-right');
  1007. var top = table.getStyle('padding-top');
  1008. var bottom = table.getStyle('padding-bottom');
  1009. left = (left) ? this.pxToPt(left) * 20 : 0;
  1010. right = (right) ? this.pxToPt(right) * 20 : 0;
  1011. top = (top) ? this.pxToPt(top) * 20 : 0;
  1012. bottom = (bottom) ? this.pxToPt(bottom) * 20 : 0;
  1013. var oo_tblCellMar = this.createEl(oo_doc, 'tblCellMar');
  1014. var oo_mar = this.createEl(oo_doc, 'start');
  1015. this.setAttrs(oo_mar, {'type': 'dxa', 'w': left || mar});
  1016. oo_tblCellMar.appendChild(oo_mar);
  1017. oo_mar = this.createEl(oo_doc, 'end');
  1018. this.setAttrs(oo_mar, {'type': 'dxa', 'w': right || mar});
  1019. oo_tblCellMar.appendChild(oo_mar);
  1020. oo_mar = this.createEl(oo_doc, 'top');
  1021. this.setAttrs(oo_mar, {'type': 'dxa', 'w': top || mar});
  1022. oo_tblCellMar.appendChild(oo_mar);
  1023. oo_mar = this.createEl(oo_doc, 'bottom');
  1024. this.setAttrs(oo_mar, {'type': 'dxa', 'w': bottom || mar});
  1025. oo_tblCellMar.appendChild(oo_mar);
  1026. oo_tblPr.appendChild(oo_tblCellMar);
  1027. //}
  1028. //左右对齐
  1029. var align = table.get('align');
  1030. if (align) {
  1031. var jc = 'start';
  1032. switch (align) {
  1033. case 'center':
  1034. jc = 'center';
  1035. break;
  1036. case 'right':
  1037. case 'end':
  1038. jc = 'end';
  1039. break;
  1040. case 'justify':
  1041. jc = 'both';
  1042. break;
  1043. }
  1044. var oo_jc = this.createEl(oo_doc, 'jc');
  1045. this.setAttrs(oo_jc, {'val': jc});
  1046. oo_tblPr.appendChild(oo_jc);
  1047. }
  1048. //表格浮动
  1049. var floatTable = false;
  1050. var msoStyle = this.getMsoStyle(table);
  1051. var horzAnchor = msoStyle['mso-table-anchor-horizontal'];
  1052. var vertAnchor = msoStyle['mso-table-anchor-vertical'];
  1053. var tblpXSpec = msoStyle['mso-table-left'];
  1054. var tblpYSpec = msoStyle['mso-table-top'];
  1055. if (horzAnchor || vertAnchor || tblpXSpec || tblpYSpec) {
  1056. if (horzAnchor && horzAnchor !== 'page' && horzAnchor !== 'margin' && horzAnchor !== 'text') horzAnchor = 'margin';
  1057. if (vertAnchor && vertAnchor !== 'page' && vertAnchor !== 'margin' && vertAnchor !== 'text') vertAnchor = 'margin';
  1058. var o = {
  1059. 'horzAnchor': horzAnchor || null,
  1060. 'vertAnchor': vertAnchor || null,
  1061. 'tblpXSpec': tblpXSpec || null,
  1062. 'tblpYSpec': tblpYSpec || null
  1063. };
  1064. var oo_tblpPr = this.createEl(oo_doc, 'tblpPr');
  1065. this.setAttrs(oo_tblpPr, o);
  1066. oo_tblPr.appendChild(oo_tblpPr);
  1067. floatTable = true;
  1068. }
  1069. //表格背景
  1070. var bg = table.getStyle('background-color');
  1071. if (bg && bg !== 'transparent') {
  1072. bg = this.getColorHex(bg);
  1073. if (bg !== 'transparent') {
  1074. var oo_shd = this.createEl(oo_doc, 'shd');
  1075. this.setAttrs(oo_shd, {'val': 'clear', 'color': 'auto', 'fill': bg});
  1076. oo_tblPr.appendChild(oo_shd);
  1077. }
  1078. }
  1079. //表格必须使用固定宽度表格布局算法
  1080. //<w:tblLayout w:type="fixed"/>;
  1081. var oo_tblLayout = this.createEl(oo_doc, 'tblLayout');
  1082. this.setAttrs(oo_tblLayout, {'type': 'fixed'});
  1083. oo_tblPr.appendChild(oo_tblLayout);
  1084. oo_tbl.appendChild(oo_tblPr);
  1085. //表格网格
  1086. var grids = this.getTableTblGrid(table);
  1087. var oo_tblGrid = this.createEl(oo_doc, 'tblGrid');
  1088. grids.forEach(function (grid) {
  1089. var oo_gridCol = this.createEl(oo_doc, 'gridCol');
  1090. if (grid) this.setAttrs(oo_gridCol, {'w': grid * 20});
  1091. oo_tblGrid.appendChild(oo_gridCol);
  1092. }.bind(this));
  1093. oo_tbl.appendChild(oo_tblGrid);
  1094. var vmge = {};
  1095. var trs = table.rows;
  1096. for (var i = 0; i < trs.length; i++) {
  1097. var tr = trs[i];
  1098. if (!tr.hasClass('doc_layout_seal_position') || tr.querySelector('img')) {
  1099. var oo_tr = this.createEl(oo_doc, 'tr');
  1100. var oo_trPr = this.createEl(oo_doc, 'trPr');
  1101. oo_tr.appendChild(oo_trPr);
  1102. //行高度 设置模板中table的 data-compute-tr-height 为 y 时计算
  1103. if (table.dataset.computeTrHeight === 'y') {
  1104. var oo_trH = this.createEl(oo_doc, 'trHeight');
  1105. var trH = this.getTableTrH(tr);
  1106. this.setAttrs(oo_trH, trH);
  1107. oo_trPr.appendChild(oo_trH);
  1108. }
  1109. if (floatTable) {
  1110. // var oo_trPr = this.createEl(oo_doc, "trPr");
  1111. var oo_cantSplit = this.createEl(oo_doc, 'cantSplit');
  1112. var oo_tblHeader = this.createEl(oo_doc, 'tblHeader');
  1113. oo_trPr.appendChild(oo_cantSplit);
  1114. oo_trPr.appendChild(oo_tblHeader);
  1115. }
  1116. var tdIdx = 0;
  1117. //垂直合并单元格
  1118. var nextIdx = tdIdx;
  1119. var mge = vmge['td' + nextIdx];
  1120. while (mge) {
  1121. // if (mge.idx>0){
  1122. vmge['td' + nextIdx].idx--;
  1123. var tcPr = vmge['td' + nextIdx].tcPr;
  1124. var oo_mtc = this.createEl(oo_doc, 'tc');
  1125. if (tcPr) {
  1126. var oo_mtcPr = tcPr.cloneNode(true);
  1127. var oo_mvMerge = oo_mtcPr.querySelector('vMerge');
  1128. if (oo_mvMerge) oo_mvMerge.destroy();
  1129. oo_mvMerge = this.createEl(oo_doc, 'vMerge');
  1130. oo_mtcPr.appendChild(oo_mvMerge);
  1131. if (mge.colspan && mge.colspan!='null'){
  1132. nextIdx = nextIdx + (parseInt(mge.colspan) - 1);
  1133. // tdIdx = tdIdx + (parseInt(mge.colspan) - 1);
  1134. var oo_gridSpan = this.createEl(oo_doc, 'gridSpan');
  1135. this.setAttrs(oo_gridSpan, {'val': mge.colspan});
  1136. oo_mtcPr.appendChild(oo_gridSpan);
  1137. }
  1138. oo_mtc.appendChild(oo_mtcPr);
  1139. } else {
  1140. var oo_mtcPr = this.createEl(oo_doc, 'tcPr');
  1141. var oo_mvMerge = this.createEl(oo_doc, 'vMerge');
  1142. oo_mtcPr.appendChild(oo_mvMerge);
  1143. if (mge.colspan && mge.colspan!='null'){
  1144. nextIdx = nextIdx + (parseInt( mge.colspan) - 1);
  1145. // tdIdx = tdIdx + (parseInt( mge.colspan) - 1);
  1146. var oo_gridSpan = this.createEl(oo_doc, 'gridSpan');
  1147. this.setAttrs(oo_gridSpan, {'val': mge.colspan});
  1148. oo_mtcPr.appendChild(oo_gridSpan);
  1149. }
  1150. oo_mtc.appendChild(oo_mtcPr);
  1151. }
  1152. // var oo_mtc = this.createEl(oo_doc, "tc");
  1153. // var oo_mtcPr = this.createEl(oo_doc, "tcPr");
  1154. // var oo_mvMerge = this.createEl(oo_doc, "vMerge");
  1155. // oo_mtcPr.appendChild(oo_mvMerge);
  1156. // oo_mtc.appendChild(oo_mtcPr);
  1157. var oo_mp = this.createEl(oo_doc, 'p');
  1158. oo_mtc.appendChild(oo_mp);
  1159. oo_tr.appendChild(oo_mtc);
  1160. if (vmge['td' + tdIdx].idx < 1) delete vmge['td' + tdIdx];
  1161. nextIdx++;
  1162. tdIdx = nextIdx;
  1163. mge = vmge['td' + nextIdx];
  1164. // }
  1165. // tdIdx++;
  1166. }
  1167. // tdIdx--;
  1168. var tds = tr.cells;
  1169. for (var j = 0; j < tds.length; j++) {
  1170. var td = tds[j];
  1171. var oo_tc = this.createEl(oo_doc, 'tc');
  1172. var oo_tcPr = this.createEl(oo_doc, 'tcPr');
  1173. //单元格宽度
  1174. var oo_tcW = this.createEl(oo_doc, 'tcW');
  1175. var tcW = this.getTableTblW(td);
  1176. this.setAttrs(oo_tcW, tcW);
  1177. //this.setAttrs(oo_tcW, {"w": this.pxToPt(td.clientWidth)*20, "type": "dxa"});
  1178. oo_tcPr.appendChild(oo_tcW);
  1179. // //单元格垂直对齐
  1180. // var valign = td.get('valign');
  1181. // v = (valign!=='top' && valign!=='bottom') ? 'center' : valign;
  1182. // var oo_vAlign = this.createEl(oo_doc, "vAlign");
  1183. // this.setAttrs(oo_vAlign, {'val': v})
  1184. // // <w:vAlign w:val="center"/>
  1185. // oo_tcPr.appendChild(oo_vAlign);
  1186. //单元格边框
  1187. var oo_tcBorders = this.createEl(oo_doc, 'tcBorders');
  1188. var oo_top = this.createEl(oo_doc, 'top');
  1189. this.setAttrs(oo_top, this.getTableBorder(td, 'top'));
  1190. var oo_start = this.createEl(oo_doc, 'start');
  1191. this.setAttrs(oo_start, this.getTableBorder(td, 'left'));
  1192. var oo_bottom = this.createEl(oo_doc, 'bottom');
  1193. this.setAttrs(oo_bottom, this.getTableBorder(td, 'bottom'));
  1194. var oo_end = this.createEl(oo_doc, 'end');
  1195. this.setAttrs(oo_end, this.getTableBorder(td, 'right'));
  1196. this.insertSiblings(oo_tcBorders, [oo_top, oo_start, oo_bottom, oo_end], 'beforeend');
  1197. oo_tcPr.appendChild(oo_tcBorders);
  1198. //单元格背景
  1199. var bg = td.getStyle('background-color');
  1200. if (bg && bg !== 'transparent') {
  1201. bg = this.getColorHex(bg);
  1202. if (bg !== 'transparent') {
  1203. var oo_shd = this.createEl(oo_doc, 'shd');
  1204. this.setAttrs(oo_shd, {'val': 'clear', 'color': 'auto', 'fill': bg});
  1205. oo_tcPr.appendChild(oo_shd);
  1206. }
  1207. }
  1208. //单元格边距
  1209. var left = td.getStyle('padding-left');
  1210. var right = td.getStyle('padding-right');
  1211. var top = td.getStyle('padding-top');
  1212. var bottom = td.getStyle('padding-bottom');
  1213. left = (left) ? this.pxToPt(left) * 20 : 0;
  1214. right = (right) ? this.pxToPt(right) * 20 : 0;
  1215. top = (top) ? this.pxToPt(top) * 20 : 0;
  1216. bottom = (bottom) ? this.pxToPt(bottom) * 20 : 0;
  1217. var oo_tcMar = this.createEl(oo_doc, 'tcMar');
  1218. var oo_mar = this.createEl(oo_doc, 'start');
  1219. this.setAttrs(oo_mar, {'type': 'dxa', 'w': left});
  1220. oo_tcMar.appendChild(oo_mar);
  1221. oo_mar = this.createEl(oo_doc, 'end');
  1222. this.setAttrs(oo_mar, {'type': 'dxa', 'w': right});
  1223. oo_tcMar.appendChild(oo_mar);
  1224. oo_mar = this.createEl(oo_doc, 'top');
  1225. this.setAttrs(oo_mar, {'type': 'dxa', 'w': top});
  1226. oo_tcMar.appendChild(oo_mar);
  1227. oo_mar = this.createEl(oo_doc, 'bottom');
  1228. this.setAttrs(oo_mar, {'type': 'dxa', 'w': bottom});
  1229. oo_tcMar.appendChild(oo_mar);
  1230. oo_tcPr.appendChild(oo_tcMar);
  1231. var v = this.getTdValign(td);
  1232. if (v) {
  1233. var oo_vAlign = this.createEl(oo_doc, 'vAlign');
  1234. this.setAttrs(oo_vAlign, {'val': v});
  1235. oo_tcPr.appendChild(oo_vAlign);
  1236. }
  1237. var oo_hideMark = this.createEl(oo_doc, 'hideMark');
  1238. oo_tcPr.appendChild(oo_hideMark);
  1239. //垂直合并单元格
  1240. var colspan = td.get('colspan');
  1241. var rowspan = td.get('rowspan');
  1242. if (rowspan && parseInt(rowspan) > 1) {
  1243. vmge['td' + tdIdx] = {
  1244. 'tcPr': oo_tcPr,
  1245. 'idx': parseInt(rowspan) - 1,
  1246. 'colspan': (colspan && colspan!=='null') ? colspan : null
  1247. };
  1248. var oo_vMerge = this.createEl(oo_doc, 'vMerge');
  1249. this.setAttrs(oo_vMerge, {'val': 'restart'});
  1250. oo_tcPr.appendChild(oo_vMerge);
  1251. }
  1252. //水平合并单元格
  1253. if (colspan && parseInt(colspan) > 1) {
  1254. tdIdx = tdIdx + (parseInt(colspan) - 1);
  1255. var oo_gridSpan = this.createEl(oo_doc, 'gridSpan');
  1256. this.setAttrs(oo_gridSpan, {'val': colspan});
  1257. oo_tcPr.appendChild(oo_gridSpan);
  1258. }
  1259. oo_tc.appendChild(oo_tcPr);
  1260. //表格内容;
  1261. this.processTableDom(td, oo_tc, td, true, oo_tc);
  1262. var pflag = false;
  1263. var node = oo_tc.firstChild;
  1264. while (node) {
  1265. if (node.tagName === 'w:p') {
  1266. pflag = true;
  1267. break;
  1268. }
  1269. node = node.nextSibling;
  1270. }
  1271. if (!pflag) {
  1272. var oo_p = this.createEl(oo_doc, 'p');
  1273. oo_tc.appendChild(oo_p);
  1274. }
  1275. oo_tr.appendChild(oo_tc);
  1276. //垂直合并单元格
  1277. tdIdx++;
  1278. var nextIdx = tdIdx;
  1279. var mge = vmge['td' + nextIdx];
  1280. while (mge) {
  1281. vmge['td' + nextIdx].idx--;
  1282. var tcPr = vmge['td' + nextIdx].tcPr;
  1283. var oo_mtc = this.createEl(oo_doc, 'tc');
  1284. if (tcPr) {
  1285. var oo_mtcPr = tcPr.cloneNode(true);
  1286. var oo_mvMerge = oo_mtcPr.querySelector('vMerge');
  1287. if (oo_mvMerge) oo_mvMerge.destroy();
  1288. oo_mvMerge = this.createEl(oo_doc, 'vMerge');
  1289. oo_mtcPr.appendChild(oo_mvMerge);
  1290. if (mge.colspan && mge.colspan!='null'){
  1291. nextIdx = nextIdx + (parseInt( mge.colspan) - 1);
  1292. // tdIdx = tdIdx + (parseInt( mge.colspan) - 1);
  1293. var oo_gridSpan = this.createEl(oo_doc, 'gridSpan');
  1294. this.setAttrs(oo_gridSpan, {'val': mge.colspan});
  1295. oo_mtcPr.appendChild(oo_gridSpan);
  1296. }
  1297. oo_mtc.appendChild(oo_mtcPr);
  1298. } else {
  1299. var oo_mtcPr = this.createEl(oo_doc, 'tcPr');
  1300. var oo_mvMerge = this.createEl(oo_doc, 'vMerge');
  1301. oo_mtcPr.appendChild(oo_mvMerge);
  1302. if (mge.colspan && mge.colspan!='null'){
  1303. nextIdx = nextIdx + (parseInt( mge.colspan) - 1);
  1304. // tdIdx = tdIdx + (parseInt( mge.colspan) - 1);
  1305. var oo_gridSpan = this.createEl(oo_doc, 'gridSpan');
  1306. this.setAttrs(oo_gridSpan, {'val': mge.colspan});
  1307. oo_mtcPr.appendChild(oo_gridSpan);
  1308. }
  1309. oo_mtc.appendChild(oo_mtcPr);
  1310. }
  1311. var oo_mp = this.createEl(oo_doc, 'p');
  1312. oo_mtc.appendChild(oo_mp);
  1313. oo_tr.appendChild(oo_mtc);
  1314. if (vmge['td' + tdIdx].idx < 1) delete vmge['td' + tdIdx];
  1315. nextIdx++;
  1316. mge = vmge['td' + nextIdx];
  1317. }
  1318. // if (colspan && parseInt(colspan) > 1) {
  1319. // if (vmge['td' + tdIdx]) {
  1320. // vmge['td' + tdIdx].idx = (vmge['td' + tdIdx].idx) * parseInt(colspan);
  1321. // for (var n = 1; n < parseInt(colspan); n++) {
  1322. // var m = tdIdx + n;
  1323. // rowspan[m] = vmge['td' + tdIdx];
  1324. // }
  1325. // }
  1326. // }
  1327. tdIdx = nextIdx - 1;
  1328. tdIdx++;
  1329. }
  1330. oo_tbl.appendChild(oo_tr);
  1331. }
  1332. }
  1333. if (append) {
  1334. oo_body.appendChild(oo_tbl);
  1335. } else {
  1336. var oo_sectPr = this.getEl(oo_body, 'sectPr');
  1337. if (oo_sectPr) {
  1338. this.insertSiblings(oo_sectPr, [oo_tbl], 'beforebegin');
  1339. } else {
  1340. this.insertChildren(oo_body, [oo_tbl]);
  1341. }
  1342. }
  1343. },
  1344. pxToPt: function(px){
  1345. if (!px) return 0;
  1346. var v = px;
  1347. if (px && o2.typeOf(px)==="string"){
  1348. u = px.substring(px.length-2, px.length);
  1349. if (u.toLowerCase()!=="pt"){
  1350. v = (px.toFloat()/this.dpi)*72;
  1351. }else{
  1352. v = px.toFloat();
  1353. }
  1354. }else{
  1355. v = (px.toFloat()/this.dpi)*72;
  1356. }
  1357. return v;
  1358. },
  1359. setPics: function(img){
  1360. if (!this.pics || !this.pics.length) this.pics = [];
  1361. this.pics.push(img.src);
  1362. },
  1363. processPic: function(img, oo_p, append){
  1364. if (!img.src) return "";
  1365. this.setPics(img);
  1366. var idx = this.rid;
  1367. this.rid++;
  1368. var oo_doc = oo_p.ownerDocument;
  1369. //
  1370. // var oo_p = this.createParagraph(oo_doc, {});
  1371. // if (append){
  1372. // oo_body.appendChild(oo_p);
  1373. // }else{
  1374. // var oo_sectPr = this.getEl(oo_body, "sectPr");
  1375. // if (oo_sectPr){
  1376. // this.insertSiblings(oo_sectPr, [oo_p], "beforebegin");
  1377. // }else{
  1378. // this.insertChildren(oo_body, [oo_p]);
  1379. // }
  1380. // }
  1381. var oo_run = this.createRun(oo_doc, {"rPrs": {"noProof":{}}});
  1382. var oo_drawing = this.createEl(oo_doc, "drawing");
  1383. var msoStyle = this.getMsoStyle(img);
  1384. var position = img.getStyle("position");
  1385. var p = (msoStyle["mso-position-vertical"]==="absolute") ? "anchor" : "inline";
  1386. var oo_position;
  1387. if (p==="anchor"){
  1388. //var pos = img.getPosition(img.getParent(".WordSection1"));
  1389. //var pos = img.getPosition();
  1390. var positionV = this.pxToPt(msoStyle["mso-top"]);
  1391. var positionH = this.pxToPt(msoStyle["mso-left"]);
  1392. if (!positionV || !positionH){
  1393. var pos = img.getPosition(img.getOffsetParent());
  1394. if (!positionH) positionH = this.pxToPt(pos.x);
  1395. if (!positionV) positionV = this.pxToPt(pos.y);
  1396. }
  1397. positionH = (positionH*12700).toInt();
  1398. positionV = (positionV*12700).toInt();
  1399. var oo_anchor = this.createEl(oo_doc, "anchor", "wp");
  1400. var behindDoc = (msoStyle["mso-behinddoc"]=="true") ? "1" : "0";
  1401. this.setAttrs(oo_anchor, {
  1402. "distT": "0", "distB": "0", "distL": "0", "distR": "0", "simplePos": "0","behindDoc": behindDoc, "relativeHeight": "500", "locked": "0", "layoutInCell":"1", "allowOverlap": "0"
  1403. }, false);
  1404. oo_run.appendChild(oo_drawing);
  1405. oo_drawing.appendChild(oo_anchor);
  1406. var oo_simplePos = this.createEl(oo_doc, "simplePos", "wp");
  1407. this.setAttrs(oo_simplePos, {"x": "0", "y": "0"}, false);
  1408. var relativeFrom = msoStyle["mso-position-horizontal-relative"] || "margin";
  1409. var oo_positionH = this.createEl(oo_doc, "positionH", "wp");
  1410. this.setAttrs(oo_positionH, {"relativeFrom": relativeFrom}, false);
  1411. var oo_posOffset = this.createEl(oo_doc, "posOffset", "wp");
  1412. oo_posOffset.appendChild(oo_doc.createTextNode(positionH));
  1413. oo_positionH.appendChild(oo_posOffset);
  1414. relativeFrom = msoStyle["mso-position-vertical-relative"] || "margin";
  1415. var oo_positionV = this.createEl(oo_doc, "positionV", "wp");
  1416. this.setAttrs(oo_positionV, {"relativeFrom": relativeFrom}, false);
  1417. var oo_posOffset = this.createEl(oo_doc, "posOffset", "wp");
  1418. oo_posOffset.appendChild(oo_doc.createTextNode(positionV)); //此处需要根据行高来设置数值,暂时固定数值
  1419. oo_positionV.appendChild(oo_posOffset);
  1420. oo_position = oo_anchor;
  1421. this.insertSiblings(oo_position, [oo_simplePos, oo_positionH, oo_positionV], "beforeend");
  1422. }else{
  1423. var oo_inline = this.createEl(oo_doc, "inline", "wp");
  1424. this.setAttrs(oo_inline, {
  1425. "distT": "0", "distB": "0", "distL": "0", "distR": "0"
  1426. }, false);
  1427. oo_run.appendChild(oo_drawing);
  1428. oo_drawing.appendChild(oo_inline);
  1429. oo_position = oo_inline;
  1430. }
  1431. var oo_extent = this.createEl(oo_doc, "extent", "wp");
  1432. var cx = this.pxToPt(img.clientWidth)*12700;
  1433. var cy = this.pxToPt(img.clientHeight)*12700;
  1434. this.setAttrs(oo_extent, {"cx": cx, "cy": cy}, false); //(pt*12700)
  1435. var oo_effectExtent = this.createEl(oo_doc, "effectExtent", "wp");
  1436. this.setAttrs(oo_effectExtent, {"l": "0", "t": "0", "r": "0", "b": "0"}, false);
  1437. var oo_wrapNone = this.createEl(oo_doc, "wrapNone", "wp");
  1438. var oo_docPr = this.createEl(oo_doc, "docPr", "wp");
  1439. id = (Math.random()*100).toInt();
  1440. this.setAttrs(oo_docPr, {"id": id, "name": "PIC"+id}, false); //id设置随机整数
  1441. var oo_cNvGraphicFramePr = this.createEl(oo_doc, "cNvGraphicFramePr", "wp");
  1442. var oo_graphicFrameLocks = this.createEl(oo_doc, "graphicFrameLocks", "a");
  1443. this.setAttrs(oo_graphicFrameLocks, {"noChangeAspect": "1"}, false);
  1444. oo_cNvGraphicFramePr.appendChild(oo_graphicFrameLocks);
  1445. this.insertSiblings(oo_position, [oo_extent, oo_effectExtent, oo_wrapNone, oo_docPr, oo_cNvGraphicFramePr], "beforeend");
  1446. var oo_graphic = this.createEl(oo_doc, "graphic", "a");
  1447. var oo_graphicData = this.createEl(oo_doc, "graphicData", "a");
  1448. this.setAttrs(oo_graphicData, {"uri": "http://schemas.openxmlformats.org/drawingml/2006/picture"}, false);
  1449. var oo_pic = this.createEl(oo_doc, "pic", "pic");
  1450. this.insertChildren(oo_position, [oo_graphic, oo_graphicData, oo_pic], "beforeend");
  1451. var oo_nvPicPr = this.createEl(oo_doc, "nvPicPr", "pic");
  1452. var oo_cNvPr = this.createEl(oo_doc, "cNvPr", "pic");
  1453. this.setAttrs(oo_cNvPr, {"id": id, "name": "PIC"+id}, false);
  1454. var oo_cNvPicPr = this.createEl(oo_doc, "cNvPicPr", "pic");
  1455. oo_nvPicPr.appendChild(oo_cNvPr);
  1456. oo_nvPicPr.appendChild(oo_cNvPicPr);
  1457. oo_pic.appendChild(oo_nvPicPr);
  1458. var oo_blipFill = this.createEl(oo_doc, "blipFill", "pic");
  1459. var oo_blip = this.createEl(oo_doc, "blip", "a");
  1460. this.setAttrs(oo_blip, {"embed": "rId"+idx}, "r");
  1461. this.setAttrs(oo_blip, {"cstate": "print"}, false);
  1462. var oo_extLst = this.createEl(oo_doc, "extLst", "a");
  1463. var oo_ext = this.createEl(oo_doc, "ext", "a");
  1464. this.setAttrs(oo_ext, {"uri": "{28A0092B-C50C-407E-A947-70E740481C1C}"}, false);
  1465. var oo_useLocalDpi = this.createEl(oo_doc, "useLocalDpi", "a14");
  1466. this.setAttrs(oo_useLocalDpi, {"val": "0"}, false);
  1467. oo_ext.appendChild(oo_useLocalDpi);
  1468. oo_extLst.appendChild(oo_ext);
  1469. oo_blip.appendChild(oo_extLst);
  1470. oo_blipFill.appendChild(oo_blip);
  1471. var oo_stretch = this.createEl(oo_doc, "stretch", "a");
  1472. var oo_fillRect = this.createEl(oo_doc, "fillRect", "a");
  1473. oo_stretch.appendChild(oo_fillRect);
  1474. oo_blipFill.appendChild(oo_stretch);
  1475. oo_pic.appendChild(oo_blipFill);
  1476. var oo_spPr = this.createEl(oo_doc, "spPr", "pic");
  1477. var oo_xfrm = this.createEl(oo_doc, "xfrm", "a");
  1478. var oo_off = this.createEl(oo_doc, "off", "a");
  1479. this.setAttrs(oo_off, {"x": "0", "y": "0"}, false);
  1480. var oo_ext = this.createEl(oo_doc, "ext", "a");
  1481. this.setAttrs(oo_ext, {"cx": cx, "cy": cy}, false);
  1482. oo_xfrm.appendChild(oo_off);
  1483. oo_xfrm.appendChild(oo_ext);
  1484. oo_spPr.appendChild(oo_xfrm);
  1485. var oo_prstGeom = this.createEl(oo_doc, "prstGeom", "a");
  1486. this.setAttrs(oo_prstGeom, {"prst": "rect"}, false);
  1487. var oo_avLst = this.createEl(oo_doc, "avLst", "a");
  1488. oo_prstGeom.appendChild(oo_avLst);
  1489. oo_spPr.appendChild(oo_prstGeom);
  1490. oo_pic.appendChild(oo_spPr);
  1491. // " <pic:blipFill>\n" +
  1492. // " <a:blip r:embed=\"rId4\" cstate=\"print\">\n" +
  1493. // " <a:extLst>\n" +
  1494. // " <a:ext uri=\"{28A0092B-C50C-407E-A947-70E740481C1C}\">\n" +
  1495. // " <a14:useLocalDpi xmlns:a14=\"http://schemas.microsoft.com/office/drawing/2010/main\" val=\"0\"/>\n" +
  1496. // " </a:ext>\n" +
  1497. // " </a:extLst>\n" +
  1498. // " </a:blip>\n" +
  1499. // " <a:stretch>\n" +
  1500. // " <a:fillRect/>\n" +
  1501. // " </a:stretch>\n" +
  1502. // " </pic:blipFill>\n" +
  1503. // " <pic:spPr>\n" +
  1504. // " <a:xfrm>\n" +
  1505. // " <a:off x=\"0\" y=\"0\"/>\n" +
  1506. // " <a:ext cx=\""+cx+"\" cy=\""+cy+"\"/>\n" +
  1507. // " </a:xfrm>\n" +
  1508. // " <a:prstGeom prst=\"rect\">\n" +
  1509. // " <a:avLst/>\n" +
  1510. // " </a:prstGeom>\n" +
  1511. // " </pic:spPr>";
  1512. //
  1513. // //oo_pic.appendHTML(inner, "top");
  1514. // oo_pic.innerHTML = inner;
  1515. oo_p.appendChild(oo_run);
  1516. },
  1517. processHr: function(hr, oo_body, append){
  1518. var oo_doc = oo_body.ownerDocument;
  1519. var oo_p = this.createParagraph(oo_doc, {
  1520. "pPrs": {
  1521. "spacing": {
  1522. "lineRule": "exact",
  1523. "line": "40" //段落行高设置为固定值2pt
  1524. }
  1525. }
  1526. });
  1527. if (append){
  1528. oo_body.appendChild(oo_p);
  1529. }else{
  1530. var oo_sectPr = this.getEl(oo_body, "sectPr");
  1531. if (oo_sectPr){
  1532. this.insertSiblings(oo_sectPr, [oo_p], "beforebegin");
  1533. }else{
  1534. this.insertChildren(oo_body, [oo_p]);
  1535. }
  1536. }
  1537. var oo_run = this.createRun(oo_doc, {"rPrs": {"noProof":{}}});
  1538. var oo_drawing = this.createEl(oo_doc, "drawing");
  1539. var oo_anchor = this.createEl(oo_doc, "anchor", "wp");
  1540. this.setAttrs(oo_anchor, {
  1541. "distT": "0", "distB": "0", "distL": "0", "distR": "0", "simplePos": "false","behindDoc": "false","relativeHeight": "500", "locked": "false", "layoutInCell":"true", "allowOverlap": "false"
  1542. }, false);
  1543. oo_run.appendChild(oo_drawing);
  1544. oo_drawing.appendChild(oo_anchor);
  1545. var oo_simplePos = this.createEl(oo_doc, "simplePos", "wp");
  1546. this.setAttrs(oo_simplePos, {"x": "0", "y": "0"}, false);
  1547. var oo_positionH = this.createEl(oo_doc, "positionH", "wp");
  1548. this.setAttrs(oo_positionH, {"relativeFrom": "column"}, false);
  1549. var oo_posOffset = this.createEl(oo_doc, "posOffset", "wp");
  1550. oo_posOffset.appendChild(oo_doc.createTextNode("0"));
  1551. oo_positionH.appendChild(oo_posOffset);
  1552. var oo_positionV = this.createEl(oo_doc, "positionV", "wp");
  1553. this.setAttrs(oo_positionV, {"relativeFrom": "paragraph"}, false);
  1554. var oo_posOffset = this.createEl(oo_doc, "posOffset", "wp");
  1555. oo_posOffset.appendChild(oo_doc.createTextNode("3810")); //此处需要根据行高来设置数值,暂时固定数值
  1556. oo_positionV.appendChild(oo_posOffset);
  1557. var oo_extent = this.createEl(oo_doc, "extent", "wp");
  1558. var cx = this.pxToPt(hr.clientWidth)*12700;
  1559. this.setAttrs(oo_extent, {"cx": cx, "cy": "0"}, false); //cx为线长度(pt*12700)
  1560. var oo_effectExtent = this.createEl(oo_doc, "effectExtent", "wp");
  1561. this.setAttrs(oo_effectExtent, {"l": "0", "t": "0", "r": "0", "b": "0"}, false);
  1562. var oo_wrapNone = this.createEl(oo_doc, "wrapNone", "wp");
  1563. var oo_docPr = this.createEl(oo_doc, "docPr", "wp");
  1564. id = (Math.random()*100).toInt();
  1565. this.setAttrs(oo_docPr, {"id": id, "name": "Red Line"}, false); //id设置随机整数
  1566. var oo_cNvGraphicFramePr = this.createEl(oo_doc, "cNvGraphicFramePr", "wp");
  1567. this.insertSiblings(oo_anchor, [oo_simplePos, oo_positionH, oo_positionV, oo_extent, oo_effectExtent, oo_wrapNone, oo_docPr, oo_cNvGraphicFramePr], "beforeend");
  1568. var oo_graphic = this.createEl(oo_doc, "graphic", "a");
  1569. var oo_graphicData = this.createEl(oo_doc, "graphicData", "a");
  1570. this.setAttrs(oo_graphicData, {"uri": "http://schemas.microsoft.com/office/word/2010/wordprocessingShape"}, false);
  1571. var oo_wsp = this.createEl(oo_doc, "wsp", "wps");
  1572. this.insertChildren(oo_anchor, [oo_graphic, oo_graphicData, oo_wsp], "beforeend");
  1573. var oo_cNvCnPr = this.createEl(oo_doc, "cNvCnPr", "wps");
  1574. var oo_spPr = this.createEl(oo_doc, "spPr", "wps")
  1575. var oo_xfrm = this.createEl(oo_doc, "xfrm", "a");
  1576. var oo_off = this.createEl(oo_doc, "off", "a");
  1577. this.setAttrs(oo_off, {"x": "0", "y": "0"}, false);
  1578. var oo_ext = this.createEl(oo_doc, "ext", "a");
  1579. this.setAttrs(oo_ext, {"cx": cx, "cy": "0"}, false);
  1580. this.insertSiblings(oo_xfrm, [oo_off, oo_ext], "beforeend");
  1581. var oo_prstGeom = this.createEl(oo_doc, "prstGeom", "a");
  1582. this.setAttrs(oo_prstGeom, {"prst": "line"}, false);
  1583. var oo_avLst = this.createEl(oo_doc, "avLst", "a");
  1584. oo_prstGeom.appendChild(oo_avLst);
  1585. var oo_ln = this.createEl(oo_doc, "ln", "a");
  1586. var w = this.pxToPt(hr.clientHeight)*12700;
  1587. this.setAttrs(oo_ln, {"w": w}, false); //线的粗细 pt*12700
  1588. var oo_solidFill = this.createEl(oo_doc, "solidFill", "a");
  1589. var oo_srgbClr = this.createEl(oo_doc, "srgbClr", "a");
  1590. var color = this.getColorHex(hr.get("color"));
  1591. if (!color) color = this.getColorHex(hr.getStyle("background-color"));
  1592. if (!color) color = "FF0000";
  1593. this.setAttrs(oo_srgbClr, {"val": color}, false); //line color
  1594. oo_solidFill.appendChild(oo_srgbClr);
  1595. oo_ln.appendChild(oo_solidFill);
  1596. this.insertSiblings(oo_spPr, [oo_xfrm, oo_prstGeom, oo_ln], "beforeend");
  1597. var oo_style = this.createEl(oo_doc, "style", "wps");
  1598. //oo_style.innerHTML = '<a:lnRef idx="1"><a:schemeClr val="accent1"/></a:lnRef><a:fillRef idx="0"><a:schemeClr val="accent1"/></a:fillRef><a:effectRef idx="0"><a:schemeClr val="accent1"/></a:effectRef><a:fontRef idx="minor"><a:schemeClr val="tx1"/></a:fontRef>';
  1599. var oo_lnRef = this.createEl(oo_doc, "lnRef", "a");
  1600. this.setAttrs(oo_lnRef, {"idx": "1"}, false);
  1601. var oo_schemeClr = this.createEl(oo_doc, "schemeClr", "a");
  1602. this.setAttrs(oo_schemeClr, {"val": "accent1"}, false);
  1603. oo_lnRef.appendChild(oo_schemeClr);
  1604. var oo_fillRef = this.createEl(oo_doc, "fillRef", "a");
  1605. this.setAttrs(oo_fillRef, {"idx": "0"}, false);
  1606. var oo_schemeClr = this.createEl(oo_doc, "schemeClr", "a");
  1607. this.setAttrs(oo_schemeClr, {"val": "accent1"}, false);
  1608. oo_fillRef.appendChild(oo_schemeClr);
  1609. var oo_effectRef = this.createEl(oo_doc, "effectRef", "a");
  1610. this.setAttrs(oo_effectRef, {"idx": "0"}, false);
  1611. var oo_schemeClr = this.createEl(oo_doc, "schemeClr", "a");
  1612. this.setAttrs(oo_schemeClr, {"val": "accent1"}, false);
  1613. oo_effectRef.appendChild(oo_schemeClr);
  1614. var oo_fontRef = this.createEl(oo_doc, "fontRef", "a");
  1615. this.setAttrs(oo_fontRef, {"idx": "minor"}, false);
  1616. var oo_schemeClr = this.createEl(oo_doc, "schemeClr", "a");
  1617. this.setAttrs(oo_schemeClr, {"val": "tx1"}, false);
  1618. oo_fontRef.appendChild(oo_schemeClr);
  1619. this.insertSiblings(oo_style, [oo_lnRef, oo_fillRef, oo_effectRef, oo_fontRef], "beforeend");
  1620. var oo_bodyPr = this.createEl(oo_doc, "bodyPr", "wps");
  1621. this.insertSiblings(oo_wsp, [oo_cNvCnPr, oo_spPr, oo_style, oo_bodyPr], "beforeend");
  1622. var w = hr.style.width;
  1623. if (w && o2.typeOf(w)==="string"){
  1624. var u = w.substring(w.length-1, w.length);
  1625. if (u==="%"){
  1626. w = w.toFloat()*1000;
  1627. var oo_sizeRelH = this.createEl(oo_doc, "sizeRelH", "wp14");
  1628. this.setAttrs(oo_sizeRelH, {"relativeFrom": "margin"}, false);
  1629. var oo_pctWidth = this.createEl(oo_doc, "pctWidth", "wp14");
  1630. oo_pctWidth.appendChild(oo_doc.createTextNode(w));
  1631. oo_sizeRelH.appendChild(oo_pctWidth);
  1632. oo_anchor.appendChild(oo_sizeRelH);
  1633. }
  1634. }
  1635. oo_p.appendChild(oo_run);
  1636. },
  1637. processRunFont: function(node, rPrs, font){
  1638. //字体处理缩放
  1639. var msoStyle = this.getMsoStyle(node);
  1640. if (msoStyle["mso-font-width"]) rPrs.w = {"val": msoStyle["mso-font-width"].toFloat()};
  1641. //处理字号
  1642. if (msoStyle["mso-ansi-font-size"]) rPrs.sz = {"val": this.parseFontSize(msoStyle["mso-ansi-font-size"])*2};
  1643. if (msoStyle["mso-hansi-font-size"]) rPrs.sz = {"val": this.parseFontSize(msoStyle["mso-hansi-font-size"])*2};
  1644. if (msoStyle["mso-font-size"]) rPrs.sz = {"val": this.parseFontSize(msoStyle["mso-font-size"])*2};
  1645. if (msoStyle["mso-fareast-font-size"]) rPrs.sz = {"val": this.parseFontSize(msoStyle["mso-fareast-font-size"])*2};
  1646. //处理字体
  1647. if (msoStyle["mso-ansi-font-family"]){
  1648. if (!font) font = { "hint": "eastAsia" };
  1649. font.ascii = this.parseFont(msoStyle["mso-ansi-font-family"]);
  1650. }
  1651. if (msoStyle["mso-hansi-font-family"]){
  1652. if (!font) font = { "hint": "eastAsia" };
  1653. font.hAnsi = this.parseFont(msoStyle["mso-hansi-font-family"]);
  1654. }
  1655. if (msoStyle["mso-font-family"]){
  1656. if (!font) font = { "hint": "eastAsia" };
  1657. font.eastAsia = this.parseFont(msoStyle["mso-font-family"]);
  1658. }
  1659. if (msoStyle["mso-fareast-font-family"]){
  1660. if (!font) font = { "hint": "eastAsia" };
  1661. font.eastAsia = this.parseFont(msoStyle["mso-fareast-font-family"]);
  1662. }
  1663. },
  1664. parseFont: function(name){
  1665. if (name.substr(0, 1)==="\""){
  1666. return name.substr(1, name.length-2);
  1667. }else{
  1668. return name;
  1669. }
  1670. },
  1671. parseFontSize: function(sz){
  1672. var size = sz;
  1673. if (size && o2.typeOf(size)==="string"){
  1674. u = size.substring(size.length-2, size.length);
  1675. if (u.toLowerCase()!=="pt"){
  1676. size = Math.round(this.pxToPt(size));
  1677. }
  1678. }
  1679. return size.toFloat();
  1680. },
  1681. processRun: function(span, oo_p, p, text, br){
  1682. var rPrs = {"noProof": {}};
  1683. var font = null;
  1684. var styles = span.getStyles("font-size", "color", "letter-spacing", "font-weight", "font-family", "line-height");
  1685. var keys = Object.keys(styles);
  1686. var msoStyle = this.getMsoStyle(span);
  1687. styles["font-size"] = window.getComputedStyle(span).fontSize;
  1688. for (var i = 0; i<keys.length; i++){
  1689. switch (keys[i]){
  1690. case "font-size":
  1691. rPrs.sz = {"val": this.parseFontSize(styles["font-size"])*2};
  1692. break;
  1693. case "color":
  1694. rPrs.color = {"val": this.getColorHex(styles["color"])};
  1695. break;
  1696. case "letter-spacing":
  1697. //实际测试发现letter-spacing * 0.55 转换word比较合适
  1698. rPrs.spacing = {"val": (styles["letter-spacing"].toFloat()*20 || 0)};
  1699. break;
  1700. case "font-weight":
  1701. var b = styles["font-weight"];
  1702. if (b.toLowerCase()=="normal"){
  1703. //nothing
  1704. }else if (b.toLowerCase()=="bold") {
  1705. rPrs.b = {"val": "true"};
  1706. }else{
  1707. var n = b.toFloat();
  1708. if (n>=600) rPrs.b = {"val": "true"};
  1709. }
  1710. break;
  1711. case "font-family":
  1712. var fonts = styles["font-family"].split(/,\s*/);
  1713. font = {
  1714. "hint": "eastAsia",
  1715. "eastAsia": this.parseFont(fonts[fonts.length-1])
  1716. }
  1717. if (fonts.length>1) font.other = this.parseFont(fonts[0]);
  1718. break;
  1719. case "line-height":
  1720. var h = this.pxToPt(styles["line-height"])*20;
  1721. if (oo_p){
  1722. var oo_pPrs = oo_p.getElementsByTagNameNS(this.nsResolver("w"), "pPr");
  1723. var oo_pPr = (oo_pPrs.length) ? oo_pPrs.item(0) : null;
  1724. if (!oo_pPr){
  1725. oo_pPr = this.createEl(oo_p.ownerDocument,"pPr");
  1726. oo_p.appendChild(oo_pPr);
  1727. }
  1728. var oo_spacings = oo_pPr.getElementsByTagNameNS(this.nsResolver("w"), "spacing");
  1729. var oo_spacing = (oo_spacings.length) ? oo_spacings.item(0) : null;
  1730. if (!oo_spacing){
  1731. oo_spacing = this.createEl(oo_p.ownerDocument,"spacing");
  1732. oo_pPr.appendChild(oo_spacing);
  1733. }
  1734. var line = oo_spacing.getAttributeNS(this.nsResolver("w"), "line");
  1735. if (line<h){
  1736. this.setAttrs(oo_spacing, {"lineRule": "exact", "line": h});
  1737. }
  1738. }
  1739. default:
  1740. //nothing
  1741. }
  1742. }
  1743. if (msoStyle["mso-letter-spacing"]){
  1744. rPrs.spacing = {"val": (msoStyle["mso-letter-spacing"].toFloat()*20 || 0)};
  1745. }
  1746. if (p) this.processRunFont(p, rPrs, font);
  1747. this.processRunFont(span, rPrs, font);
  1748. var runPrs = {"rPrs": rPrs, "font": font};
  1749. if (!text && !br){
  1750. //if (span.tagName.toString().toLowerCase()==="span"){
  1751. this.processRunTextDom(span, oo_p, runPrs);
  1752. //}
  1753. }else{
  1754. runPrs.br = br;
  1755. var oo_run = this.createRun(oo_p.ownerDocument, runPrs);
  1756. if (text){
  1757. text = text.replace(/(?=\s|\n|\r|\t)[^\u3000]/g, '');
  1758. var oo_t = this.createEl(oo_run.ownerDocument,"t");
  1759. oo_t.appendChild(oo_run.ownerDocument.createTextNode(text));
  1760. oo_run.appendChild(oo_t);
  1761. }
  1762. oo_p.appendChild(oo_run);
  1763. }
  1764. },
  1765. processRunSpan: function(span, oo_p, runPrs) {
  1766. //var runPrs = {"rPrs": rPrs, "font": font, "text": text, "br": br};
  1767. var rPrs = Object.clone(runPrs.rPrs);
  1768. var font = Object.clone(runPrs.font);
  1769. var styles = span.getStyles("font-size", "color", "letter-spacing", "font-weight", "font-family")
  1770. var keys = Object.keys(styles);
  1771. styles["font-size"] = window.getComputedStyle(span).fontSize;
  1772. for (var i = 0; i<keys.length; i++){
  1773. switch (keys[i]){
  1774. case "font-size":
  1775. rPrs.sz = {"val": this.parseFontSize(styles["font-size"])*2};
  1776. break;
  1777. case "color":
  1778. rPrs.color = {"val": this.getColorHex(styles["color"])};
  1779. break;
  1780. case "letter-spacing":
  1781. //实际测试发现letter-spacing * 0.55 转换word比较合适
  1782. rPrs.spacing = {"val": (styles["letter-spacing"].toFloat()*20 || 0)};
  1783. break;
  1784. case "font-weight":
  1785. var b = styles["font-weight"];
  1786. if (b.toLowerCase()=="normal"){
  1787. //nothing
  1788. }else if (b.toLowerCase()=="bold") {
  1789. rPrs.b = {"val": "true"};
  1790. }else{
  1791. var n = b.toFloat();
  1792. if (n>=600) rPrs.b = {"val": "true"};
  1793. }
  1794. break;
  1795. case "font-family":
  1796. var fonts = styles["font-family"].split(/,\s*/);
  1797. if (!font) font = {};
  1798. font.hint = "eastAsia";
  1799. font.eastAsia = this.parseFont(fonts[fonts.length-1]);
  1800. // font = {
  1801. // "hint": "eastAsia",
  1802. // "eastAsia": this.parseFont(fonts[fonts.length-1])
  1803. // }
  1804. if (fonts.length>1) font.other = this.parseFont(fonts[0]);
  1805. break;
  1806. default:
  1807. //nothing
  1808. }
  1809. }
  1810. this.processRunFont(span, rPrs, font);
  1811. var runPrs = {"rPrs": rPrs, "font": font};
  1812. this.processRunTextDom(span, oo_p, runPrs);
  1813. },
  1814. processRunTextDom: function(span, oo_p, runPrs){
  1815. var node = span.firstChild;
  1816. while (node){
  1817. if (node.nodeType===Node.ELEMENT_NODE){
  1818. if (node.getStyle("display") === "none") {
  1819. continue;
  1820. }else if (node.tagName.toLowerCase() === "span"){
  1821. this.processRunSpan(node, oo_p, runPrs);
  1822. }else if (node.tagName.toLowerCase() === "br"){
  1823. runPrs.br = "br";
  1824. var oo_run = this.createRun(oo_p.ownerDocument, runPrs);
  1825. oo_p.appendChild(oo_run);
  1826. runPrs.br = "";
  1827. }else{
  1828. this.processRunTextDom(node, oo_p, runPrs);
  1829. }
  1830. }else if (node.nodeType===Node.TEXT_NODE){
  1831. //if (node.nodeValue.trim()){
  1832. var oo_run = this.createRun(oo_p.ownerDocument, runPrs);
  1833. var oo_t = this.createEl(oo_p.ownerDocument,"t");
  1834. oo_t.appendChild(oo_p.ownerDocument.createTextNode(node.nodeValue));
  1835. oo_run.appendChild(oo_t);
  1836. oo_p.appendChild(oo_run);
  1837. //}
  1838. }else{
  1839. this.processRunTextDom(node, oo_p, runPrs);
  1840. }
  1841. node = node.nextSibling;
  1842. }
  1843. },
  1844. processPageSection: function(dom_pageRule, oo_body){
  1845. var oo_sectPr = this.getOrCreateEl(oo_body, "sectPr");
  1846. if (oo_sectPr){
  1847. for (var i = 0; i<dom_pageRule.style.length; i++){
  1848. switch (dom_pageRule.style[i]){
  1849. case "size":
  1850. if( dom_pageRule.style["size"] ){
  1851. var v = dom_pageRule.style["size"].split(/\s/);
  1852. var w = v[0].toFloat()*20, h=v[1].toFloat()*20;
  1853. var oo_pgSz = this.getOrCreateEl(oo_sectPr, "pgSz");
  1854. this.setAttrs(oo_pgSz, {"w": w, "h": h});
  1855. this.pageHeight = h;
  1856. this.pageWidth = w;
  1857. }
  1858. break;
  1859. case "margin-top":
  1860. case "margin-right":
  1861. case "margin-bottom":
  1862. case "margin-left":
  1863. var p = dom_pageRule.style[i].split("-")[1];
  1864. var v = dom_pageRule.style["margin"+p.capitalize()].toFloat()*20;
  1865. var oo_pgMar = this.getOrCreateEl(oo_sectPr, "pgMar");
  1866. if (p==="bottom"){
  1867. var footer = oo_pgMar.getAttributeNS(this.nsResolver("w"), "footer");
  1868. if ((parseInt(footer)+454)>v){
  1869. footer = v-454;
  1870. this.setAttrs(oo_pgMar, {"footer": footer});
  1871. }
  1872. }
  1873. var attrs = {};
  1874. attrs[p] = v
  1875. this.setAttrs(oo_pgMar, attrs);
  1876. this["page-"+dom_pageRule.style[i]] = v;
  1877. break;
  1878. case "line-height":
  1879. case "letter-spacing":
  1880. var oo_docGrid = this.getOrCreateEl(oo_sectPr, "docGrid");
  1881. var lh = dom_pageRule.style["lineHeight"].toFloat()*20;
  1882. var cs = dom_pageRule.style["letterSpacing"].toFloat()*4096;
  1883. var attrs = {"type": "linesAndChars"};
  1884. if (lh) attrs["linePitch"] = lh;
  1885. //if (cs) attrs["charSpace"] = cs;
  1886. this.setAttrs(oo_docGrid, attrs);
  1887. break;
  1888. default:
  1889. //nothing
  1890. }
  1891. }
  1892. if (!this.pageHeight) this.pageHeight = this.options.pageHeight.toFloat()*20;
  1893. if (!this.pageWidth) this.pageWidth = this.options.pageWidth.toFloat()*20;
  1894. if (!this["page-margin-left"]) this["page-margin-left"] = this.options["page-margin-left"].toFloat()*20;
  1895. if (!this["page-margin-right"]) this["page-margin-right"] = this.options["page-margin-right"].toFloat()*20;
  1896. if (!this["page-margin-top"]) this["page-margin-top"] = this.options["page-margin-top"].toFloat()*20;
  1897. if (!this["page-margin-bottom"]) this["page-margin-bottom"] = this.options["page-margin-bottom"].toFloat()*20;
  1898. if (!this.options.firstPageNumber){
  1899. var oo_titlePg = this.createEl(oo_body.ownerDocument, "titlePg");
  1900. oo_sectPr.appendChild(oo_titlePg);
  1901. }
  1902. }
  1903. },
  1904. getOrCreateEl: function(el, tag){
  1905. var node = this.getEl(el, tag);
  1906. if (!node){
  1907. node = this.createEl(el.ownerDocument, tag);
  1908. el.appendChild(node);
  1909. }
  1910. return node;
  1911. },
  1912. createParagraph: function(xmlDoc, options){
  1913. var p = this.createEl(xmlDoc,"p");
  1914. var pPr = this.createEl(xmlDoc,"pPr");
  1915. p.appendChild(pPr);
  1916. /*
  1917. * //如:对齐方式描述如下
  1918. * {
  1919. * "jc": { val: "both" },
  1920. * }
  1921. * */
  1922. if (options && options.pPrs){
  1923. Object.keys(options.pPrs).each(function(k){
  1924. if (k=="pageBreak"){
  1925. var oo_r = this.createEl(xmlDoc, "r");
  1926. var oo_br = this.createEl(xmlDoc, "br");
  1927. this.setAttrs(oo_br, {"type": "page"});
  1928. oo_r.appendChild(oo_br);
  1929. p.appendChild(oo_r);
  1930. }else{
  1931. var node = this.createEl(xmlDoc, k);
  1932. this.setAttrs(node, options.pPrs[k]);
  1933. pPr.appendChild(node);
  1934. }
  1935. }.bind(this));
  1936. }
  1937. return p;
  1938. },
  1939. createRun: function(xmlDoc, options){
  1940. var r = this.createEl(xmlDoc, "r");
  1941. var rPr = this.createEl(xmlDoc,"rPr");
  1942. r.appendChild(rPr);
  1943. if (options && options.text){
  1944. var t = this.createEl(xmlDoc,"t");
  1945. options.text = options.text.replace(/[\u200B-\u200D\uFEFF]/g, '');
  1946. t.appendChild(xmlDoc.createTextNode(options.text));
  1947. r.appendChild(t);
  1948. }
  1949. if (options && options.br){
  1950. var oo_br = this.createEl(xmlDoc,"br");
  1951. r.appendChild(oo_br);
  1952. }
  1953. if (options && options.font){
  1954. var rFonts = this.createEl(xmlDoc,"rFonts");
  1955. var font = {
  1956. "eastAsia": options.font.eastAsia || options.font.font,
  1957. "ascii": options.font.ascii || options.font.other || options.font.eastAsia || options.font.font,
  1958. "hAnsi": options.font.hAnsi || options.font.other || options.font.eastAsia || options.font.font,
  1959. }
  1960. if (options.font.hint) font.hint = options.font.hint;
  1961. this.setAttrs(rFonts, font);
  1962. rPr.appendChild(rFonts);
  1963. }
  1964. /*
  1965. * //如:粗体和字体颜色描述如下
  1966. * {
  1967. * "b": { val: "true" },
  1968. * "color": { val: "FF0000" }
  1969. * }
  1970. * */
  1971. if (options && options.rPrs){
  1972. Object.keys(options.rPrs).each(function(k){
  1973. var node = this.createEl(xmlDoc, k);
  1974. this.setAttrs(node, options.rPrs[k]);
  1975. rPr.appendChild(node);
  1976. }.bind(this));
  1977. }
  1978. return r;
  1979. },
  1980. insertChildren: function(p, els, position){
  1981. this.insertAdjacent(p, els, position, "beforeend");
  1982. },
  1983. insertSiblings: function(p, els, position){
  1984. this.insertAdjacent(p, els, position, "afterend");
  1985. },
  1986. insertAdjacent: function(p, els, posFirst, posNext){
  1987. var pos = posFirst || "beforeend";
  1988. var posMapping = {
  1989. 'beforebegin': "before",
  1990. 'afterbegin': "top",
  1991. 'beforeend': "bottom",
  1992. 'afterend': "after"
  1993. };
  1994. els.each(function(e){
  1995. (p.insertAdjacentElement) ? p.insertAdjacentElement(pos, e) : e.inject(p, posMapping[pos]);
  1996. p = e;
  1997. pos = posNext || "afterend";
  1998. });
  1999. },
  2000. getEl: function(el, tag, ns){
  2001. return this.getEls(el, tag, ns)[0];
  2002. },
  2003. getEls: function(el, tag, ns){
  2004. var n = ns || "w";
  2005. return el.getElementsByTagNameNS(this.nsResolver(n), tag);
  2006. },
  2007. createEl: function(xmlDoc, tag, ns){
  2008. if (ns===false){
  2009. return xmlDoc.createElement(tag);
  2010. }else{
  2011. var n = ns || "w";
  2012. if (false && Browser.name==="ie"){
  2013. return xmlDoc.createElement(n+":"+tag);
  2014. }
  2015. return xmlDoc.createElementNS(this.nsResolver(n), n+":"+tag);
  2016. }
  2017. },
  2018. setAttr: function(node, name, value, ns){
  2019. if (ns===false){
  2020. node.setAttribute(name, value);
  2021. }else{
  2022. var n = ns || "w";
  2023. if (false && Browser.name==="ie") {
  2024. node.setAttribute(n+":"+name, value);
  2025. }else{
  2026. node.setAttributeNS(this.nsResolver(n), n+":"+name, value);
  2027. }
  2028. }
  2029. },
  2030. setAttrs: function(node, attrs, ns){
  2031. if (ns===false){
  2032. Object.keys(attrs).forEach(function(key){
  2033. node.setAttribute(key, attrs[key]);
  2034. });
  2035. }else{
  2036. var n = this.nsResolver(ns || "w");
  2037. Object.keys(attrs).forEach(function(key){
  2038. if (false && Browser.name==="ie") {
  2039. node.setAttribute((ns || "w")+":"+key, attrs[key]);
  2040. }else{
  2041. node.setAttributeNS(n, (ns || "w")+":"+key, attrs[key]);
  2042. }
  2043. });
  2044. }
  2045. },
  2046. nsResolver: function(prefix){
  2047. var ns = {
  2048. "w": "http://schemas.openxmlformats.org/wordprocessingml/2006/main",
  2049. "wpc": "http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas",
  2050. "cx": "http://schemas.microsoft.com/office/drawing/2014/chartex",
  2051. "cx1": "http://schemas.microsoft.com/office/drawing/2015/9/8/chartex",
  2052. "cx2": "http://schemas.microsoft.com/office/drawing/2015/10/21/chartex",
  2053. "cx3": "http://schemas.microsoft.com/office/drawing/2016/5/9/chartex",
  2054. "cx4": "http://schemas.microsoft.com/office/drawing/2016/5/10/chartex",
  2055. "cx5": "http://schemas.microsoft.com/office/drawing/2016/5/11/chartex",
  2056. "cx6": "http://schemas.microsoft.com/office/drawing/2016/5/12/chartex",
  2057. "cx7": "http://schemas.microsoft.com/office/drawing/2016/5/13/chartex",
  2058. "cx8": "http://schemas.microsoft.com/office/drawing/2016/5/14/chartex",
  2059. "mc": "http://schemas.openxmlformats.org/markup-compatibility/2006",
  2060. "aink": "http://schemas.microsoft.com/office/drawing/2016/ink",
  2061. "am3d": "http://schemas.microsoft.com/office/drawing/2017/model3d",
  2062. "o": "urn:schemas-microsoft-com:office:office",
  2063. "r": "http://schemas.openxmlformats.org/officeDocument/2006/relationships",
  2064. "m": "http://schemas.openxmlformats.org/officeDocument/2006/math",
  2065. "v": "urn:schemas-microsoft-com:vml",
  2066. "wp14": "http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing",
  2067. "wp": "http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing",
  2068. "w10": "urn:schemas-microsoft-com:office:word",
  2069. "w14": "http://schemas.microsoft.com/office/word/2010/wordml",
  2070. "w15": "http://schemas.microsoft.com/office/word/2012/wordml",
  2071. "w16cex": "http://schemas.microsoft.com/office/word/2018/wordml/cex",
  2072. "w16cid": "http://schemas.microsoft.com/office/word/2016/wordml/cid",
  2073. "w16": "http://schemas.microsoft.com/office/word/2018/wordml",
  2074. "w16sdtdh": "http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash",
  2075. "w16se": "http://schemas.microsoft.com/office/word/2015/wordml/symex",
  2076. "wpg": "http://schemas.microsoft.com/office/word/2010/wordprocessingGroup",
  2077. "wpi": "http://schemas.microsoft.com/office/word/2010/wordprocessingInk",
  2078. "wne": "http://schemas.microsoft.com/office/word/2006/wordml",
  2079. "wps": "http://schemas.microsoft.com/office/word/2010/wordprocessingShape",
  2080. "a": "http://schemas.openxmlformats.org/drawingml/2006/main",
  2081. "pic": "http://schemas.openxmlformats.org/drawingml/2006/picture",
  2082. "a14": "http://schemas.microsoft.com/office/drawing/2010/main",
  2083. "rel": "http://schemas.openxmlformats.org/package/2006/relationships"
  2084. };
  2085. return ns[prefix] || null;
  2086. },
  2087. getColorHex: function(clr){
  2088. if (!clr) return "";
  2089. var colorKeys = {
  2090. "black": "000000",
  2091. "silver": "c0c0c0",
  2092. "gray": "808080",
  2093. "white": "ffffff",
  2094. "maroon": "800000",
  2095. "red": "ff0000",
  2096. "purple": "800080",
  2097. "fuchsia": "ff00ff",
  2098. "green": "008000",
  2099. "lime": "00ff00",
  2100. "olive": "808000",
  2101. "yellow": "ffff00",
  2102. "navy": "000080",
  2103. "blue": "0000ff",
  2104. "teal": "008080",
  2105. "aqua": "00ffff",
  2106. "initial": "000000"
  2107. }
  2108. if (colorKeys[clr]) return colorKeys[clr];
  2109. var f = clr.substr(0,1);
  2110. if (f==="#") return clr.replace("#", "");
  2111. return clr.rgbToHex() || clr;
  2112. }
  2113. });