我正在尝试将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;
}
我自己解决了这个问题。对于具有CallbackID的对象,必须对此CallbackID使用getBinaryPageContent,并将带有“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