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;
}
我自己解决了这个问题。对于具有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