HarmonyOS WPS Open SDK:水印、修订与 enableLocalization 策略落地
HarmonyOS 业务里接入wps/wps_sdk之后打开 Word 往往只是起点。真正进入评审的通常是「文档能不能外泄、截图能不能控、改动能不能追溯」。这些诉求并不靠再写一套编辑器而是落在OpenFileRequest的策略字段上水印、修订、enableLocalization与extraOptions。本文按调用链把参数对齐到可复用封装字段语义以官方对接文档为准。一、安全策略在调用链中的位置对接文档的时序仍是硬约束RegisterAppRequest成功之前其它sendRequest会 reject。安全相关能力都挂在「已注册」之后的打开请求上而不是注册阶段。建议分层叠加避免一次写满所有开关层级职责主要字段接入层注册与可选序列号RegisterAppRequest/setWpsFileToken打开层沙箱路径、只读/可编辑filePath/enableEdit策略层水印、修订、落地、菜单wpsWaterMarkParams/wpsRevisionParams/enableLocalization/extraOptions结果层关窗回传与临时文件清理wpsTransferType/ 沙箱拷贝联调顺序建议注册成功 → 沙箱只读打开 → 可编辑 → 水印/修订 → 再调enableLocalization与extraOptions。一次堆满时ResultCode.ERROR很难归因。二、水印参数怎么注入水印通过wpsWaterMarkParams类型WaterMark注入。常用字段如下字段说明Enable是否启用水印WaterMaskText水印文字如工号、部门、时间戳Angle旋转角度FontColor颜色可含透明度如#19000000FontSize字号import{common}fromkit.AbilityKit;import{WPSApi,RegisterAppRequest,OpenFileRequest,WaterMark,Revision,OpenFileExtraOptions,ResultCode,}fromwps/wps_sdk;importfsfromohos.file.fs;functionbuildWatermark(text:string):WaterMark{constmarknewWaterMark();mark.Enabletrue;mark.WaterMaskTexttext;mark.Angle-30;mark.FontColor#19000000;mark.FontSize24;returnmark;}文案不要写死在页面按钮里。更稳的做法是由会话层传入「操作者标识」打开模块只负责挂到req.wpsWaterMarkParams。预览与编辑共用同一打开函数只差enableEdit避免两套水印配置漂移。三、修订模式与打开策略一起配修订走wpsRevisionParams类型Revision字段说明UserName修订作者名称EnterReviseMode是否以修订模式打开ShowRevisionPanel是否显示修订面板EnterRevisionSilent是否静默进入不弹提示审批、会签类入口通常希望一打开就进入修订且作者名可追溯。注意修订与水印、菜单开关彼此独立——开了修订不等于自动禁打印打印/导出仍要靠extraOptions或落地策略约束。functionbuildRevision(userName:string):Revision{constrevnewRevision();rev.UserNameuserName;rev.EnterReviseModetrue;rev.ShowRevisionPaneltrue;rev.EnterRevisionSilenttrue;returnrev;}四、enableLocalization 与 extraOptions 的叠加关系enableLocalization控制是否允许文档在 WPS 侧持久化缓存true表示允许落地false或未设置表示不落地在支持该能力的 SDK 形态下生效。不落地时云文档、分享、另存为、打印、导出、复制粘贴、截图等能力可能被 SDK强制关闭即便extraOptions写成开启也无效。enableLocalization落地行为敏感菜单未设置 /false不落地常被强制关闭true可落地由extraOptions单独配置OpenFileExtraOptions仅显式赋值的属性生效。常见字段包括enableShare、enableCloud、enableSaveAs、enablePrint、enableExport、enableCopy、enablePaste、enableScreenShot等。方案评审时应先确认是否允许落地再讨论菜单矩阵否则真机上会出现「改了开关却没变化」。functiontoSandbox(ctx:common.UIAbilityContext,src:string):string{constdir${ctx.filesDir}/wps_secure;fs.mkdirSync(dir,true);constdest${dir}/${Date.now()}.docx;fs.copyFileSync(src,dest);returndest;}asyncfunctionopenSecureDoc(ctx:common.UIAbilityContext,src:string,opts:{editable:boolean;operatorId:string;allowPersist:boolean;}):Promisevoid{constregawaitWPSApi.sendRequest(newRegisterAppRequest(ctx,APP_KEY,APP_SECRET));if(reg.code!ResultCode.OK){thrownewError(register${reg.code});}constpathtoSandbox(ctx,src);constreqnewOpenFileRequest(ctx,path);req.enableEditopts.editable;req.enableLocalizationopts.allowPersist;req.wpsWaterMarkParamsbuildWatermark(UID:${opts.operatorId});req.wpsRevisionParamsbuildRevision(opts.operatorId);if(opts.allowPersist){constextranewOpenFileExtraOptions();extra.enableSharefalse;extra.enablePrintfalse;extra.enableExportfalse;extra.enableSaveAsfalse;extra.enableScreenShotfalse;req.extraOptionsextra;}constresawaitWPSApi.sendRequest(req);if(res.code!ResultCode.OK){thrownewError(res.msg??open${res.code});}}未开回传时OK且无data通常表示拉起成功不要当成业务已落库。若同时开了 URI 回传拷贝到己方沙箱后可按业务要求删除 WPS 侧临时文件降低残留风险。五、联调清单与常见坑用例期望未注册就打开reject / catch而不是业务 OK启用水印后预览文档可见水印文字修订模式打开作者名与修订痕迹符合配置不落地 extraOptions.enablePrinttrue打印仍可能被强制关闭允许落地后关打印extraOptions生效Release 日志不打印 secret / 完整水印策略密钥常见坑把外部选择器 URI 直接传给OpenFileRequest忘记enableEdit导致「以为能改其实只读」在不落地模式下反复调extraOptions却看不到变化冷启动连点触发多次注册。建议日志前缀统一[WPS][secure]只打code/msg/allowPersist布尔值。六、工程封装建议与回归范围把策略收敛到单一模块后页面层只传「操作者标识、是否可编辑、是否允许落地」三个开关即可。内部再决定是否挂水印、修订与extraOptions。这样产品改文案时不会误伤注册链路测试也可以按 profile 做矩阵而不是每个页面手写一份new WaterMark()。建议在内部 README 固定回归范围换 HAR 后 clean调试包与上架包分别核对bundleName水印预览/编辑各看一眼不落地与允许落地各跑一次打印/分享是否符合预期若开启关窗回传确认业务沙箱已拿到文件再清理临时路径。弱网下再点一次打开入口确认注册门禁仍然有效。日志方面统一前缀例如[WPS][secure]输出code、msg、allowPersist、是否启用水印/修订的布尔值即可。不要输出完整appSecret也不要在 Release 包把水印策略密钥打进控制台。Code review 可固定三问策略是否单出口不落地时是否误指望extraOptions路径是否已进沙箱Word 与表格类小文件都要覆盖。偶发路径问题经常被误判成「水印没生效」或「客户端菜单坏了」。把打开建立在「已注册 合法路径」之上后面叠回传或修订时心态会稳很多日常需求也通常只改策略模块参数而不必每次从零打穿 Demo。七、小结在 HarmonyOS 上做 WPS 文档二开的安全策略核心不是堆菜单而是把水印、修订、落地与功能开关按层挂到OpenFileRequest。注册先就绪沙箱路径再打开策略字段后叠加enableLocalization决定一批敏感能力是否被强制关闭extraOptions在允许落地后才有细粒度空间。字段与申请渠道以官方对接文档为准封装稳定后产品侧改水印文案或菜单布尔研发只需在策略模块调整不必把鉴权重新散落到页面按钮。基于 WPS Open SDK 鸿蒙版对接实践整理仅供开发者参考。官方对接文档https://365.kdocs.cn/l/clQl5cek2NoT