You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于使用C# OneNote API修改页面手写墨迹的技术咨询

解决OneNote API修改手写墨迹的问题

我之前也踩过OneNote API手写墨迹修改的坑,正好给你分享几个可行的方案和排错要点:

先明确核心局限

OneNote官方的高级PATCH请求确实只支持JSON格式修改HTML内容,手写墨迹并不属于可通过JSON PATCH修改的范畴——因为墨迹在OneNote中是以application/inkml+xml格式的结构化数据存储的,和HTML内容是分离的。你遇到的400 Bad Request,大概率是因为试图在JSON payload中传递墨迹相关的非HTML内容,API无法解析导致的。

可行的修改方案:删除旧墨迹 + 上传新墨迹

要修改手写墨迹,得换一种思路:先删除页面上旧的墨迹块,再上传新的墨迹内容到指定位置。具体步骤如下:

1. 获取目标墨迹的ID

先发送GET请求获取页面的完整内容,找到要修改的墨迹对应的ID:

var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", yourAccessToken);

var response = await client.GetAsync($"https://graph.microsoft.com/v1.0/me/onenote/pages/{pageId}/content");
var content = await response.Content.ReadAsStringAsync();
// 解析返回的HTML内容,找到目标<ink>标签的id属性,比如 <ink id="old-ink-id" ... />

2. 删除旧墨迹块

用找到的ID发送DELETE请求删除旧墨迹:

var deleteResponse = await client.DeleteAsync($"https://graph.microsoft.com/v1.0/me/onenote/pages/{pageId}/content/old-ink-id");
deleteResponse.EnsureSuccessStatusCode();

3. 上传新的墨迹内容

通过multipart/form-data格式的POST请求,将新的inkml内容上传到页面的指定位置:

var multipartContent = new MultipartFormDataContent();

// 1. 添加新的inkml内容
var inkmlContent = new StringContent(yourUpdatedInkmlString, Encoding.UTF8, "application/inkml+xml");
multipartContent.Add(inkmlContent, "ink", "updated-ink.inkml");

// 2. 指定墨迹在页面中的插入位置(用HTML片段定位)
var presentationContent = new StringContent("<p><ink id=\"new-ink-id\" /></p>");
multipartContent.Add(presentationContent, "Presentation");

var uploadResponse = await client.PostAsync($"https://graph.microsoft.com/v1.0/me/onenote/pages/{pageId}/content", multipartContent);
uploadResponse.EnsureSuccessStatusCode();

关键注意事项

  • inkml格式正确性:确保你生成的inkml符合OneNote支持的标准格式,包含完整的笔触数据、坐标等信息,格式错误会导致上传失败。
  • 权限要求:你的应用必须拥有Notes.ReadWrite的权限,否则会出现权限不足的错误。
  • 400错误排查:如果还是遇到400,先检查请求的URL是否正确,multipart表单的参数名是否严格为ink和Presentation,以及inkml内容是否有语法错误。

备选方案:替换整个页面内容

如果修改的墨迹是页面的主要内容,也可以考虑直接PUT整个页面的内容(包含HTML和墨迹),但这样会覆盖页面原有所有内容,需要谨慎使用:

var putContent = new StringContent("<html><body><p><ink id=\"new-ink\" /></p></body></html>", Encoding.UTF8, "text/html");
var putResponse = await client.PutAsync($"https://graph.microsoft.com/v1.0/me/onenote/pages/{pageId}/content", putContent);
putResponse.EnsureSuccessStatusCode();

内容的提问来源于stack exchange,提问作者Values

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:38:59