func_docProcess.js 39 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352
  1. /**
  2. * 打开服务器上的文件
  3. * @param {*} fileUrl 文件url路径
  4. */
  5. function OpenFile(params) {
  6. var l_strFileUrl = params.fileName //来自OA网页端的OA文件下载路径
  7. var doc
  8. var l_IsOnlineDoc = false //默认打开的是不落地文档
  9. if (!l_strFileUrl) return
  10. //判断是否打印
  11. //下载文档之前,判断是否已下载该文件
  12. if (
  13. pCheckIsExistOpenOADoc(l_strFileUrl) == true &&
  14. params.action !== 'printdocument'
  15. ) {
  16. //如果找到相同OA地址文档,则给予提示
  17. //根据OA助手对是否允许再次打开相同文件的判断处理
  18. var l_AllowOADocReOpen = false
  19. l_AllowOADocReOpen = wps.PluginStorage.getItem(
  20. constStrEnum.AllowOADocReOpen
  21. )
  22. if (l_AllowOADocReOpen == false) {
  23. ShowMessage(
  24. '已打开相同的OA文件,请关闭之前的文件,再次打开',
  25. 'warning',
  26. 5
  27. )
  28. return null
  29. } else {
  30. //处理重复打开相同OA 文件的方法
  31. ShowConfirm('当前环境已打开该文件,是否重新再打开一份?', 'info', {
  32. btns: [
  33. {
  34. key: 'ok',
  35. text: '确定',
  36. primary: true,
  37. callback: function () {
  38. wps.WpsApplication().Documents.OpenFromUrl(l_strFileUrl, '', '')
  39. //重复打开的文档采用不落地的方式打开
  40. // 不落地方式打开文档判断落地比较多,V1版本先暂时关闭
  41. l_IsOnlineDoc = true
  42. doc = wps.WpsApplication().ActiveDocument
  43. pOpenFile(doc, params, l_IsOnlineDoc)
  44. },
  45. },
  46. { key: 'cancel', text: '取消' },
  47. ],
  48. })
  49. }
  50. } else {
  51. //如果当前没有打开文档,则另存为本地文件,再打开
  52. let fileName = GetFileNameByParams(params)
  53. if (params.action == 'taoda' && !!params.oldDocName)
  54. fileName = params.oldDocName
  55. DownloadFile(
  56. l_strFileUrl,
  57. fileName,
  58. params.action == 'printdocument' //打印文档操作保存随机路径
  59. )
  60. .then((path) => {
  61. if (path == '') {
  62. ShowMessage(
  63. '从服务端下载路径:' + l_strFileUrl + '\n' + '获取文件下载失败!',
  64. 'error'
  65. )
  66. return null
  67. }
  68. doc = pDoOpenOADocProcess(params, path)
  69. pOpenFile(doc, params, l_IsOnlineDoc)
  70. })
  71. .catch((msg) => {
  72. ShowMessage(`下载文件[${fileName}]失败!${msg}`, 'error', 5)
  73. OAWebNotice(fileName)
  74. })
  75. }
  76. }
  77. /**
  78. * 作用:文档打开后执行的动作集合
  79. * @param {*} doc 文档对象
  80. * @param {*} params 前端传递的参数集合
  81. * @param {*} isOnlineDoc 在线打开/落地打开
  82. */
  83. function pOpenFile(doc, params, isOnlineDoc) {
  84. var l_IsOnlineDoc = isOnlineDoc
  85. //设置当前文档为 本地磁盘落地模式
  86. if (l_IsOnlineDoc == true) {
  87. DoSetOADocLandMode(doc, EnumDocLandMode.DLM_OnlineDoc)
  88. } else {
  89. DoSetOADocLandMode(doc, EnumDocLandMode.DLM_LocalDoc)
  90. }
  91. var forceupload = false
  92. var action = params.action
  93. if (!!params.fileparam.WaterMark) {
  94. SetDocParamsValue(doc, constStrEnum.WaterMark, true)
  95. var args = [doc, params.fileparam.WaterMark]
  96. if (
  97. params.fileparam.WaterMarkParam &&
  98. params.fileparam.WaterMarkParam.length > 0
  99. ) {
  100. var arr = params.fileparam.WaterMarkParam.split('|').filter(Boolean)
  101. if (arr.length == 4) args = args.concat(arr)
  102. else loginfo('水印参数错误,默认忽略')
  103. }
  104. WaterMark && WaterMark.SetWaterMark.apply(this, args)
  105. //doc.Save()
  106. }
  107. if (action != null) {
  108. switch (action) {
  109. case 'qinggao':
  110. clearRevDoc(doc) //清稿业务
  111. forceupload = true
  112. break
  113. case 'taoda':
  114. pInsertRInedHead(
  115. doc,
  116. wps.PluginStorage.getItem('ModelUrl'),
  117. wps.PluginStorage.getItem('ContentFieldName'),
  118. params
  119. )
  120. forceupload = true
  121. break
  122. case 'updateregion':
  123. UpdateRegion(doc, params)
  124. forceupload = true
  125. break
  126. case 'printdocument':
  127. UpdateRegion(doc, params)
  128. wps.OAAssist.WebNotify(doc.Name)
  129. break
  130. case 'gaizhang':
  131. pInsertYinzhang(
  132. doc,
  133. wps.PluginStorage.getItem('ModelUrl'),
  134. wps.PluginStorage.getItem('ContentFieldName')
  135. )
  136. forceupload = true
  137. break
  138. case 'convertpdf':
  139. OnDoChangeToOtherDocFormat('.pdf')
  140. break
  141. case 'convertofd':
  142. OnDoChangeToOtherDocFormat('.ofd')
  143. break
  144. case 'saveAs':
  145. if (getBoolean(params.fileparam.AutoAcceptRevisions, false)) {
  146. clearRevDoc(doc)
  147. }
  148. break
  149. }
  150. }
  151. var l_ProtectType = -1
  152. if (!!params.openType && params.openType.hasOwnProperty('protectType'))
  153. l_ProtectType = params.openType.protectType
  154. var l_bOpenRevision = false //初始化关闭修订模式
  155. var l_bShowRevision = getBoolean(params.fileparam.UseMark, true) //是否显示修订记录
  156. if (l_ProtectType == 0) {
  157. l_bOpenRevision = true
  158. }
  159. if (params.openType && params.openType.protectType > -1)
  160. SetOADocProtect(doc, params.openType.protectType, constStrEnum.docPassWord)
  161. var l_revisionmMode = getNumber(params.fileparam.MarkupMode, 1)
  162. //设置文档修订状态
  163. DoOADocOpenRevision(doc, l_bOpenRevision, l_bShowRevision, l_revisionmMode)
  164. //doc.Save()
  165. if (forceupload) {
  166. SetDocParamsValue(doc, constStrEnum.OriginalRsid, -1)
  167. }
  168. doc.Saved = true // 手动设定标志位
  169. if (
  170. !(l_ProtectType >= 2 || Heart.ACTIONS_WITHOUT_HEART.indexOf(action) != -1)
  171. ) {
  172. //可编辑和非打印模式下才设置心跳
  173. //设定心跳值
  174. Heart.OpendOADocument(doc)
  175. }
  176. if (action == 'saveAs') {
  177. SaveAsAndClose(doc, params)
  178. return doc
  179. }
  180. if (params.fileparam.IsMaximization == false) {
  181. //静默模式
  182. doc.Close()
  183. return doc
  184. }
  185. // 触发切换窗口事件
  186. OnWindowActivate()
  187. loginfo('文档加载完成')
  188. setTimeout(function () {
  189. toggleBeforeOAfterLoading()
  190. //小文件二次调用,以保证loading窗口消失
  191. setTimeout(function () {
  192. toggleBeforeOAfterLoading()
  193. }, 1000)
  194. }, 200)
  195. return doc
  196. }
  197. /**
  198. * 书签填充
  199. * @param {wps.document} doc
  200. * @param {Object} params
  201. */
  202. function UpdateRegion(doc, params) {
  203. // var elements = wps.PluginStorage.getItem("values");
  204. var tempvalues = params.values
  205. let Bookmarks = doc.Bookmarks
  206. if (typeof tempvalues === 'string') {
  207. var arrelements = tempvalues.split('|')
  208. for (var i = 0; i < arrelements.length; i++) {
  209. if (arrelements[i] != '') {
  210. var bookmark = Bookmarks.Item(arrelements[i].split('=')[0])
  211. if (bookmark) {
  212. var content = arrelements[i].split('=')[1]
  213. replaceBookmarkContent(doc, bookmark, content)
  214. }
  215. }
  216. }
  217. }
  218. if (tempvalues != null && typeof tempvalues === 'object') {
  219. // var tempvalues = params.values;
  220. for (let key in tempvalues) {
  221. if (
  222. typeof tempvalues[key] == 'string' ||
  223. typeof tempvalues[key] == 'number'
  224. ) {
  225. var content = tempvalues[key]
  226. var bookmark = Bookmarks.Item(key)
  227. if (bookmark) {
  228. if (content.length > 50 && Base64.isBase64(content)) {
  229. repalceImg(doc, content, bookmark)
  230. } else replaceBookmarkContent(doc, bookmark, content)
  231. }
  232. var documentfield = wps
  233. .WpsApplication()
  234. .ActiveDocument.DocumentFields.Item(key)
  235. if (documentfield) {
  236. documentfield.Value = content
  237. }
  238. }
  239. }
  240. for (let key in tempvalues) {
  241. if (typeof tempvalues[key] != 'string') {
  242. if (doc.Bookmarks.Exists(key)) {
  243. var bookmark = Bookmarks.Item(key)
  244. bookmark.Select()
  245. doc.Application.Selection.Copy()
  246. //string value = base64Decode(item.Value.Value);
  247. var valuecount = tempvalues[key].length
  248. if (valuecount < 1) {
  249. bookmark.Range.Text = ''
  250. } else {
  251. for (let va in tempvalues[key]) {
  252. valuecount = valuecount - 1
  253. for (let vava in tempvalues[key][va]) {
  254. bookmark.Select()
  255. doc.Application.Selection.Find.ClearFormatting()
  256. doc.Application.Selection.Find.Text = '${' + vava + '}'
  257. doc.Application.Selection.Find.Forward = true
  258. doc.Application.Selection.Find.Wrap = 1
  259. doc.Application.Selection.Find.Execute()
  260. if (doc.Application.Selection.Find.Found == true) {
  261. var markvalue = String(tempvalues[key][va][vava])
  262. if (
  263. markvalue.indexOf('data:') != -1 &&
  264. markvalue.indexOf('base64') != -1
  265. ) {
  266. // doc.Application.Selection.TypeText(' ')
  267. //doc.Application.Selection.AddPictureBase64(tempvalues[key][va][vava]);
  268. doc.Shapes.AddBase64Picture(markvalue)
  269. } else if (
  270. markvalue.length > 50 &&
  271. Base64.isBase64(markvalue)
  272. ) {
  273. addBasePictureToBookMark(doc, markvalue, bookmark)
  274. } else if (markvalue.indexOf('&inserturl&') > -1) {
  275. var link = markvalue.replace('&inserturl&', '').split('|')
  276. doc.Hyperlinks.Add(
  277. doc.Application.Selection.Range,
  278. link[1],
  279. null,
  280. link[1],
  281. link[0]
  282. )
  283. } else {
  284. doc.Application.Selection.TypeText(
  285. getEmptyBookmarkText(markvalue)
  286. )
  287. }
  288. }
  289. }
  290. if (valuecount > 0) {
  291. bookmark.Delete()
  292. doc.Application.Selection.EndKey(5)
  293. doc.Application.Selection.TypeParagraph()
  294. doc.Application.Selection.ParagraphFormat.Alignment = 0
  295. doc.Application.Selection.PasteAndFormat(16)
  296. }
  297. }
  298. }
  299. }
  300. }
  301. }
  302. }
  303. }
  304. /**
  305. * 获取空标签内容
  306. * @param {string} txt
  307. * @returns
  308. */
  309. function getEmptyBookmarkText(txt) {
  310. if (typeof txt == 'number') return String(txt)
  311. if (!!txt) return txt
  312. return ' '
  313. }
  314. function getContentLength(txt) {
  315. return txt.replace(/\r\n/gi, '\n').length
  316. }
  317. function replaceBookmarkContent(doc, bookmark, content) {
  318. var start = bookmark.Range.Start
  319. var end = bookmark.Range.End
  320. var label = '',
  321. link = ''
  322. if (typeof content == 'string' && content.indexOf('&inserturl&') > -1) {
  323. var tmp = content.replace('&inserturl&', '').split('|')
  324. label = getEmptyBookmarkText(tmp[0])
  325. link = tmp[1]
  326. } else {
  327. label = getEmptyBookmarkText(content)
  328. }
  329. bookmark.Range.InsertBefore(label)
  330. var contentLength = getContentLength(label)
  331. if (bookmark.Empty) {
  332. wps.Application.Selection.SetRange(start, start + contentLength)
  333. var range = wps.Application.Selection.Range
  334. var name = bookmark.Name
  335. bookmark.Delete()
  336. doc.Bookmarks.Add(name, range)
  337. if (!!link) doc.Hyperlinks.Add(range, link)
  338. return range
  339. } else {
  340. wps.Application.Selection.SetRange(
  341. start + contentLength,
  342. end + contentLength
  343. )
  344. wps.Application.Selection.Delete()
  345. if (!!link) doc.Hyperlinks.Add(bookmark.Range, link)
  346. return bookmark.Range
  347. }
  348. }
  349. function checkBs() {
  350. var bs = wps.ActiveDocument.Bookmarks.Count
  351. for (var i = 1; i <= bs; i++) {
  352. wps.ActiveDocument.Bookmarks.Item(i).Select()
  353. var b = wps.ActiveDocument.Bookmarks.Item(i)
  354. var txt = b.Range.Text.replace(/\r\n/, '↵').replace(/\t/, '→')
  355. console.log(
  356. `${b.Name.padStart(20, ' ')}:${b.Range.Start}-${b.Range.End}:${txt}`
  357. )
  358. b.Select()
  359. if (wps.Application.Selection.Bookmarks.Count > 1) {
  360. var ibs = wps.Application.Selection.Bookmarks
  361. console.log('覆盖标签' + ibs.Count)
  362. for (var j = 1; j <= ibs.Count; j++) {
  363. console.log(ibs.Item(j).Name)
  364. }
  365. }
  366. }
  367. }
  368. /**
  369. * 添加印章
  370. * @param {wps.document} doc
  371. * @param {string} strFile 印章文件路径
  372. * @param {string} postion 文件名字
  373. */
  374. function pInsertYinzhang(doc, strFile, postion) {
  375. let Bookmarks = doc.Bookmarks
  376. var bookmark = Bookmarks.Item(postion)
  377. if (bookmark) {
  378. bookmark.Range.InsertFile(strFile)
  379. } else {
  380. doc.Application.Selection.EndKey(6)
  381. doc.Application.Selection.InsertFile(strFile)
  382. }
  383. wps.FileSystem.Remove(strFile) //删除临时文件
  384. }
  385. /**
  386. * 打开服务端的文档(不落地)
  387. * @param {*} fileUrl 文件url路径
  388. */
  389. function OpenOnLineFile(OAParams) {
  390. //OA参数如果为空的话退出
  391. if (!OAParams) return
  392. //获取在线文档URL
  393. var l_OAFileUrl = OAParams.fileName
  394. var l_doc
  395. if (l_OAFileUrl) {
  396. //下载文档不落地(16版WPS的925后支持)
  397. wps
  398. .WpsApplication()
  399. .Documents.OpenFromUrl(
  400. l_OAFileUrl,
  401. 'OnOpenOnLineDocSuccess',
  402. 'OnOpenOnLineDocDownFail'
  403. )
  404. l_doc = wps.WpsApplication().ActiveDocument
  405. }
  406. //执行文档打开后的方法
  407. pOpenFile(l_doc, OAParams, true)
  408. return l_doc
  409. }
  410. /**
  411. * 打开在线文档成功后触发事件
  412. * @param {*} resp
  413. */
  414. function OnOpenOnLineDocSuccess(resp) {}
  415. /**
  416. * 打开在线不落地文档出现失败时,给予错误提示
  417. */
  418. function OnOpenOnLineDocDownFail() {
  419. ShowMessage('打开在线不落地文档失败!请尝试重新打开。', 'error', 5, true)
  420. return
  421. }
  422. /**
  423. * 参数:
  424. * doc : 当前OA文档的Document对象
  425. * DocLandMode : 落地模式设置
  426. */
  427. function DoSetOADocLandMode(doc, DocLandMode) {
  428. if (!doc) return
  429. // var l_Param = wps.PluginStorage.getItem(doc.DocID);
  430. // var l_objParam = JSON.parse(l_Param);
  431. // //增加属性,或设置
  432. // l_objParam.OADocLandMode = DocLandMode; //设置OA文档的落地标志
  433. // var l_p = JSON.stringify(l_objParam);
  434. // //将OA文档落地模式标志存入系统变量对象保存
  435. // wps.PluginStorage.setItem(doc.DocID, l_p);
  436. SetDocParamsValue(doc, 'OADocLandMode', DocLandMode)
  437. }
  438. /**
  439. * 作用:打开文档处理的各种过程,包含:打开带密码的文档,保护方式打开文档,修订方式打开文档等种种情况
  440. * params Object OA Web端传来的请求JSON字符串,具体参数说明看下面数据
  441. * TempLocalFile : 字符串 先把文档从OA系统下载并保存在Temp临时目录,这个参数指已经下载下来的本地文档地址
  442. * ----------------------以下是OA参数的一些具体规范名称
  443. * docId String 文档ID
  444. * uploadPath String 保存文档接口
  445. * fileName String 获取服务器文档接口(不传即为新建空文档)
  446. * suffix String ".pdf|.uot",可传多个,用“|”分割,保存时会按照所传的值转成对应的格式文档并上传
  447. * userName String 用于更改显示修改人的用户名
  448. * strBookmarkDataPath string 书签列表 (可不传,可以在OA助手config.js中配置)
  449. * templatePath string 模板列表 (可不传,可以在OA助手config.js中配置)
  450. * buttonGroups string 自定义按钮组 (可不传,不传显示所有按钮)
  451. * revisionCtrl String 痕迹控制 ,不传正常打开
  452. * bOpenRevision String true(打开)false(关闭)修订
  453. * bShowRevision String true(显示)/false(关闭)痕迹
  454. * openType String 文档打开方式 ,不传正常打开
  455. * protectType String 文档保护类型,-1:不启用保护模式,0:只允许对现有内容进行修订,1:只允许添加批注,2:只允许修改窗体域,3:只读
  456. * password String密码
  457. */
  458. function pDoOpenOADocProcess(params, TempLocalFile) {
  459. // var l_ProtectType = -1; //默认文档保护类型 -1 为不启用保护
  460. var l_ProtectPassword = '' //默认文档密码为空
  461. var l_strDocPassword = '' //打开文档密码参数
  462. // var l_bOpenRevision = false; //初始化关闭修订模式
  463. // var l_bShowRevision = false; //初始化不显示修订气泡样式
  464. for (var _key in params) {
  465. var key = (_key || '').toUpperCase()
  466. switch (
  467. key.toUpperCase() //
  468. ) {
  469. case 'userName'.toUpperCase(): //修改当前文档用户名
  470. wps.WpsApplication().Options.UseLocalUserInfo = true
  471. wps.WpsApplication().UserName = params[key]
  472. break
  473. case 'openType'.toUpperCase():
  474. // l_ProtectType = params[key].protectType; //获取OA传来的文档保护类型
  475. l_ProtectPassword = constStrEnum.docPassWord //获取OA传来的保护模式下的文档密码
  476. break
  477. case 'revisionCtrl'.toUpperCase(): //限制修订状态
  478. l_bOpenRevision = params[_key].bOpenRevision
  479. l_bShowRevision = params[_key].bShowRevision
  480. break
  481. case 'buttonGroups'.toUpperCase(): //按钮组合
  482. break
  483. case 'docPassword'.toUpperCase(): //传入打开文件的密码
  484. l_strDocPassword = params[_key].docPassword
  485. break
  486. }
  487. }
  488. var l_Doc
  489. // Open方法的参数说明如下
  490. //Function Open(FileName, [ConfirmConversions], [ReadOnly], [AddToRecentFiles],
  491. // [PasswordDocument], [PasswordTemplate], [Revert], [WritePasswordDocument],
  492. // [WritePasswordTemplate], [Format], [Encoding], [Visible],
  493. // [OpenAndRepair], [DocumentDirection], [NoEncodingDialog], [XMLTransform]) As Document
  494. loginfo('Document.Open')
  495. l_Doc = wps
  496. .WpsApplication()
  497. .Documents.Open(TempLocalFile, false, false, false, l_strDocPassword)
  498. loginfo('Document.Open完成')
  499. //设置文档修订状态
  500. l_Doc.Unprotect(constStrEnum.docPassWord)
  501. l_Doc.TrackRevisions = false
  502. //打开文档的方法中统一处理参数存储到doc中
  503. var Persist = getBoolean(params.fileparam.AllowSaveAs, true)
  504. var RevisionsMode = getNumber(params.fileparam.MarkupMode, 1)
  505. var ps = Object.assign(
  506. {
  507. isOA: EnumOAFlag.DocFromOA,
  508. SourcePath: l_Doc.FullName,
  509. TempLocalFile,
  510. Persist,
  511. RevisionsMode,
  512. },
  513. params
  514. )
  515. ps[constStrEnum.OriginalRsid] = l_Doc.CurrentRsid
  516. SetDocParamsValues(l_Doc, ps)
  517. return l_Doc
  518. }
  519. /**
  520. * protectType: '', 文档保护模式( -1:不启用保护模式,
  521. * 0:只允许对现有内容进行修订,
  522. * 1:只允许添加批注,
  523. * 2:只允许修改窗体域,
  524. * 3:只读)
  525. * @param {*} protectType
  526. * @param {*} doc
  527. */
  528. function SetOADocProtect(doc, protectType, ProtectPassword) {
  529. if (!doc) return //校验文档是否存在
  530. if ([0, 1, 2, 3].indexOf(protectType) !== -1) {
  531. // 保护文档如果之前有被保护,再次保护会出问题,需要先解除保护
  532. doc.Unprotect()
  533. // ** 方法参数
  534. // ** Protect(Type As WdProtectionType, [NoReset], [Password], [UseIRM], [EnforceStyleLock])
  535. doc.Protect(protectType, false, ProtectPassword, false)
  536. // doc.Save()
  537. }
  538. return
  539. }
  540. /**
  541. * 打开/关闭修订
  542. * @param {*} doc :传入文档对象
  543. * @param {*} bOpenRevision : 布尔值,是否允许打开修订模式,true:打开/false:关闭
  544. * @param {*} bOpenRevision : 布尔值,是否显示修订痕迹状态
  545. * 返回值:无
  546. */
  547. function DoOADocOpenRevision(
  548. doc,
  549. bOpenRevision,
  550. bShowRevision,
  551. l_revisionmMode
  552. ) {
  553. if (!doc) return
  554. doc.TrackRevisions = bOpenRevision //如果标记对指定文档的修改,则该属性值为True
  555. wps
  556. .WpsApplication()
  557. .CommandBars.ExecuteMso('KsoEx_RevisionCommentModify_Disable') //去掉修改痕迹信息框中的接受修订和拒绝修订勾叉,使其不可用
  558. var l_v = doc.ActiveWindow.View
  559. l_v.ShowRevisionsAndComments = bShowRevision //如果为True,则 WPS 显示使用“修订”功能对文档所作的修订和批注
  560. l_v.RevisionsBalloonShowConnectingLines = bShowRevision //如果为 True,则 WPS 显示从文本到修订和批注气球之间的连接线
  561. l_v.RevisionsMode = l_revisionmMode //2为不支持气泡显示。
  562. return
  563. }
  564. /**
  565. * 描述:如何处理再次打开相同的OA文件
  566. * 返回值:打开的Document对象
  567. */
  568. function pReOpenOADoc(OADocURL) {
  569. if (wps.confirm('当前环境已打开该文件,是否重新再打开一份?')) {
  570. //如果用户选择再次打开,则用在线方式打开
  571. wps.WpsApplication().Documents.OpenFromUrl(OADocURL, '', '')
  572. }
  573. }
  574. /**
  575. * 功能说明:判断是否已存在来自OA的已打开的文档
  576. * @param {字符串} FileURL
  577. */
  578. function pCheckIsExistOpenOADoc(FileURL) {
  579. var l_DocCount = wps.WpsApplication().Documents.Count
  580. if (l_DocCount <= 0) return false
  581. //轮询检查当前已打开的WPS文档中,是否存在OA相同的文件
  582. if (l_DocCount >= 1) {
  583. for (var l_index = 1; l_index <= l_DocCount; l_index++) {
  584. var l_objDoc = wps.WpsApplication().Documents.Item(l_index)
  585. var l_strParam = wps.PluginStorage.getItem(GetUniqueId(l_objDoc))
  586. if (l_strParam == null) continue
  587. var l_objParam = JSON.parse(l_strParam)
  588. if (l_objParam.fileName == FileURL) {
  589. return true
  590. }
  591. }
  592. return false
  593. }
  594. }
  595. /**
  596. * 作用:
  597. * @param {*} suffix :文档后缀明:.pdf 或 .uot 或 .uof
  598. * @param {*} doc
  599. * @param {*} uploadPath
  600. * @param {} FieldName : 上传到服务器端的字段名称,可由OA传入的参数设置
  601. *
  602. * 返回值:是否执行了上传操作,布尔值
  603. */
  604. function handleFileAndUpload(suffix, doc, uploadPath, FieldName) {
  605. var l_strChangeFileName = '' // 转换格式后的文件名称
  606. var l_strPath = '' // 转换格式后的文件路径
  607. var l_FieldName = FieldName
  608. if (!doc) {
  609. return false
  610. }
  611. if (!l_FieldName) {
  612. l_FieldName = 'file' //默认情况下,设置为 file 字段名称
  613. }
  614. var l_DocSourcePath = doc.FullName //保留当前文档明,在SaveAs使用后再保存回原来的文件明
  615. //Sub ExportAsFixedFormat(OutputFileName As String, ExportFormat As WdExportFormat,
  616. // [OpenAfterExport As Boolean = False],
  617. // [OptimizeFor As WdExportOptimizeFor = wdExportOptimizeForPrint],
  618. // [Range As WdExportRange = wdExportAllDocument], [From As Long = 1],
  619. // [To As Long = 1], [Item As WdExportItem = wdExportDocumentContent],
  620. // [IncludeDocProps As Boolean = False], [KeepIRM As Boolean = True],
  621. // [CreateBookmarks As WdExportCreateBookmarks = wdExportCreateNoBookmarks],
  622. // [DocStructureTags As Boolean = True], [BitmapMissingFonts As Boolean = True],
  623. // [UseISO19005_1 As Boolean = False], [FixedFormatExtClassPtr])
  624. // Const wdExportFormatPDF = 17 (&H11)
  625. // Const wdExportFormatXPS = 18 (&H12)
  626. //
  627. //处理水印 隐藏,上传后再显示在回调里面
  628. // WaterMark.Hidden(doc);
  629. // doc.Save();
  630. //根据传入的 后缀文件名称进行不同的转换文档操作
  631. switch (suffix.toLocaleLowerCase()) {
  632. case '.pdf':
  633. l_strPath = pGetValidDocTempPath(doc) + '.pdf' //获取有效输出路径
  634. wps.FileSystem.Remove(l_strPath) //先删除之前可能存在的临时文件
  635. doc.ExportAsFixedFormat(l_strPath, wps.Enum.wdFormatPDF, true) //文档另存为PDF格式
  636. l_strChangeFileName = doc.Name.split('.')[0] + '.pdf'
  637. UploadFile(
  638. l_strChangeFileName,
  639. l_strPath,
  640. uploadPath,
  641. l_FieldName,
  642. doc,
  643. OnChangeSuffixUploadSuccess,
  644. OnChangeSuffixUploadFail
  645. )
  646. break
  647. case '.uof':
  648. l_strPath = pGetValidDocTempPath(doc) + suffix
  649. wps.FileSystem.Remove(l_strPath) //先删除之前可能存在的临时文件
  650. doc.ExportAsFixedFormat(
  651. l_strPath,
  652. wps.Enum.wdFormatOpenDocumentText,
  653. true
  654. ) //转换文件格式
  655. doc.SaveAs2(l_strPath)
  656. l_strChangeFileName = doc.Name.split('.')[0] + suffix
  657. UploadFile(
  658. l_strChangeFileName,
  659. l_strPath,
  660. uploadPath,
  661. l_FieldName,
  662. doc,
  663. OnChangeSuffixUploadSuccess,
  664. OnChangeSuffixUploadFail
  665. )
  666. doc.SaveAs2(l_DocSourcePath) //保存回原来的文档内容
  667. break
  668. case '.uot':
  669. l_strPath = pGetValidDocTempPath(doc) + suffix
  670. wps.FileSystem.Remove(l_strPath) //先删除之前可能存在的临时文件
  671. doc.ExportAsFixedFormat(
  672. l_strPath,
  673. wps.Enum.wdFormatOpenDocumentText,
  674. true
  675. )
  676. doc.SaveAs2(l_strPath)
  677. l_strChangeFileName = doc.Name.split('.')[0] + suffix
  678. UploadFile(
  679. l_strChangeFileName,
  680. l_strPath,
  681. uploadPath,
  682. l_FieldName,
  683. doc,
  684. OnChangeSuffixUploadSuccess,
  685. OnChangeSuffixUploadFail
  686. )
  687. doc.SaveAs2(l_DocSourcePath) //保存回原来的文档内容
  688. break
  689. case '.ofd':
  690. l_strPath = pGetValidDocTempPath(doc) + suffix
  691. wps.FileSystem.Remove(l_strPath) //先删除之前可能存在的临时文件
  692. doc.ExportAsFixedFormat(
  693. l_strPath,
  694. wps.Enum.wdFormatOpenDocumentText,
  695. true
  696. )
  697. doc.SaveAs2(l_strPath)
  698. l_strChangeFileName = doc.Name.split('.')[0] + suffix
  699. UploadFile(
  700. l_strChangeFileName,
  701. l_strPath,
  702. uploadPath,
  703. l_FieldName,
  704. doc,
  705. OnChangeSuffixUploadSuccess,
  706. OnChangeSuffixUploadFail
  707. )
  708. doc.SaveAs2(l_DocSourcePath) //保存回原来的文档内容
  709. break
  710. default:
  711. l_strPath = pGetValidDocTempPath(doc) + suffix
  712. wps.FileSystem.Remove(l_strPath) //先删除之前可能存在的临时文件
  713. doc.SaveAs2(l_strPath)
  714. l_strChangeFileName = doc.Name.split('.')[0] + suffix
  715. UploadFile(
  716. l_strChangeFileName,
  717. l_strPath,
  718. uploadPath,
  719. l_FieldName,
  720. doc,
  721. OnChangeSuffixUploadSuccess,
  722. OnChangeSuffixUploadFail
  723. )
  724. doc.SaveAs2(l_DocSourcePath) //保存回原来的文档内容
  725. break
  726. }
  727. wps.FileSystem.Remove(l_strPath) //上载完成后,删除临时文件
  728. //wps.OAAssist.WebNotify("fnRefreshFileList");
  729. return true
  730. }
  731. /**
  732. * 作用:获取一个有效的临时文档路径,用于保存转换格式后的文档
  733. * @param {*} doc
  734. */
  735. function pGetValidDocTempPath(doc) {
  736. if (!doc) {
  737. return
  738. }
  739. if (doc.Path == '') {
  740. //对于不落地文档,文档路径为空
  741. return wps.Env.GetTempPath()
  742. } else {
  743. return doc.FullName.split('.')[0]
  744. }
  745. }
  746. /**
  747. * 作用:转格式保存上传成功后,触发这个事件的回调
  748. * @param {} response
  749. */
  750. function OnChangeSuffixUploadSuccess(response) {
  751. // WaterMark.Show();
  752. l_result = handleResultBody(response)
  753. ShowMessage('文件转格式保存成功!', 'success')
  754. }
  755. /**
  756. * 作用:转格式保存失败,触发失败事件回调
  757. * @param {*} response
  758. */
  759. function OnChangeSuffixUploadFail(doc, response) {
  760. // WaterMark.Show();
  761. OnUploadFileFail(doc, response, false)
  762. }
  763. /**
  764. * 解析返回response的参数
  765. * @param {*} resp
  766. * @return {*} body
  767. */
  768. function handleResultBody(resp) {
  769. var l_result = ''
  770. if (resp.Body) {
  771. //解析返回response的参数
  772. }
  773. return l_result
  774. }
  775. /**
  776. * 把OA文件的当前编辑内容,自动提交到OA后台
  777. * 当前没有使用
  778. */
  779. function pAutoUploadToServer(p_Doc) {
  780. if (!p_Doc) {
  781. return
  782. }
  783. /**
  784. * 参数定义:OAAsist.UploadFile(name, path, url, field, "OnSuccess", "OnFail")
  785. * 上传一个文件到远程服务器。
  786. * name:为上传后的文件名称;
  787. * path:是文件绝对路径;
  788. * url:为上传地址;
  789. * field:为请求中name的值;
  790. * 最后两个参数为回调函数名称;
  791. */
  792. var l_uploadPath = GetDocParamsValue(p_Doc, constStrEnum.uploadPath) // 文件上载路径
  793. if (l_uploadPath == '') {
  794. //wps.alert("系统未传入文件上载路径,不能执行上传操作!");
  795. return
  796. }
  797. var l_FieldName = GetDocParamsValue(p_Doc, constStrEnum.uploadFieldName) //上载到后台的字段名称
  798. if (l_FieldName == '') {
  799. l_FieldName = wps.PluginStorage.getItem(constStrEnum.DefaultUploadFieldName) // 默认为‘file’
  800. }
  801. var l_UploadName = GetDocParamsValue(p_Doc, constStrEnum.uploadFileName) //设置OA传入的文件名称参数
  802. if (l_UploadName == '') {
  803. l_UploadName = p_Doc.Name //默认文件名称就是当前文件编辑名称
  804. }
  805. var l_DocPath = p_Doc.FullName // 文件所在路径
  806. if (pIsOnlineOADoc(p_Doc) == false) {
  807. console.log('落地文档自动保存')
  808. //对于本地磁盘文件上传OA,先用Save方法保存后,在上传
  809. //设置用户保存按钮标志,避免出现禁止OA文件保存的干扰信息
  810. wps.PluginStorage.setItem(
  811. constStrEnum.OADocUserSave,
  812. EnumDocSaveFlag.OADocSave
  813. )
  814. p_Doc.Save() //执行一次保存方法
  815. //设置用户保存按钮标志
  816. wps.PluginStorage.setItem(
  817. constStrEnum.OADocUserSave,
  818. EnumDocSaveFlag.NoneOADocSave
  819. )
  820. //落地文档,调用UploadFile方法上传到OA后台
  821. try {
  822. //调用OA助手的上传方法
  823. UploadFile(
  824. l_UploadName,
  825. l_DocPath,
  826. l_uploadPath,
  827. l_FieldName,
  828. p_Doc,
  829. OnAutoUploadSuccess,
  830. OnAutoUploadFail
  831. )
  832. } catch (err) {
  833. ShowMessage(
  834. '上传文件失败!请检查系统上传参数及网络环境!',
  835. 'error',
  836. 5,
  837. true
  838. )
  839. }
  840. } else {
  841. console.log('不落地文档自动保存')
  842. // 不落地的文档,调用 Document 对象的不落地上传方法
  843. wps.PluginStorage.setItem(
  844. constStrEnum.OADocUserSave,
  845. EnumDocSaveFlag.OADocSave
  846. )
  847. try {
  848. //调用不落地上传方法
  849. p_Doc.SaveAsUrl(
  850. l_UploadName,
  851. l_uploadPath,
  852. l_FieldName,
  853. 'OnAutoUploadSuccess',
  854. 'OnAutoUploadFail'
  855. )
  856. } catch (err) {}
  857. wps.PluginStorage.setItem(
  858. constStrEnum.OADocUserSave,
  859. EnumDocSaveFlag.NoneOADocSave
  860. )
  861. }
  862. }
  863. /**
  864. * 作用:自动上传到OA后台成功后出发事件
  865. */
  866. function OnAutoUploadSuccess(resp) {
  867. return
  868. }
  869. /**
  870. * 作用:自动上传到OA后台成功后出发事件
  871. */
  872. function OnAutoUploadFail(resp) {
  873. ShowMessage(resp, 'error', 5, true)
  874. return
  875. }
  876. /**
  877. * 实现一个定时器
  878. */
  879. function OpenTimerRun(funcCallBack) {
  880. var l_mCount = 0 //设置一个计时器,按每分钟执行一次; 10分钟后重复执行
  881. var l_timeID = 0 //用于保存计时器ID值
  882. // 对间隔时间做处理
  883. var l_AutoSaveToServerTime = wps.PluginStorage.getItem(
  884. constStrEnum.AutoSaveToServerTime
  885. )
  886. if (l_AutoSaveToServerTime == 0) {
  887. // 设置为0则不启动定时器
  888. l_timeID = wps.PluginStorage.getItem(constStrEnum.TempTimerID)
  889. clearInterval(l_timeID)
  890. return
  891. } else if (l_AutoSaveToServerTime < 3) {
  892. l_AutoSaveToServerTime = 3
  893. }
  894. l_timeID = setInterval(function () {
  895. l_mCount = l_mCount + 1
  896. if (l_mCount > l_AutoSaveToServerTime) {
  897. //l_AutoSaveToServerTime 值由系统配置时设定,见pInitParameters()函数
  898. l_mCount = 0
  899. funcCallBack() //每隔l_AutoSaveToServerTime 分钟(例如10分钟)执行一次回调函数
  900. }
  901. }, 60000) //60000 每隔1分钟,执行一次操作(1000*60)
  902. wps.PluginStorage.setItem(constStrEnum.TempTimerID, l_timeID) //保存计时器ID值
  903. }
  904. /**
  905. * 套红头
  906. * doc :套红头的文档
  907. * strFile :获取红头模板接口
  908. * bookmark :,正文书签
  909. */
  910. function pInsertRInedHead(doc, strFile, bookmark, params) {
  911. var bookMarks = doc.Bookmarks
  912. var wpsApp = wps.WpsApplication()
  913. var zhengwen = wpsApp.Documents.Add(strFile, false, 4, false)
  914. if (getBoolean(params.fileparam.AutoAcceptRevisions, false)) {
  915. clearRevDoc(zhengwen)
  916. }
  917. zhengwen.Range().Copy()
  918. if (bookMarks.Exists(bookmark)) {
  919. var bookmark1 = bookMarks.Item(bookmark)
  920. bookmark1.Range.Select() //获取指定书签位置
  921. var s = doc.ActiveWindow.Selection
  922. if (!!params.fileparam.ContentNeedFormate) s.PasteAndFormat(20)
  923. else s.PasteAndFormat(16)
  924. } else {
  925. ShowMessage(
  926. '套红头失败,您选择的红头模板没有对应书签:' + bookmark,
  927. 'error',
  928. 5,
  929. true
  930. )
  931. }
  932. zhengwen.Close(0)
  933. wps.FileSystem.Remove(strFile) //删除本地临时文件
  934. // var elements = wps.PluginStorage.getItem("values");
  935. var tempvalues = params.values
  936. let Bookmarks = doc.Bookmarks
  937. if (typeof tempvalues === 'string') {
  938. var arrelements = tempvalues.split('|')
  939. for (var i = 0; i < arrelements.length; i++) {
  940. if (arrelements[i] != '') {
  941. var bookmark = Bookmarks.Item(arrelements[i].split('=')[0])
  942. if (bookmark) {
  943. var content = arrelements[i].split('=')[1]
  944. replaceBookmarkContent(doc, bookmark, content)
  945. }
  946. }
  947. }
  948. }
  949. if (tempvalues !== null && typeof tempvalues === 'object') {
  950. // var tempvalues = params.values;
  951. for (let key in tempvalues) {
  952. if (
  953. typeof tempvalues[key] == 'string' ||
  954. typeof tempvalues[key] == 'number'
  955. ) {
  956. var content = tempvalues[key]
  957. var bookmark = Bookmarks.Item(key)
  958. if (bookmark) {
  959. if (content.length > 50 && Base64.isBase64(content)) {
  960. repalceImg(doc, content, bookmark)
  961. } else replaceBookmarkContent(doc, bookmark, content)
  962. }
  963. var documentfield = wps
  964. .WpsApplication()
  965. .ActiveDocument.DocumentFields.Item(key)
  966. if (documentfield) {
  967. documentfield.Value = content
  968. }
  969. }
  970. }
  971. for (let key in tempvalues) {
  972. if (typeof tempvalues[key] != 'string') {
  973. if (doc.Bookmarks.Exists(key)) {
  974. var bookmark = Bookmarks.Item(key)
  975. bookmark.Select()
  976. doc.Application.Selection.Copy()
  977. //string value = base64Decode(item.Value.Value);
  978. var valuecount = tempvalues[key].length
  979. if (valuecount < 1) {
  980. bookmark.Range.Text = ''
  981. } else {
  982. for (let va in tempvalues[key]) {
  983. valuecount = valuecount - 1
  984. for (let vava in tempvalues[key][va]) {
  985. bookmark.Select()
  986. doc.Application.Selection.Find.ClearFormatting()
  987. doc.Application.Selection.Find.Text = '${' + vava + '}'
  988. doc.Application.Selection.Find.Forward = true
  989. doc.Application.Selection.Find.Wrap = 1
  990. doc.Application.Selection.Find.Execute()
  991. if (doc.Application.Selection.Find.Found == true) {
  992. var markvalue = String(tempvalues[key][va][vava])
  993. if (
  994. markvalue.indexOf('data:') != -1 &&
  995. markvalue.indexOf('base64') != -1
  996. ) {
  997. doc.Application.Selection.TypeText(' ')
  998. //doc.Application.Selection.AddPictureBase64(tempvalues[key][va][vava]);
  999. doc.Application.ActiveDocument.Shapes.AddBase64Picture(
  1000. markvalue
  1001. )
  1002. } else if (
  1003. markvalue.length > 50 &&
  1004. Base64.isBase64(markvalue)
  1005. ) {
  1006. addBasePictureToBookMark(doc, markvalue, bookmark)
  1007. } else if (markvalue.indexOf('&inserturl&') > -1) {
  1008. var link = markvalue.replace('&inserturl&', '').split('|')
  1009. doc.Hyperlinks.Add(
  1010. bookmark.Range,
  1011. link[1],
  1012. null,
  1013. link[1],
  1014. link[0]
  1015. )
  1016. } else {
  1017. doc.Application.Selection.TypeText(
  1018. getEmptyBookmarkText(markvalue)
  1019. )
  1020. }
  1021. }
  1022. }
  1023. if (valuecount > 0) {
  1024. bookmark.Delete()
  1025. doc.Application.Selection.EndKey(5)
  1026. doc.Application.Selection.TypeParagraph()
  1027. doc.Application.Selection.ParagraphFormat.Alignment = 0
  1028. doc.Application.Selection.PasteAndFormat(16)
  1029. }
  1030. }
  1031. }
  1032. }
  1033. }
  1034. }
  1035. }
  1036. }
  1037. /**
  1038. * 将文件保存到服务器的逻辑
  1039. * @param {wps.document} doc
  1040. * @returns
  1041. */
  1042. function UploadFileToServer(doc) {
  1043. if (!Heart.IsOASystemOnline()) {
  1044. ShowConfirm('检测到审批单已经关闭,无法上传,是否另存本文档?', 'warning', {
  1045. btns: [
  1046. {
  1047. key: 'close',
  1048. text: '否',
  1049. close: true,
  1050. callback: function () {
  1051. Heart.CloseOADocument(doc)
  1052. doc.Close(WdSaveOptions.wdDoNotSaveChange)
  1053. },
  1054. },
  1055. {
  1056. key: 'saveas',
  1057. text: '是',
  1058. primary: true,
  1059. close: true,
  1060. callback: function () {
  1061. var dialog = wps.WpsApplication().FileDialog(2)
  1062. dialog.InitialFileName = doc.FullName
  1063. if (dialog.Show() == -1) {
  1064. dialog.Execute()
  1065. SetDocParamsValue(doc, 'Persist', true)
  1066. Heart.CloseOADocument(doc)
  1067. doc.Close()
  1068. }
  1069. },
  1070. },
  1071. ],
  1072. })
  1073. return
  1074. }
  1075. loginfo('显现loading')
  1076. ShowLoading('上传中,请稍后...', GetUniqueId(doc))
  1077. // 水印不保留在文档中
  1078. // WaterMark.ClearWaterMark(doc);
  1079. // doc.Save();
  1080. // 设定异步让loading显示出来
  1081. setTimeout(() => {
  1082. OnBtnSaveToServer(doc)
  1083. }, 100)
  1084. }
  1085. /**
  1086. * 上传失败回调
  1087. * @param {document} doc
  1088. * @param {response} rps
  1089. * @param {boolean} savetmp 是否保存临时文件
  1090. */
  1091. function OnUploadFileFail(doc, rps, savetmp = true) {
  1092. //同步操作会把wps卡死
  1093. setTimeout(() => {
  1094. CloseLoading(GetUniqueId(doc))
  1095. if (rps.startsWith('lockError')) {
  1096. if (savetmp) {
  1097. var gs = doc.Name.match(/^(?<name>.*)\.(?<ext>\w+)$/).groups
  1098. var sourcename = doc.FullName
  1099. var bkname =
  1100. wps.Env.GetHomePath() +
  1101. GetDirSpacer() +
  1102. gs.name +
  1103. '_锁异常临时备份' +
  1104. '.' +
  1105. gs.ext
  1106. var data = wps.FileSystem.readAsBinaryString(sourcename)
  1107. wps.FileSystem.writeAsBinaryString(bkname, data)
  1108. }
  1109. var failMsg = rps.split(',')
  1110. var name = decodeURIComponent(failMsg[1]) || '未知'
  1111. var msg = `文件已被 ${name} 编辑,无法继续提交,请确认是否关闭?`
  1112. ShowConfirm(msg, 'error', {
  1113. title: '提交失败',
  1114. btns: [
  1115. {
  1116. key: 'close',
  1117. text: '确认',
  1118. primary: true,
  1119. callback: function () {
  1120. Heart.CloseOADocument(doc)
  1121. doc.Close()
  1122. },
  1123. },
  1124. {
  1125. key: 'cancel',
  1126. text: '取消',
  1127. callback: function () {
  1128. SetDocParamsValue(doc, 'LockError', {
  1129. callback: 'AfterLockError',
  1130. msg,
  1131. })
  1132. },
  1133. },
  1134. ],
  1135. })
  1136. } else {
  1137. ShowMessage('上传文件失败!请联系管理员', 'error')
  1138. }
  1139. logerr('上传失败:' + rps)
  1140. }, 1000)
  1141. }
  1142. /**
  1143. * 作用:执行清稿操作
  1144. * 业务功能:清除所有修订痕迹和批注
  1145. */
  1146. function clearRevDoc(idoc) {
  1147. var doc = idoc || wps.WpsApplication().ActiveDocument
  1148. if (!doc) {
  1149. ShowMessage('尚未打开文档,请先打开文档再进行清稿操作!', 'error')
  1150. return
  1151. }
  1152. //执行清稿操作前,给用户提示
  1153. //if (!wps.confirm("清稿操作将接受所有的修订内容,关闭修订显示。请确认执行清稿操作?")) {
  1154. // return;
  1155. //}
  1156. //接受所有修订
  1157. if (doc.ProtectionType != WdProtectionType.wdNoProtection) {
  1158. doc.Unprotect(constStrEnum.docPassWord)
  1159. }
  1160. doc.Protect(-1, false, constStrEnum.docPassWord, false)
  1161. if (doc.Revisions.Count >= 1) {
  1162. doc.AcceptAllRevisions()
  1163. }
  1164. //去除所有批注
  1165. if (doc.Comments.Count >= 1) {
  1166. doc.RemoveDocumentInformation(wps.Enum.wdRDIComments)
  1167. }
  1168. //删除所有ink墨迹对象
  1169. pDeleteAllInkObj(doc)
  1170. doc.TrackRevisions = false //关闭修订模式
  1171. return
  1172. }
  1173. /**
  1174. * 作用:删除当前文档的所有墨迹对象
  1175. * @param {*} p_Doc
  1176. */
  1177. function pDeleteAllInkObj(p_Doc) {
  1178. var l_Count = 0
  1179. var l_IsInkObjExist = true
  1180. while (l_IsInkObjExist == true && l_Count < 20) {
  1181. l_IsInkObjExist = pDeleteInkObj(p_Doc)
  1182. l_Count++
  1183. }
  1184. return
  1185. }
  1186. /**
  1187. * 删除墨迹对象
  1188. */
  1189. function pDeleteInkObj(p_Doc) {
  1190. var l_IsInkObjExist = false
  1191. if (p_Doc) {
  1192. for (var l_Index = 1; l_Index <= p_Doc.Shapes.Count; l_Index++) {
  1193. var l_Item = p_Doc.Shapes.Item(l_Index)
  1194. if (l_Item.Type == 23) {
  1195. l_Item.Delete()
  1196. //只要有一次找到Ink类型,就标识一下
  1197. if (l_IsInkObjExist == false) {
  1198. l_IsInkObjExist = true
  1199. }
  1200. }
  1201. }
  1202. }
  1203. return l_IsInkObjExist
  1204. }
  1205. function SaveAsAndClose(doc, params) {
  1206. var dialog = wps.WpsApplication().FileDialog(2)
  1207. dialog.InitialFileName = doc.FullName
  1208. if (dialog.Show() == -1) {
  1209. dialog.Execute()
  1210. SetDocParamsValue(doc, 'Persist', true)
  1211. doc.Close()
  1212. } else {
  1213. doc.Close()
  1214. }
  1215. }
  1216. function clearWaterMark(doc, params) {
  1217. if (
  1218. params[constStrEnum.WaterMark] &&
  1219. !!!params.fileparam[constStrEnum.NeedSaveMark]
  1220. ) {
  1221. //清理水印不留痕迹
  1222. if (doc.ProtectionType > -1) {
  1223. var sourceProtectedType = doc.ProtectionType
  1224. doc.Unprotect(constStrEnum.docPassWord)
  1225. //水印不保留在文档中
  1226. WaterMark && WaterMark.ClearWaterMark(doc)
  1227. // doc.Revisions.Item(doc.Revisions.Count).Accept()
  1228. doc.Protect(sourceProtectedType, false, constStrEnum.docPassWord, false)
  1229. } else {
  1230. WaterMark && WaterMark.ClearWaterMark(doc)
  1231. }
  1232. doc.Save()
  1233. }
  1234. }
  1235. function repalceImg(doc, data, bookmark) {
  1236. var start = bookmark.Range.Start
  1237. let name = bookmark.Name
  1238. doc.Shapes.AddBase64Picture('data:image;base64,' + data).Select()
  1239. wps.Application.Selection.Cut()
  1240. bookmark.Range.Paste()
  1241. if (!doc.Bookmarks.Exists(name)) {
  1242. wps.Application.Selection.SetRange(start, start + 1)
  1243. var range = wps.Application.Selection.Range
  1244. doc.Bookmarks.Add(name, range)
  1245. }
  1246. }
  1247. function addBasePictureToBookMark(doc, data, bookmark) {
  1248. doc.Shapes.AddBase64Picture('data:image;base64,' + data).Select()
  1249. wps.Application.Selection.Cut()
  1250. bookmark.Range.Paste()
  1251. }
  1252. function toggleBeforeOAfterLoading(txt, show = false, ifTitle = false) {
  1253. CloseLoading(constStrEnum.BeforeAfterLoadingID)
  1254. show && ShowLoading(txt, constStrEnum.BeforeAfterLoadingID, false, ifTitle)
  1255. }