C# OneNote 使用 UpdatePageContent 更改将图像复制到另一个页面 XML

C# OneNote Copying Image to another page with UpdatePageContent changes XML

我正在尝试将 OneNote 页面复制到另一个具有新标题的笔记本。到目前为止,这适用于 GetPageContent 和 UpdatePageContent。它复制除图像之外的所有项目。图像 Object 已创建,但它只显示红色 'x'。我试图自己解决这个问题,在文件中写了旧页面的 XML 和新页面之一。图像 Object 之间的唯一区别是新页面中缺少 'format' 属性。然后我在 UpdatePageContent 之前将我的 XML 字符串的内容写在一个文件中,从我的新页面加载内容并将其写在另一个文件中。所以我有我用来更新页面内容的字符串和 XML 字符串,它实际上显示在 OneNote 中。 在 UpdatePageContent 之前 'format' 属性存在,之后它就消失了。 我什至尝试在文件中手动添加属性,然后加载并更新它,但这并没有改变什么,它在 UpdatePageContent 之后也被删除了。

是缺少的属性导致了红色 'x' 还是有其他需要检查的东西? 如果是问题所在,我怎样才能避免删除 'format' 属性?

感谢您的帮助。

这是我复制页面和更新页面的代码('ID'是我要复制的页面的ID):

      onApp.CreateNewPage(ID, out A, NewPageStyle.npsBlankPageWithTitle);
        var XMLPageContent = XDocument.Parse(PageContent);
        onApp.GetPageContent(A, out xml);
        var NewXD = XDocument.Parse(xml);
        NewXD.Element(NS + "Page").Attribute("pageLevel").Value = XMLPageContent.Element(NS+ "Page").Attribute("pageLevel").Value;
        NewXD.Elements(NS + "Page").Elements().Remove();
        getChild(XMLPageContent.Element(NS + "Page"), NewXD.Element(NS + "Page"));
        var Title = NewXD.Descendants(NS + "T").First();
        Title.Value = NewPage;
        onApp.UpdatePageContent(NewXD.ToString());
        onApp.GetPageContent(A, out xml);
        doc = XDocument.Parse(xml);
        StreamWriter SW = new StreamWriter("C:\xml.txt");
        SW.Write(doc.ToString());
        StreamWriter SW2 = new StreamWriter("C:\xml2.txt");
        SW2.Write(XMLPageContent.ToString());
        SW.Close();
        SW2.Close();

    }



    private void getChild(XElement PXE, XElement NXE)
    {

            if (PXE.Elements() != null)
            {
                foreach (XObject XE in PXE.Nodes())
                {
                   try
                   {
                    XElement XEE = (XElement) XE;
                        XElement toAdd = new XElement(XEE.Name.ToString());
                        foreach (XAttribute XA in XEE.Attributes())
                        {
                            if (!XA.Name.LocalName.Contains("objectID"))
                            {
                                try
                                {
                                    toAdd.Add(XA);
                                }
                                catch (Exception e)
                                {
                                    MessageBox.Show(XA.Name.ToString());
                                    throw e;
                                }
                            }
                        }

                        if (toAdd.Attributes("callbackID").ToArray().Length > 0)
                        {
                            string[] hilf = toAdd.Attribute("callbackID").Value.Split('{', '}');
                            string xml;
                            onApp.GetPageContent(A, out xml);
                            var doc = XDocument.Parse(xml);
                            hilf[1] = doc.Element(NS+"Page").Attribute("ID").Value.Split('{', '}')[1];
                            toAdd.Attribute("callbackID").Value = '{' + hilf[1] + '}' + '{' + hilf[3] + '}' + '{' + hilf[5] + '}';

                        }
                        getChild(XEE, toAdd);
                        NXE.Add(toAdd);

                }
                 catch(InvalidCastException)
                {
                    NXE.Add(XE);
                }
               }
            }


            else return;
        }

我自己解决了这个问题。 对于具有 CallbackID 的对象,必须将 getBinaryPageContent 与此 CallbackID 一起使用,并将带有 "one: data" 的二进制数据复制到对象中,而不是复制 "OCRData".

https://msdn.microsoft.com/en-us/library/office/gg649853(v=office.14).aspx

中所述

pageInfoToExport—(Optional) Specifies whether the GetPageContent method returns binary content, embedded in the XML code and base-64 encoded. Binary content can include, for example, images and ink data. The pageInfoToExport parameter also specifies whether to mark up the selection in the XML code that the GetPageContent method returns. It takes an enumerated value from the PageInfo enumeration.

那么,您需要做的就是:

GetPageContent(_oldPageID, out _xml, PageInfo.piAll);

只需使用PageInfo.piAll