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

本文关键字:另一个 XML 复制 使用 OneNote UpdatePageContent 图像 | 更新日期: 2023-09-27 18:11:48

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

是否缺少属性导致红色'x'或有其他东西要检查?如果这是问题,我怎么能避免"格式"属性被删除?

每一个帮助都是感激的。

下面是我的代码来复制页面和更新页面('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;
        }

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

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

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

pageInfoToExport -(可选)指定GetPageContent方法是否返回二进制内容,嵌入在XML代码中,base-64编码。二进制内容可以包括,例如,图像和油墨数据。pageInfoToExport参数还指定是否在GetPageContent方法返回的XML代码中标记选择。它从PageInfo枚举中获取一个枚举值。

所以,你所需要做的就是:

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

直接使用PageInfo.piAll