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

问题描述 投票:0回答:2

我正在尝试将OneNote页面复制到另一个带有新标题的Notebook。到目前为止,这与GetPageContent和UpdatePageContent一起工作。它会复制除图像之外的所有项目。创建了图像对象,但它只显示红色的“x”。我试图自己解决这个问题,编写旧页面的XML和文件中的新页面之一。图像对象之间的唯一区别是新页面中缺少“格式”属性。然后我在UpdatePageContent之前将我的XML字符串的内容写入文件中,从我的新页面加载内容并将其写入另一个文件中。所以我使用了我用于UpdatePageContent的字符串和实际上在OneNote中显示的XML String。在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;
        }
c# xml office-interop add-in onenote
2个回答
0
投票

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


0
投票

正如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

© www.soinside.com 2019 - 2024. All rights reserved.