【鸿蒙二开】WPS SDK 办公附件编辑+回传代码

鸿蒙办公审批里,附件编辑几乎是刚需:打开 Word 进 WPS、叠工号水印、关掉分享导出,用户关闭窗口后再把文件上传回业务系统。本文用 WPS Open SDK 把关键代码按注册、策略打开、关窗回传三段贴清楚,方便同事直接对照工程联调,减少「能打开但关不了回传」这类扯皮。

注册 ensureRegistered

未注册就 sendRequest 会 reject;1013 查包名与凭据。有激活序列号再 setWpsFileToken,不要塞到每次 OpenFileRequest.wpsToken

let wpsReady = false;

async function ensureRegistered(ctx: UIAbilityContext) {
  if (wpsReady) return;
  const r = await WPSApi.sendRequest(
    new RegisterAppRequest(ctx, APP_KEY, APP_SECRET)
  );
  if (r.code === ResultCode.ERROR_CODE_AUTH_FAILURE) {
    throw new Error(`1013: ${r.msg}`);
  }
  if (r.code !== ResultCode.OK) {
    throw new Error(`register ${r.code}`);
  }
  if (ACTIVATION_SN) {
    WPSApi.setWpsFileToken(ACTIVATION_SN);
  }
  wpsReady = true;
}

冷启动 await ensureRegistered,页面在 wpsReady 前禁用打开按钮。日志打 code/msg,Release 不打 secret。

策略打开:编辑 + 水印 + 关外发 + URI

选择器路径先 copy 到 filesDir,再构造请求。enableEdit 默认只读,必须显式 true。不落地时部分外发能力会被强制关掉,真机点菜单确认。

function toSandbox(ctx: UIAbilityContext, src: string): string {
  const dir = `${ctx.filesDir}/wps_in`;
  fs.mkdirSync(dir, true);
  const dest = `${dir}/${Date.now()}.docx`;
  fs.copyFileSync(src, dest);
  return dest;
}

async function openPolicy(ctx: UIAbilityContext, src: string, stamp: string) {
  await ensureRegistered(ctx);
  const path = toSandbox(ctx, src);
  const req = new OpenFileRequest(ctx, path);
  req.enableEdit = true;
  req.enableLocalization = false;
  req.wpsTransferType = TransferType.URI;

  const wm = new WaterMark();
  wm.Enable = true;
  wm.WaterMaskText = stamp;
  wm.Angle = -30;
  wm.FontColor = '#19000000';
  wm.FontSize = 16;
  req.wpsWaterMarkParams = wm;

  const opt = new OpenFileExtraOptions();
  opt.enableShare = false;
  opt.enableCloud = false;
  opt.enablePrint = false;
  opt.enableExport = false;
  opt.enableScreenShot = false;
  req.extraOptions = opt;

  return await WPSApi.sendRequest(req);
}

联调建议分层:先可编辑,再叠不落地与 extraOptions,最后水印和回传,ERROR 更好定位。

关窗回传与落盘

切回应用 ≠ 关窗。OK 且无 data 是中间态。有 fileUri 再 copy 到本应用后入上传队列。

async function runEdit(ctx: UIAbilityContext, picker: string) {
  const res = await openPolicy(ctx, picker, `${uid}|${dept}|内部`);
  if (res.code !== ResultCode.OK) {
    throw new Error(res.msg ?? String(res.code));
  }
  if (!res.data?.fileUri) {
    return; // 未关窗
  }
  const f = fs.openSync(res.data.fileUri, fs.OpenMode.READ_ONLY);
  const dest = `${ctx.filesDir}/wps_callback/${Date.now()}.docx`;
  fs.mkdirSync(`${ctx.filesDir}/wps_callback`, true);
  fs.copyFileSync(f.fd, dest);
  fs.closeSync(f);
  await upload(dest);
}

排错速查

现象

reject

注册时序

1013

key/包名/HAR

ERROR

沙箱路径

只能预览

enableEdit=true

无 data

是否关文档窗

仍能分享

不落地与 extraOptions

真机回归时建议至少测:小 docx、大 xlsx;正常关窗与杀进程打断;上传失败重试不覆盖上次回传文件。冷启动连点「打开」应能 catch 到未注册 reject。换 HAR 后 clean 构建,多包名分别校验凭据。日志固定 requestTypecodemsg,便于区分注册失败与打开失败。

页面侧示例:onCreateawait ensureRegistered;按钮里 if (!wpsReady) return; 再调 runEdit。水印文案拼工号与部门即可,业务差异尽量不要再拆第二套打开函数。

小结与获取 SDK

闭环三步:注册(按需 Token)→ 带水印/extraOptions/URI 回传打开 → copy 后上传。字段语义以官方文档为准。

更多参数见官方对接文档:https://365.kdocs.cn/l/clQl5cek2NoT

申请 SDK HAR 与凭据:m_open_sdk@wps.cn(注明包名与版本需求)。

技术交流 QQ 群:628436767

湖北省
浏览 174
收藏
3
分享
3 +1
+1
全部评论