You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

func_docProcess.js 35KB

7 months ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904
  1. /**
  2. * 从OA调用传来的指令,打开本地新建文件
  3. * @param {*} fileUrl 文件url路径
  4. */
  5. function NewFile(params) {
  6. //获取WPS Application 对象
  7. var wpsApp = wps.WpsApplication();
  8. wps.PluginStorage.setItem(constStrEnum.IsInCurrOADocOpen, true); //设置OA打开文档的临时状态
  9. //判断一下isOfficialDocument是否通过公文写作打开
  10. var doc;
  11. if (params.isOfficialDocument) {
  12. wps.Application.GetApplicationEx().NewOfficialDocument(); //新增使用公文写作打开的公文
  13. doc = wpsApp.ActiveDocument;
  14. } else {
  15. doc = wpsApp.Documents.Add(); //新增OA端文档
  16. }
  17. wps.PluginStorage.setItem(constStrEnum.IsInCurrOADocOpen, false);
  18. //检查系统临时文件目录是否能访问
  19. if (wps.Env && wps.Env.GetTempPath) {
  20. if (params.newFileName) {
  21. //按OA传入的文件名称保存
  22. doc.SaveAs2($FileName = wps.Env.GetTempPath() + "/" + params.newFileName, undefined, undefined, undefined, false);
  23. } else {
  24. //OA传入空文件名称,则保存成系统时间文件
  25. if (params.isOfficialDocument) {
  26. doc.SaveAs2($FileName = wps.Env.GetTempPath() + "/OA_" + currentTime(), 0, undefined, undefined, false);
  27. } else {
  28. doc.SaveAs2($FileName = wps.Env.GetTempPath() + "/OA_" + currentTime(), undefined, undefined, undefined, false);
  29. }
  30. }
  31. } else {
  32. alert("文档保存临时目录出错!不能保存新建文档!请联系系统开发商。");
  33. }
  34. var l_NofityURL = GetParamsValue(params, constStrEnum.notifyUrl);
  35. if (l_NofityURL) {
  36. NotifyToServer(l_NofityURL.replace("{?}", "1"));
  37. }
  38. //Office文件打开后,设置该文件属性:从服务端来的OA文件
  39. pSetOADocumentFlag(doc, params);
  40. //设置当前文档为 本地磁盘落地模式
  41. DoSetOADocLandMode(doc, EnumDocLandMode.DLM_LocalDoc);
  42. //强制执行一次Activate事件
  43. OnWindowActivate();
  44. wps.WpsApplication().WindowState=1;
  45. wps.WpsApplication().Activate(); //把WPS对象置前
  46. return doc; //返回新创建的Document对象
  47. }
  48. /**
  49. * 打开服务器上的文件
  50. * @param {*} fileUrl 文件url路径
  51. */
  52. function OpenFile(params) {
  53. var l_strFileUrl = params.fileName; //来自OA网页端的OA文件下载路径
  54. var doc;
  55. var l_IsOnlineDoc = false; //默认打开的是不落地文档
  56. if (l_strFileUrl) {
  57. //下载文档之前,判断是否已下载该文件
  58. if (pCheckIsExistOpenOADoc(l_strFileUrl) == true) {
  59. //如果找到相同OA地址文档,则给予提示
  60. wps.WpsApplication().WindowState=1;
  61. wps.WpsApplication().Activate(); //把WPS对象置前
  62. //根据OA助手对是否允许再次打开相同文件的判断处理
  63. var l_AllowOADocReOpen = false;
  64. l_AllowOADocReOpen = wps.PluginStorage.getItem(constStrEnum.AllowOADocReOpen);
  65. if (l_AllowOADocReOpen == false) {
  66. alert("已打开相同的OA文件,请关闭之前的文件,再次打开。");
  67. wps.WpsApplication().Activate();
  68. return null;
  69. } else {
  70. //处理重复打开相同OA 文件的方法
  71. var nDocCount = wps.WpsApplication().Documents.Count;
  72. pReOpenOADoc(l_strFileUrl);
  73. //重复打开的文档采用不落地的方式打开
  74. // 不落地方式打开文档判断落地比较多,V1版本先暂时关闭
  75. l_IsOnlineDoc = true;
  76. var nDocCount_New = wps.WpsApplication().Documents.Count;
  77. if (nDocCount_New > nDocCount) {
  78. doc = wps.WpsApplication().ActiveDocument;
  79. }
  80. }
  81. } else {
  82. //如果当前没有打开文档,则另存为本地文件,再打开
  83. if (l_strFileUrl.startWith("http")) { // 网络文档
  84. DownloadFile(l_strFileUrl, function(path) {
  85. if (path == "") {
  86. alert("从服务端下载路径:" + l_strFileUrl + "\n" + "获取文件下载失败!");
  87. return null;
  88. }
  89. doc = pDoOpenOADocProcess(params, path);
  90. pOpenFile(doc, params, l_IsOnlineDoc);
  91. });
  92. return;
  93. } else { //本地文档
  94. doc = pDoOpenOADocProcess(params, l_strFileUrl);
  95. if (doc)
  96. doc.SaveAs2($FileName = wps.Env.GetTempPath() + "/" + doc.Name, undefined, undefined, undefined, false);
  97. }
  98. }
  99. } else {
  100. //fileURL 如果为空,则按新建OA本地文件处理
  101. NewFile(params);
  102. }
  103. //如果打开pdf等其他非Office文档,则doc对象为空
  104. if (!doc) {
  105. return null;
  106. }
  107. pOpenFile(doc, params, l_IsOnlineDoc);
  108. }
  109. /**
  110. * 作用:文档打开后执行的动作集合
  111. * @param {*} doc 文档对象
  112. * @param {*} params 前端传递的参数集合
  113. * @param {*} isOnlineDoc 在线打开/落地打开
  114. */
  115. function pOpenFile(doc, params, isOnlineDoc) {
  116. var l_IsOnlineDoc = isOnlineDoc
  117. //Office文件打开后,设置该文件属性:从服务端来的OA文件
  118. pSetOADocumentFlag(doc, params)
  119. //设置当前文档为 本地磁盘落地模式
  120. if (l_IsOnlineDoc == true) {
  121. DoSetOADocLandMode(doc, EnumDocLandMode.DLM_OnlineDoc);
  122. } else {
  123. DoSetOADocLandMode(doc, EnumDocLandMode.DLM_LocalDoc);
  124. }
  125. if (GetParamsValue(params, constStrEnum.templateDataUrl)) {
  126. GetServerTemplateData(doc, params[constStrEnum.templateDataUrl]);
  127. }
  128. if (GetParamsValue(params, constStrEnum.insertFileUrl)) {
  129. InsertRedHeadDoc(doc);
  130. }
  131. var l_NofityURL = GetParamsValue(params, constStrEnum.notifyUrl);
  132. if (l_NofityURL) {
  133. l_NofityURL = l_NofityURL.replace("{?}", "1"); //约定:参数为1则代码打开状态
  134. NotifyToServer(l_NofityURL);
  135. }
  136. //重新设置工具条按钮的显示状态
  137. pDoResetRibbonGroups();
  138. // 触发切换窗口事件
  139. OnWindowActivate();
  140. // 把WPS对象置前
  141. wps.WpsApplication().WindowState=1;
  142. wps.WpsApplication().Activate();
  143. return doc;
  144. }
  145. /**
  146. * 套用模板插入文字/图片/文档
  147. * * params参数结构
  148. * params:{
  149. * 'docId': docId, //文档ID
  150. * 'templateURL':'',获取模板接口
  151. * 'fileName':'',获取文档接口
  152. * 'uploadPath':'',文档保存上传接口
  153. * }
  154. * 这个功能要求服务端传来的模板JSON数据字符串,支持三种类型定义:
  155. * text 类型:直接插入对应的书签位置
  156. * link 类型: 把对应的URL的文件插入到指定的书签位置
  157. * pic 类型: 把对应的URL的图片文件插入到指定的书签位置
  158. * @param {*} params
  159. */
  160. function GetServerTemplateData(template, pTemplateDataUrl) {
  161. //获取文档内容
  162. $.ajax({
  163. url: pTemplateDataUrl,
  164. async: false,
  165. method: "get",
  166. dataType: 'json',
  167. success: function(res) {
  168. var data = res;
  169. let Bookmarks = template.Bookmarks;
  170. data.forEach(function(it) {
  171. var bookmark = Bookmarks.Item(it.name);
  172. let bookStart = bookmark.Range.Start;
  173. let bookEnd = bookmark.Range.End;
  174. let start = template.Range().End
  175. //方案1,直接替换,手动添加书签
  176. // if (bookmark) {
  177. // if (!it.type || it.type === "text") {
  178. // bookmark.Range.Text = it.text;
  179. // } else if (it.type === "link") {
  180. // bookmark.Range.InsertFile(it.text);
  181. // } else if (it.type === "pic") {
  182. // bookmark.Range.InlineShapes.AddPicture(it.text);
  183. // }
  184. // }
  185. // let end = template.Range().End
  186. // let range=bookmark.Range;
  187. // if (!Bookmarks.Exists(bookmark.Name))
  188. // Bookmarks.Add(bookmark.Name, range.SetRange(bookStart, bookEnd + (end - start)))
  189. //方案2,不完全替换
  190. if(bookmark){
  191. if (!it.type || it.type === "text") {
  192. bookmark.Range.InsertBefore(it.text);
  193. } else if (it.type === "link") {
  194. bookmark.Range.InsertFile(it.text);
  195. } else if (it.type === "pic") {
  196. bookmark.Range.InlineShapes.AddPicture(it.text);
  197. }
  198. }
  199. var selection=wps.WpsApplication().ActiveWindow.Selection;
  200. if (bookmark.Range.Text) {
  201. selection.Start = bookmark.Range.End - (bookEnd - bookStart);
  202. selection.End = bookmark.Range.End;
  203. selection.Cut();
  204. } else {
  205. selection.Start = bookmark.Range.End;
  206. selection.End = bookmark.Range.End+it.text.length;
  207. ActiveDocument.Bookmarks.Add(bookmark.Name, selection.Range);
  208. }
  209. })
  210. }
  211. });
  212. }
  213. /**
  214. * 打开服务端的文档(不落地)
  215. * @param {*} fileUrl 文件url路径
  216. */
  217. function OpenOnLineFile(OAParams) {
  218. //OA参数如果为空的话退出
  219. if (!OAParams) return;
  220. //获取在线文档URL
  221. var l_OAFileUrl = OAParams.fileName;
  222. var l_doc;
  223. if (l_OAFileUrl) {
  224. //下载文档不落地(16版WPS的925后支持)
  225. wps.WpsApplication().Documents.OpenFromUrl(l_OAFileUrl, "OnOpenOnLineDocSuccess", "OnOpenOnLineDocDownFail");
  226. l_doc = wps.WpsApplication().ActiveDocument;
  227. }
  228. //执行文档打开后的方法
  229. pOpenFile(l_doc, OAParams, true);
  230. return l_doc;
  231. }
  232. /**
  233. * 打开在线文档成功后触发事件
  234. * @param {*} resp
  235. */
  236. function OnOpenOnLineDocSuccess(resp) {
  237. }
  238. /**
  239. * 打开在线不落地文档出现失败时,给予错误提示
  240. */
  241. function OnOpenOnLineDocDownFail(res) {
  242. var err={}
  243. try{
  244. res=JSON.parse(res)
  245. err.Body=Base64.decode(res.Body)
  246. err.Headers=Base64.decode(JSON.stringify(res.Headers))
  247. console.log(err)
  248. }catch(err){
  249. }
  250. alert("打开在线不落地文档失败!请尝试重新打开。");
  251. return;
  252. }
  253. /**
  254. * 参数:
  255. * doc : 当前OA文档的Document对象
  256. * DocLandMode : 落地模式设置
  257. */
  258. function DoSetOADocLandMode(doc, DocLandMode) {
  259. if (!doc) return;
  260. var l_Param = wps.PluginStorage.getItem(doc.DocID);
  261. var l_objParam = JSON.parse(l_Param);
  262. //增加属性,或设置
  263. l_objParam.OADocLandMode = DocLandMode; //设置OA文档的落地标志
  264. var l_p = JSON.stringify(l_objParam);
  265. //将OA文档落地模式标志存入系统变量对象保存
  266. wps.PluginStorage.setItem(doc.DocID, l_p);
  267. }
  268. /**
  269. * 作用:设置Ribbon工具条的按钮显示状态
  270. * @param {*} paramsGroups
  271. */
  272. function pDoResetRibbonGroups(paramsGroups) {
  273. }
  274. /**
  275. * 作用:打开文档处理的各种过程,包含:打开带密码的文档,保护方式打开文档,修订方式打开文档等种种情况
  276. * params Object OA Web端传来的请求JSON字符串,具体参数说明看下面数据
  277. * TempLocalFile : 字符串 先把文档从OA系统下载并保存在Temp临时目录,这个参数指已经下载下来的本地文档地址
  278. * ----------------------以下是OA参数的一些具体规范名称
  279. * docId String 文档ID
  280. * uploadPath String 保存文档接口
  281. * fileName String 获取服务器文档接口(不传即为新建空文档)
  282. * suffix String ".pdf|.uot",可传多个,用“|”分割,保存时会按照所传的值转成对应的格式文档并上传
  283. * userName String 用于更改显示修改人的用户名
  284. * strBookmarkDataPath string 书签列表 (可不传,可以在OA助手config.js中配置)
  285. * templatePath string 模板列表 (可不传,可以在OA助手config.js中配置)
  286. * buttonGroups string 自定义按钮组 (可不传,不传显示所有按钮)
  287. * revisionCtrl String 痕迹控制 ,不传正常打开
  288. * bOpenRevision String true(打开)false(关闭)修订
  289. * bShowRevision String true(显示)/false(关闭)痕迹
  290. * openType String 文档打开方式 ,不传正常打开
  291. * protectType String 文档保护类型,-1:不启用保护模式,0:只允许对现有内容进行修订,1:只允许添加批注,2:只允许修改窗体域,3:只读
  292. * password String密码
  293. */
  294. function pDoOpenOADocProcess(params, TempLocalFile) {
  295. var l_ProtectType = -1; //默认文档保护类型 -1 为不启用保护
  296. var l_ProtectPassword = ""; //默认文档密码为空
  297. var l_strDocPassword = ""; //打开文档密码参数
  298. var l_bOpenRevision = false; //初始化关闭修订模式
  299. var l_bShowRevision = false; //初始化不显示修订气泡样式
  300. for (var key = "" in params) {
  301. switch (key.toUpperCase()) //
  302. {
  303. case "userName".toUpperCase(): //修改当前文档用户名
  304. wps.WpsApplication().UserName = params[key];
  305. break;
  306. case "openType".toUpperCase():
  307. l_ProtectType = params[key].protectType; //获取OA传来的文档保护类型
  308. l_ProtectPassword = params[key].password; //获取OA传来的保护模式下的文档密码
  309. break;
  310. case "revisionCtrl".toUpperCase(): //限制修订状态
  311. l_bOpenRevision = params[key].bOpenRevision;
  312. l_bShowRevision = params[key].bShowRevision;
  313. break;
  314. case "buttonGroups".toUpperCase(): //按钮组合
  315. break;
  316. case "docPassword".toUpperCase(): //传入打开文件的密码
  317. l_strDocPassword = params[key].docPassword;
  318. break;
  319. }
  320. }
  321. var l_Doc;
  322. // Open方法的参数说明如下
  323. //Function Open(FileName, [ConfirmConversions], [ReadOnly], [AddToRecentFiles],
  324. // [PasswordDocument], [PasswordTemplate], [Revert], [WritePasswordDocument],
  325. // [WritePasswordTemplate], [Format], [Encoding], [Visible],
  326. // [OpenAndRepair], [DocumentDirection], [NoEncodingDialog], [XMLTransform]) As Document
  327. l_Doc = wps.WpsApplication().Documents.Open(TempLocalFile, false, false, false, l_strDocPassword);
  328. //设置文档修订状态
  329. DoOADocOpenRevision(l_Doc, l_bOpenRevision, l_bShowRevision);
  330. //打开文档后,根据保护类型设置文档保护
  331. if (l_ProtectType > -1) // -1 :不设置文档保护
  332. SetOADocProtect(l_Doc, l_ProtectType, l_ProtectPassword);
  333. return l_Doc;
  334. }
  335. /**
  336. * protectType: '', 文档保护模式( -1:不启用保护模式,
  337. * 0:只允许对现有内容进行修订,
  338. * 1:只允许添加批注,
  339. * 2:只允许修改窗体域,
  340. * 3:只读)
  341. * @param {*} protectType
  342. * @param {*} doc
  343. */
  344. function SetOADocProtect(doc, protectType, ProtectPassword) {
  345. if (!doc) return; //校验文档是否存在
  346. if ([0, 1, 2, 3].indexOf(protectType) !== -1) {
  347. // 保护文档如果之前有被保护,再次保护会出问题,需要先解除保护
  348. doc.Unprotect();
  349. // ** 方法参数
  350. // ** Protect(Type As WdProtectionType, [NoReset], [Password], [UseIRM], [EnforceStyleLock])
  351. doc.Protect(protectType, false, ProtectPassword, false);
  352. }
  353. return;
  354. }
  355. /**
  356. * 打开/关闭修订
  357. * @param {*} doc :传入文档对象
  358. * @param {*} bOpenRevision : 布尔值,是否允许打开修订模式,true:打开/false:关闭
  359. * @param {*} bOpenRevision : 布尔值,是否显示修订痕迹状态
  360. * 返回值:无
  361. */
  362. function DoOADocOpenRevision(doc, bOpenRevision, bShowRevision) {
  363. if (!doc) return;
  364. doc.TrackRevisions = bOpenRevision; //如果标记对指定文档的修改,则该属性值为True
  365. var l_v = doc.ActiveWindow.View;
  366. l_v.ShowRevisionsAndComments = bShowRevision; //如果为True,则 WPS 显示使用“修订”功能对文档所作的修订和批注
  367. l_v.RevisionsBalloonShowConnectingLines = bShowRevision; //如果为 True,则 WPS 显示从文本到修订和批注气球之间的连接线
  368. wps.WpsApplication().CommandBars.ExecuteMso("KsoEx_RevisionCommentModify_Disable"); //去掉修改痕迹信息框中的接受修订和拒绝修订勾叉,使其不可用
  369. if (bShowRevision) {
  370. doc.ActiveWindow.ActivePane.View.RevisionsMode = 2; //2为不支持气泡显示。
  371. }
  372. //如果关闭修订,关闭显示痕迹并将按钮至灰
  373. wps.ribbonUI.InvalidateControl("btnOpenRevision");
  374. wps.ribbonUI.InvalidateControl("btnShowRevision");
  375. return;
  376. }
  377. /**
  378. * 描述:如何处理再次打开相同的OA文件
  379. * 返回值:打开的Document对象
  380. */
  381. function pReOpenOADoc(OADocURL) {
  382. if (wps.confirm("当前环境已打开该文件,是否重新再打开一份?")) {
  383. //如果用户选择再次打开,则用在线方式打开
  384. wps.WpsApplication().Documents.OpenFromUrl(OADocURL, "", "");
  385. }
  386. }
  387. /**
  388. * 功能说明:判断是否已存在来自OA的已打开的文档
  389. * @param {字符串} FileURL
  390. */
  391. function pCheckIsExistOpenOADoc(FileURL) {
  392. var l_DocCount = wps.WpsApplication().Documents.Count;
  393. if (l_DocCount <= 0) return false;
  394. //轮询检查当前已打开的WPS文档中,是否存在OA相同的文件
  395. if (l_DocCount >= 1) {
  396. for (var l_index = 1; l_index <= l_DocCount; l_index++) {
  397. var l_objDoc = wps.WpsApplication().Documents.Item(l_index);
  398. var l_strParam = wps.PluginStorage.getItem(l_objDoc.DocID);
  399. if (l_strParam == null)
  400. continue;
  401. var l_objParam = JSON.parse(l_strParam)
  402. if (l_objParam.fileName == FileURL) {
  403. return true;
  404. }
  405. }
  406. return false;
  407. }
  408. }
  409. //Office文件打开后,设置该文件属性:从服务端来的OA文件
  410. function pSetOADocumentFlag(doc, params) {
  411. if (!doc) {
  412. return; //
  413. }
  414. var l_Param = params;
  415. l_Param.isOA = EnumOAFlag.DocFromOA; //设置OA打开文档的标志
  416. l_Param.SourcePath = doc.FullName; //保存OA的原始文件路径,用于保存时分析,是否进行了另存为操作
  417. //console.log(l_Param.SourcePath);
  418. if (doc) {
  419. var l_p = JSON.stringify(l_Param);
  420. //将OA文档标志存入系统变量对象保存
  421. wps.PluginStorage.setItem(doc.DocID, l_p);
  422. }
  423. }
  424. /**
  425. * 作用:
  426. * @param {*} suffix :文档后缀明:.pdf 或 .uot 或 .uof
  427. * @param {*} doc
  428. * @param {*} uploadPath
  429. * @param {} FieldName : 上传到服务器端的字段名称,可由OA传入的参数设置
  430. *
  431. * 返回值:是否执行了上传操作,布尔值
  432. */
  433. function handleFileAndUpload(suffix, doc, uploadPath, FieldName) {
  434. var l_strChangeFileName = ""; // 转换格式后的文件名称
  435. var l_strPath = ""; // 转换格式后的文件路径
  436. var l_FieldName = FieldName;
  437. if (!doc) {
  438. return false;
  439. }
  440. if (!l_FieldName) {
  441. l_FieldName = "file"; //默认情况下,设置为 file 字段名称
  442. }
  443. var l_DocSourcePath = doc.FullName; //保留当前文档明,在SaveAs使用后再保存回原来的文件明
  444. //Sub ExportAsFixedFormat(OutputFileName As String, ExportFormat As WdExportFormat,
  445. // [OpenAfterExport As Boolean = False],
  446. // [OptimizeFor As WdExportOptimizeFor = wdExportOptimizeForPrint],
  447. // [Range As WdExportRange = wdExportAllDocument], [From As Long = 1],
  448. // [To As Long = 1], [Item As WdExportItem = wdExportDocumentContent],
  449. // [IncludeDocProps As Boolean = False], [KeepIRM As Boolean = True],
  450. // [CreateBookmarks As WdExportCreateBookmarks = wdExportCreateNoBookmarks],
  451. // [DocStructureTags As Boolean = True], [BitmapMissingFonts As Boolean = True],
  452. // [UseISO19005_1 As Boolean = False], [FixedFormatExtClassPtr])
  453. // Const wdExportFormatPDF = 17 (&H11)
  454. // Const wdExportFormatXPS = 18 (&H12)
  455. //
  456. //根据传入的 后缀文件名称进行不同的转换文档操作
  457. switch (suffix.toLocaleLowerCase()) {
  458. case '.pdf':
  459. l_strPath = pGetValidDocTempPath(doc) + ".pdf"; //获取有效输出路径
  460. wps.FileSystem.Remove(l_strPath); //先删除之前可能存在的临时文件
  461. doc.ExportAsFixedFormat(l_strPath, wps.Enum&&wps.Enum.wdFormatPDF||17, true); //文档另存为PDF格式
  462. l_strChangeFileName = doc.Name.split(".")[0] + ".pdf";
  463. UploadFile(l_strChangeFileName, l_strPath, uploadPath, l_FieldName, OnChangeSuffixUploadSuccess, OnChangeSuffixUploadFail);
  464. break;
  465. case '.uof':
  466. l_strPath = pGetValidDocTempPath(doc) + suffix;
  467. wps.FileSystem.Remove(l_strPath); //先删除之前可能存在的临时文件
  468. doc.ExportAsFixedFormat(l_strPath, wps.Enum&&wps.Enum.wdFormatOpenDocumentText||23, true); //转换文件格式
  469. doc.SaveAs2(l_strPath);
  470. l_strChangeFileName = doc.Name.split(".")[0] + suffix;
  471. UploadFile(l_strChangeFileName, l_strPath, uploadPath, l_FieldName, OnChangeSuffixUploadSuccess, OnChangeSuffixUploadFail);
  472. doc.SaveAs2(l_DocSourcePath); //保存回原来的文档内容
  473. break;
  474. case '.uot':
  475. l_strPath = pGetValidDocTempPath(doc) + suffix;
  476. wps.FileSystem.Remove(l_strPath); //先删除之前可能存在的临时文件
  477. doc.ExportAsFixedFormat(l_strPath, wps.Enum&&wps.Enum.wdFormatOpenDocumentText||23, true);
  478. doc.SaveAs2(l_strPath);
  479. l_strChangeFileName = doc.Name.split(".")[0] + suffix;
  480. UploadFile(l_strChangeFileName, l_strPath, uploadPath, l_FieldName, OnChangeSuffixUploadSuccess, OnChangeSuffixUploadFail);
  481. doc.SaveAs2(l_DocSourcePath); //保存回原来的文档内容
  482. break;
  483. case '.ofd':
  484. l_strPath = pGetValidDocTempPath(doc) + suffix;
  485. wps.FileSystem.Remove(l_strPath); //先删除之前可能存在的临时文件
  486. doc.ExportAsFixedFormat(l_strPath, wps.Enum&&wps.Enum.wdFormatOpenDocumentText||23, true);
  487. doc.SaveAs2(l_strPath,102);
  488. l_strChangeFileName = doc.Name.split(".")[0] + suffix;
  489. UploadFile(l_strChangeFileName, l_strPath, uploadPath, l_FieldName, OnChangeSuffixUploadSuccess, OnChangeSuffixUploadFail);
  490. doc.SaveAs2(l_DocSourcePath); //保存回原来的文档内容
  491. break;
  492. default:
  493. l_strPath = pGetValidDocTempPath(doc) + suffix;
  494. wps.FileSystem.Remove(l_strPath); //先删除之前可能存在的临时文件
  495. doc.SaveAs2(l_strPath);
  496. l_strChangeFileName = doc.Name.split(".")[0] + suffix;
  497. UploadFile(l_strChangeFileName, l_strPath, uploadPath, l_FieldName, OnChangeSuffixUploadSuccess, OnChangeSuffixUploadFail);
  498. doc.SaveAs2(l_DocSourcePath); //保存回原来的文档内容
  499. break;
  500. }
  501. wps.FileSystem.Remove(l_strPath); //上载完成后,删除临时文件
  502. return true;
  503. }
  504. /**
  505. * 作用:获取一个有效的临时文档路径,用于保存转换格式后的文档
  506. * @param {*} doc
  507. */
  508. function pGetValidDocTempPath(doc) {
  509. if (!doc) {
  510. return;
  511. }
  512. if (doc.Path == "") { //对于不落地文档,文档路径为空
  513. return wps.Env.GetTempPath()+"/"+doc.Name.split(".")[0];
  514. } else {
  515. return doc.FullName.split(".")[0]
  516. }
  517. }
  518. /**
  519. * 作用:转格式保存上传成功后,触发这个事件的回调
  520. * @param {} response
  521. */
  522. function OnChangeSuffixUploadSuccess(response) {
  523. l_result = handleResultBody(response);
  524. alert("文件转格式保存成功!");
  525. }
  526. /**
  527. * 作用:转格式保存失败,触发失败事件回调
  528. * @param {*} response
  529. */
  530. function OnChangeSuffixUploadFail(response) {
  531. var l_result = "";
  532. l_result = handleResultBody(response);
  533. alert("保存失败" + "\n" + +"系统返回数据:" + +JSON.stringify(l_result));
  534. }
  535. /**
  536. * 解析返回response的参数
  537. * @param {*} resp
  538. * @return {*} body
  539. */
  540. function handleResultBody(resp) {
  541. var l_result = "";
  542. if (resp.Body) {
  543. //解析返回response的参数
  544. }
  545. return l_result;
  546. }
  547. /**
  548. * 把OA文件的当前编辑内容,自动提交到OA后台
  549. */
  550. function pAutoUploadToServer(p_Doc) {
  551. if (!p_Doc) {
  552. return;
  553. }
  554. /**
  555. * 参数定义:OAAsist.UploadFile(name, path, url, field, "OnSuccess", "OnFail")
  556. * 上传一个文件到远程服务器。
  557. * name:为上传后的文件名称;
  558. * path:是文件绝对路径;
  559. * url:为上传地址;
  560. * field:为请求中name的值;
  561. * 最后两个参数为回调函数名称;
  562. */
  563. var l_uploadPath = GetDocParamsValue(p_Doc, constStrEnum.uploadPath); // 文件上载路径
  564. if (l_uploadPath == "") {
  565. //wps.alert("系统未传入文件上载路径,不能执行上传操作!");
  566. return;
  567. }
  568. var l_FieldName = GetDocParamsValue(p_Doc, constStrEnum.uploadFieldName); //上载到后台的字段名称
  569. if (l_FieldName == "") {
  570. l_FieldName = wps.PluginStorage.getItem(constStrEnum.DefaultUploadFieldName); // 默认为‘file’
  571. }
  572. var l_UploadName = GetDocParamsValue(p_Doc, constStrEnum.uploadFileName); //设置OA传入的文件名称参数
  573. if (l_UploadName == "") {
  574. l_UploadName = p_Doc.Name; //默认文件名称就是当前文件编辑名称
  575. }
  576. var l_DocPath = p_Doc.FullName; // 文件所在路径
  577. if (pIsOnlineOADoc(p_Doc) == false) {
  578. console.log("落地文档自动保存");
  579. //对于本地磁盘文件上传OA,先用Save方法保存后,在上传
  580. //设置用户保存按钮标志,避免出现禁止OA文件保存的干扰信息
  581. wps.PluginStorage.setItem(constStrEnum.OADocUserSave, EnumDocSaveFlag.OADocSave);
  582. p_Doc.Save(); //执行一次保存方法
  583. //设置用户保存按钮标志
  584. wps.PluginStorage.setItem(constStrEnum.OADocUserSave, EnumDocSaveFlag.NoneOADocSave);
  585. //落地文档,调用UploadFile方法上传到OA后台
  586. try {
  587. //调用OA助手的上传方法
  588. UploadFile(l_UploadName, l_DocPath, l_uploadPath, l_FieldName, OnAutoUploadSuccess, OnAutoUploadFail);
  589. } catch (err) {
  590. alert("上传文件失败!请检查系统上传参数及网络环境!");
  591. }
  592. } else {
  593. console.log("不落地文档自动保存");
  594. // 不落地的文档,调用 Document 对象的不落地上传方法
  595. wps.PluginStorage.setItem(constStrEnum.OADocUserSave, EnumDocSaveFlag.OADocSave);
  596. try {
  597. //调用不落地上传方法
  598. p_Doc.SaveAsUrl(l_UploadName, l_uploadPath, l_FieldName, "OnAutoUploadSuccess", "OnAutoUploadFail");
  599. } catch (err) {}
  600. wps.PluginStorage.setItem(constStrEnum.OADocUserSave, EnumDocSaveFlag.NoneOADocSave);
  601. }
  602. }
  603. /**
  604. * 作用:自动上传到OA后台成功后出发事件
  605. */
  606. function OnAutoUploadSuccess(resp) {
  607. return;
  608. }
  609. /**
  610. * 作用:自动上传到OA后台成功后出发事件
  611. */
  612. function OnAutoUploadFail(resp) {
  613. return;
  614. }
  615. /**
  616. * 按照定时器的时间,自动执行所有文档的自动保存事件
  617. */
  618. function OnDocSaveByAutoTimer() {
  619. var l_Doc;
  620. var l_Count = 0
  621. var l_docCounts = wps.WpsApplication().Documents.Count;
  622. for (l_Count = 0; l_Count < l_docCounts; l_Count++) {
  623. l_Doc = wps.WpsApplication().Documents.Item(l_Count);
  624. if (l_Doc) {
  625. if (pCheckIfOADoc(l_Doc) == true) { // 是否为OA文件
  626. if (pISOADocReadOnly(l_Doc) == false) { // 是否为只读文档
  627. //执行自动上传到OA服务器端的操作
  628. pAutoUploadToServer(l_Doc);
  629. //保存该文档对应的访问过程记录信息
  630. }
  631. }
  632. }
  633. }
  634. }
  635. /**
  636. * 实现一个定时器
  637. */
  638. function OpenTimerRun(funcCallBack) {
  639. var l_mCount = 0; //设置一个计时器,按每分钟执行一次; 10分钟后重复执行
  640. var l_timeID = 0; //用于保存计时器ID值
  641. // 对间隔时间做处理
  642. var l_AutoSaveToServerTime = wps.PluginStorage.getItem(constStrEnum.AutoSaveToServerTime);
  643. if (l_AutoSaveToServerTime == 0) { // 设置为0则不启动定时器
  644. l_timeID = wps.PluginStorage.getItem(constStrEnum.TempTimerID);
  645. clearInterval(l_timeID);
  646. return;
  647. } else if (l_AutoSaveToServerTime < 3) {
  648. l_AutoSaveToServerTime = 3;
  649. }
  650. l_timeID = setInterval(function() {
  651. l_mCount = l_mCount + 1;
  652. if (l_mCount > l_AutoSaveToServerTime) { //l_AutoSaveToServerTime 值由系统配置时设定,见pInitParameters()函数
  653. l_mCount = 0;
  654. funcCallBack(); //每隔l_AutoSaveToServerTime 分钟(例如10分钟)执行一次回调函数
  655. }
  656. }, 60000); //60000 每隔1分钟,执行一次操作(1000*60)
  657. wps.PluginStorage.setItem(constStrEnum.TempTimerID, l_timeID); //保存计时器ID值
  658. }
  659. /**
  660. * 从OA-web端点击套红头
  661. * params : 需要存在以下参数
  662. * 'insertFileUrl':'',获取红头模板接口
  663. * 'bkInsertFile':'' ,正文书签
  664. */
  665. function InsertRedHead(params) {
  666. var wpsApp = wps.WpsApplication();
  667. var activeDoc = wpsApp.ActiveDocument;
  668. if (!activeDoc) {
  669. alert('文档不存在,请先新建一个文档!');
  670. return;
  671. }
  672. var bookmark = GetParamsValue(params, constStrEnum.bkInsertFile);
  673. var strFile = GetParamsValue(params, constStrEnum.insertFileUrl);
  674. if (strFile == "") {
  675. alert("未获取到传入的红头模板URL路径,不能正常套红");
  676. return;
  677. }
  678. if (bookmark == "") {
  679. alert("获取到传入的正文书签,不能正常套红");
  680. return;
  681. }
  682. pInsertRInedHead(activeDoc, strFile, bookmark);
  683. }
  684. /**
  685. * 套红头
  686. * doc :套红头的文档
  687. * strFile :获取红头模板接口
  688. * bookmark :,正文书签
  689. */
  690. function pInsertRInedHead(doc, strFile, bookmark) {
  691. var bookMarks = doc.Bookmarks;
  692. if (bookMarks.Item("quanwen")) { // 当前文档存在"quanwen"书签时候表示已经套过红头
  693. alert("当前文档已套过红头,请勿重复操作!");
  694. return;
  695. }
  696. var wpsApp = wps.WpsApplication();
  697. var activeDoc = wpsApp.ActiveDocument;
  698. var selection = wpsApp.ActiveWindow.Selection;
  699. // 准备以非批注的模式插入红头文件(剪切/粘贴等操作会留有痕迹,故先关闭修订)
  700. activeDoc.TrackRevisions = false;
  701. selection.WholeStory(); //选取全文
  702. bookMarks.Add("quanwen", selection.Range)
  703. selection.Cut();
  704. selection.InsertFile(strFile);
  705. if (bookMarks.Exists(bookmark)) {
  706. var bookmark1 = bookMarks.Item(bookmark);
  707. bookmark1.Range.Select(); //获取指定书签位置
  708. var s = activeDoc.ActiveWindow.Selection;
  709. s.Paste();
  710. } else {
  711. alert("套红头失败,您选择的红头模板没有对应书签:" + bookmark);
  712. }
  713. // 轮询插入书签
  714. var elements = GetDocParamsValue(doc, constStrEnum.redFileElement);
  715. if (elements != "") {
  716. for (var key in elements) {
  717. console.log(key + "----" + elements[key])
  718. if (bookMarks.Exists(key)) {
  719. // 直接插入
  720. var eleBookmark = bookMarks.Item(key);
  721. eleBookmark.Range.Text = elements[key];
  722. }
  723. }
  724. }
  725. // 恢复修订模式(根据传入参数决定)
  726. var l_revisionCtrl = GetDocParamsValue(activeDoc, constStrEnum.revisionCtrl);
  727. activeDoc.TrackRevisions = l_revisionCtrl == "" ? false : l_revisionCtrl.bOpenRevision;
  728. //取消WPS关闭时的提示信息
  729. wps.WpsApplication().DisplayAlerts = wps.Enum&&wps.Enum.wdAlertsNone||0;
  730. }
  731. /**
  732. * 从OA-web端点击套红头
  733. * doc : 需要存在以下属性
  734. * 'insertFileUrl':'',获取红头模板接口
  735. * 'bkInsertFile':'' ,正文书签
  736. */
  737. function InsertRedHeadDoc(doc) { //插入红头
  738. if (!doc) {
  739. alert('文档不存在!');
  740. return;
  741. }
  742. var bookmark = GetDocParamsValue(doc, constStrEnum.bkInsertFile);
  743. var strFile = GetDocParamsValue(doc, constStrEnum.insertFileUrl);
  744. if (strFile == "") {
  745. alert("未获取到系统传入的红头模板URL路径,不能正常套红");
  746. return;
  747. }
  748. if (bookmark == "") {
  749. alert("套红头失败,您选择的红头模板没有正文书签!");
  750. return;
  751. }
  752. pInsertRInedHead(doc, strFile, bookmark)
  753. }
  754. /**
  755. * 打开本地文档,并插入文档
  756. */
  757. function OpenLocalFile() {
  758. var l_FileName = "";
  759. //msoFileDialogFilePicker = 3
  760. var l_FileDialog = wps.WpsApplication().FileDialog(3);
  761. if (l_FileDialog.Show()) {
  762. l_FileName = l_FileDialog.SelectedItems;
  763. if (l_FileName.Count > 0) {
  764. wps.WpsApplication().Selection.InsertFile(l_FileName.Item(1));
  765. }
  766. }
  767. }
  768. /**
  769. * 作用:OA的正文备份按钮操作功能,把OA文件备份一份到指定的OA后台copyUrl路径中
  770. */
  771. function OnUploadOABackupClicked() {
  772. var doc = wps.WpsApplication().ActiveDocument;
  773. if (!doc) {
  774. alert("当前没有打开任何文档");
  775. return;
  776. }
  777. var l_copyUrl = GetDocParamsValue(doc, constStrEnum.copyUrl);
  778. var l_uploadFieldName = GetDocParamsValue(doc, constStrEnum.uploadFieldName);
  779. if (!l_copyUrl) {
  780. alert("系统未传入备份URL路径,不能执行备份!");
  781. return;
  782. }
  783. if (!l_uploadFieldName) {
  784. l_uploadFieldName = "file";
  785. }
  786. // 默认保存为新文档,走上传文档的接口
  787. UploadFile(doc.Name, doc.FullName, l_copyUrl, l_uploadFieldName, OnBackupSuccess, OnBackupFail);
  788. }
  789. /**
  790. * 备份成功后的回调
  791. */
  792. function OnBackupSuccess() {
  793. wps.alert("备份上传成功");
  794. }
  795. /**
  796. * 备份失败后的回调
  797. */
  798. function OnBackupFail() {
  799. wps.alert("备份失败");
  800. }