理想*人生的梦学习*信息*阅读人际关系*家庭*朋友健康*饮食*锻炼日期:天气:什么日子:生日:工作理财*金钱快乐*惊喜*其他未来日记*近日摘要......
2022-04-28 59 OneNote教程 OneNote九宫格日记模板
onenote是一款十分好用的笔记本工具,我想将onenote笔记本转换成html并上传到我的云服务器中,这样在别的主机上就可以查看我做过的笔记。onenote本身并不支持笔记保存为html格式,不过无所不能的插件”GemforOnenote”有这个功能,只是一个个转换过于麻烦,于是使用aspose.notefor.Net将onenote笔记本批量转换成html。
aspose系列提供了word,pdf,excel等文件的操作接口,aspose.notefor.Net顾名思义就是用.Net库对onenote文件进行操作。
安装
在官网上下载aspose.notefor.Net,(下载链接戳这里),用visualstudio新建一个工程,在引用里添加下载的dll文件,就可以使用aspose.note了。
简介和demo
按照我的理解,aspose.note是将一个onenote文件划分成很多个层级,用一种类似于DOM的文档结构模型来表述文件。一个页面上的元素称之为节点(Node),节点又分为CompositeNode和Node,区别在于前者可以包含其它Node,后者不能。页面元素大多继承自这两个基类。
举个例子,一个Document节点由很多个Page子节点构成,Page节点又由Title,Image,RichText等节点构成。每种节点都有相应的类,对其实例化后就可以进行具体的页面元素操作。
官网上有很多demo,举一个将onenote笔记本保存为pdf格式的例子:
//Forcompleteexamplesanddatafiles,pleasegotohttps://github.com/kashifiqb/Aspose.Note-for-.NET
//Thepathtothedocumentsdirectory.
stringdataDir=RunExamples.GetDataDir_LoadingAndSaving();
//LoadthedocumentintoAspose.Note.
DocumentoneFile=newDocument(dataDir+"Aspose.one");
dataDir=dataDir+"SaveWithDefaultSettings_out.pdf";
//SavethedocumentasPDF
oneFile.Save(dataDir,SaveFormat.Pdf);
Save()方法有两个参数,第一个参数是路径名称,第二个参数可以是一个枚举类型SaveFormat,指定保存类型,还可以是SaveOptions及其子类的实例化对象,SaveOptions对象可以在保存时进一步设置,例如从第二页开始保存可以这么写:
//Forcompleteexamplesanddatafiles,pleasegotohttps://github.com/kashifiqb/Aspose.Note-for-.NET
//Thepathtothedocumentsdirectory.
stringdataDir=RunExamples.GetDataDir_LoadingAndSaving();
//LoadthedocumentintoAspose.Note.
DocumentoneFile=newDocument(dataDir+"Aspose.one");
//InitializeImageSaveOptionsobject
ImageSaveOptionsopts=newImageSaveOptions(SaveFormat.Png);
//Setpageindex
opts.PageIndex=1;
dataDir=dataDir+"ConvertSpecificPageToImage_out.png";
//SavethedocumentasPNG.
oneFile.Save(dataDir,opts);
看到这里,我们似乎已经能写出代码,无非也就是遍历onenote文件夹,把每个.one文件的路径作为Document对象构造函数的参数,然后Save()方法保存为html格式。整体上的思路确实是这样,不过还是遇到一些问题,下面一一讲述。
以及,更多的使用方法见官网上的开发指南DevelopGuide
多个page遇到问题
在官网上给的例子都是单页的.one文件,但在多页的情况下(即,onenote右边的“添加页”那一栏有多个标签),直接调用Save()方法保存得到的html只有第一个page的内容,而且是错位的。官网上没有说到多页保存时应该怎么处理,但是既然保存时可以设置PageIndex和PageCount,那么应该是支持多页保存的。我想可能是因为我的aspose.note不兼容我的onenote版本。
首先想到,是不是可以对于每一个Page,都创建一个空白的Document对象,然后把每个Page节点AppendChild()到这个Document对象上,再把这个Document保存成html。然而报错thenodebelongstotheothernode。这是因为节点之间有严格的从属关系,不能随便Append,(我们创建对象的时候就可以看到,例如Pagepage=newPage(doc),这个doc就是一个Document对象,创建对象时就确立了从属关系)即便将之前的Document对象调用RemoveChild()删除Page节点仍然不能让这个节点附着到另一个Document对象上。
那么只好另辟蹊径了,可以用GetChildNodes()得到一个Page的列表,遍历这个列表,每次保存一个Page。
IList
intcount=pages.Count();
for(inti=0;i Pagepage=pages[i]; HtmlSaveOptionshs=newHtmlSaveOptions(); hs.PageIndex=i; hs.PageCount=1; Console.WriteLine("正在创建HTML"+Path.Combine(child_child_dir,page.Title.TitleText.Text+".html...")); doc.Save(Path.Combine(child_child_dir,page.Title.TitleText.Text+".html"),hs); Console.WriteLine("完成"); } 对比文件修改时间,只更新修改过的.one文件 可以稍稍改进一下代码。我们不必每次都生成所有html,可以只有更新后,即当page的修改时间比对应的html文件的修改时间还要迟时才生成。改进后的代码如下: IList intcount=pages.Count(); for(inti=0;i Pagepage=pages[i]; //若无对应的htmnl文件,或有且源文件(page)修改时间大于目标文件(html),则生成html stringdes_path=Path.Combine(child_child_dir,page.Title.TitleText.Text+".html"); FileInfodes_file=newFileInfo(des_path); if(File.Exists(des_path)){ DateTimedes_time=des_file.LastWriteTime; DateTimesrc_time=page.LastModifiedTime; if(DateTime.Compare(src_time,des_time)<0) continue; } HtmlSaveOptionshs=newHtmlSaveOptions(); hs.PageIndex=i; hs.PageCount=1; Console.WriteLine("正在创建HTML"+des_path+"..."); doc.Save(des_path,hs); Console.WriteLine("完成"); } 完整代码及运行截图 usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Threading.Tasks; usingAspose.Note; usingAspose.Note.Saving; usingSystem.IO; namespaceOnenote_Up { classProgram { staticvoidMain(string[]args) { stringroot_dir=@"C:\Users\fiver\Desktop\onenote\my_onenote\onenote"; stringnew_root_dir=@"C:\Users\fiver\Desktop\onenote\my_onenote\html"; DirectoryInfoRootDir=newDirectoryInfo(root_dir); DirectoryInfoNewRootDir=newDirectoryInfo(new_root_dir); foreach(DirectoryInfopart_dirinRootDir.GetDirectories()){ stringchild_dir=Path.Combine(root_dir,part_dir.Name); stringnew_child_dir=Path.Combine(new_root_dir,part_dir.Name); DirectoryInfoChildDir=newDirectoryInfo(child_dir); //若没有文件夹则创建 if(!Directory.Exists(child_dir)) { Directory.CreateDirectory(new_child_dir); } //遍历每个文件夹的每个one文件,一个one文件生成对应的一个文件夹,每个one文件的多个page生成多个html放在相应的文件夹下面 else { foreach(FileInfonoteinChildDir.GetFiles()){ //只有后缀为one的文件才处理 if(note.Name.Substring(note.Name.Length-3,3)=="one") { Documentdoc=newDocument(note.FullName); //创建对应的文件夹 stringchild_child_dir=Path.Combine(new_child_dir,note.Name.Substring(0,note.Name.Length-4)); if(!Directory.Exists(child_child_dir)) { Console.WriteLine("创建文件夹"+child_child_dir); Directory.CreateDirectory(child_child_dir); } Console.WriteLine("进入文件夹"+child_child_dir); //获得.one文件的全部page并遍历 //IsComposite:Checkswhetherthenodeiscomposite.Iftruethenthenodecanhavechildnodes.只有一个page也为true? if(doc.IsComposite){ IList intcount=pages.Count(); for(inti=0;i Pagepage=pages[i]; //若无对应的htmnl文件,或有且源文件(page)修改时间大于目标文件(html),则生成html stringdes_path=Path.Combine(child_child_dir,page.Title.TitleText.Text+".html"); FileInfodes_file=newFileInfo(des_path); if(File.Exists(des_path)){ DateTimedes_time=des_file.LastWriteTime; DateTimesrc_time=page.LastModifiedTime; Console.WriteLine(des_path); Console.WriteLine(src_time.ToString()); Console.WriteLine(des_time.ToString()); if(DateTime.Compare(src_time,des_time)<0) continue; } HtmlSaveOptionshs=newHtmlSaveOptions(); hs.PageIndex=i; hs.PageCount=1; Console.WriteLine("正在创建HTML"+des_path+"..."); //doc.Save(des_path,hs); Console.WriteLine("完成"); } } } } } } Console.WriteLine("Finished.Pressanykeytoexit...."); Console.ReadKey(); } } }
相关文章
理想*人生的梦学习*信息*阅读人际关系*家庭*朋友健康*饮食*锻炼日期:天气:什么日子:生日:工作理财*金钱快乐*惊喜*其他未来日记*近日摘要......
2022-04-28 59 OneNote教程 OneNote九宫格日记模板
部门:年度:工作计划:计划重点:输入计划目标:输入目标:具体步骤:输入详细工作安排和步骤:输入内容输入内容输入内容输入内容可能会遇到的问题:输入内容输入内容输......
2022-04-28 86 OneNote教程 OneNote工作计划模板
重要且紧急优先解决立即做重要不紧急制定计划去做事项1事项2事项3事项1事项2事项3紧急不重要有空再说不重要不紧急交给别人去做事项1事项2事项3事项1事项2事项3......
2022-04-28 291 OneNote教程 OneNote四象限法则模板
分析表格:结论:论点1论点2论点3Strengths/优势:Weaknesses/缺陷:条目1条目2条目3条目4条目1条目2条目3条目4Opportunities/机会:Threats/挑战:条目1条目2条目3条目4条目1条目......
2022-04-28 165 OneNote教程 OneNoteSWOT分析模板
问题:Office365里的OneNote,插入选项卡里的联机图片、在线视频功能是灰色的。无法点击使用。是什么原因?解答:这是因为禁用了,不让Office下载在线内容导致的。解决办法:在OneNote201......
2022-04-28 155 OneNote教程 OneNote联机图片功能 OneNote在线视频功能