Aspose.words 书签定位

摘要:
1.Aspose简介。可以在不使用Microsoft Word的情况下使用单词来生成、修改、转换和打印文档。它不依赖于为我们提供极大便利的办公组件。我们可以简单地引入DLL(动态链接库)来操作word文档。然而,Aspose.Words许可证也存在一个小问题。需要lic。2.Word文档结构如果你想操作Word文档,你应该首先简要了解

1. 简介

Aspose.words 可以在不使用 Microsoft.Word 的情况下生成、修改、转换、打印文档。不依赖office组件,这一点给我们提供了极大的便利性,可以简单的引入 DLL(Dynamic Link Library,动态链接库文件) ,就可以操作 word 文档。不过也有一点小小的麻烦就是需要许可证 Aspose.Words.lic 。

 

2. word 文档结构

既然要操作 word 文档,就要先简单了解一下 word 对于 aspose 来说是一个怎样的对象。word 在 aspose中是一个 DOM(Document Object Model ,文档对象模型) 。我们先来看一下 word文档在aspose 中的模型图。

                       Aspose.words 书签定位第1张

 

这上面节点的具体内容可以先暂时不用理会,到了具体的使用场景,如果你要修改一个页眉,可以查一下,页眉是属于哪一个节点,有哪些属性。我们先建立一个DOM 的大概理解 : 根节点为 Document ,最底层节点为 Run 的一棵树。

 

3. 查看 DOM

aspose提供了查看DOM 的工具 DocumentExplorer,可以在 github 中下载。地址:https://github.com/aspose-words/Aspose.Words-for-.NET 。左侧的是与文档结构对应的树,右侧是节点中的一些编码内容。看这棵树是为了对 DOM 有一个直观的认识。

 Aspose.words 书签定位第2张

 

4. 为了有更加深刻的理解,我们实现一个小案例

假设有一份word文档, 给定一个 BookMark(书签)的名称,怎么知道这个书签在文档中的位置。我们先简单定位到页数,也就是说已知 Document (文档) 这个对象,BookMark(书签)的名称,要求解 这个BookMark 在文档中的 PageIndex (页数)。

 

书签在word 中的样子。

 Aspose.words 书签定位第3张

 

这个界面告诉我们书签 有 名称、位置 两个变量。 可以执行 添加、删除、定位、隐藏操作。

 

接下来看一下书签在 aspose 中的实现。

 Aspose.words 书签定位第4张

在 Aspose 中书签的Name 对应名称,可以取值赋值,Text 是书签的值,这个在我们打开word 书签界面的时候没有直接输入的地方,可能可以通过其他方式赋值。BookmarkStart 书签开始的地方,BookmarkEnd 书签结束的地方。 有开始的位置也有结束的位置,这说明书签是一段内容。(更准确的说,是word的文档协议先定义了书签有开始标记和结束标记,aspose根据这个协议,才有了 BookmarkStart 和 BookmarkEnd),我们可以把一整页设为书签,也可以把一张图片设为一个书签。如果书签是一个光标,那么开始和结束标记都是这个光标所在的位置。我们已经有个整个文档的对象 Aspose.words.Document , 书签对象 Aspose.words.BookMark , 书签开始对象 Aspose.words.BookmarkStart, 书签结束对象 Aspose.words.BookmarkEnd。

一份文档中有很多书签,如何找到其中的一个。首先找到所有的 Bookmark

Aspose.Words.BookmarkCollection ,然后根据 bookmarkName找到某一个书签

 Aspose.words 书签定位第5张

 

要实现我们的Case(还记得吗,根据书签定位到页数),是不是应该要有一个 类似 int i = GetPageIndex ( BookMark bookmark ) 的 API 。好像还真有一个实现了类似功能的API 。 Aspose.Words.Layout.LayoutCollector (不要问我怎么知道这个API的) 。LayoutCollector 字面意思:布局收集器。可以理解为文档中所有节点位置信息的集合。

 Aspose.words 书签定位第6张

 

不过还有一个问题:参数是 Node,这又是一个怎样的存在,一个抽象类。

 Aspose.words 书签定位第7张

 

那么 Bookmark 与 Node 是什么关系。

要回答这个问题就要看 BookmarkStart 这个对象,它既是 Node,也是 Bookmark 开始的位置。

 Aspose.words 书签定位第8张

 

到这个时候感觉有好几个对象,有点乱,隐约有点关联。试着建立他们之间的联系。

这样我们可以从 Document(文档)——> Bookmark(书签) ——> BookmarkStart (书签开始节点) ——> Node(节点) ——> PageIndex (页数)

Document doc = new Document(string fileName);

Bookmark bookmark = doc.Range.Bookmarks["bookmarkName"];

int pageIndex = new LayoutCollector(doc).GetStartPageIndex(bookmark.bookmarkStart);

这个地方我们定位到了一个书签开始位置的页数。有了页数,就可以用aspose 中的打印功能直接跳转到这一页显示。

这时,发现刚刚提的那个问题,好像有点不太对。

严格来说应该是: 一个书签在文档中开始的页数 和 结束的页数分别是多少。 当然大部分情况下都是在同一页的。我们实际生活中接触到的是夹在两页之间的书签。word 文档中的电子书签在这个定位的功能上有了扩展。可以定位一个字、一段话、一张图片、还有很多其他意想不到的作用。

 

 

5.查找关键API

整个过程中有个地方比较微妙,就是如何查找 public int GetStartPageIndex(Node node) 这个关键API,如果你时间比较仓促,那就在官方提供的Demo中 用VS打开,检索 bookmark 、Page、Index 这几个关键字,一个单词一个单词分别查,可能会查到很多相关的,每一条快速浏览一下,这个API就在其中,有时比较难发现。这种查找方式,需要Demo作者对方法的命名比较规范,命名要有意义,与所做的事对应起来。我们自己在开发过程中命名的时候,如果感觉一个方法命名很纠结,不能用一两个单词表达所做的事情,或者无论如何写注释,都感觉没讲清楚的时候,那很有可能这个方法本身就是有问题的,它做的事情太多了,需要拆分。如果你有比较充足的时间,那就把官方Demo的例子都跑一下,你要找的API,在你调试某一个例子的过程中可能会发现,当然也可能没有现成的方法能实现你的需求,那就用其他方法继续查,StackOverflow 也可以。各种尝试之后不行,可以回到源头,想一下这个需求是不是本身就有问题,是不是可以换个方式实现。“否定问题是解决问题最好的方法”。

 

免责声明:文章转载自《Aspose.words 书签定位》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇CentOS下ssh的配置windows2012添加ssl证书下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Java平台下利用aspose转word为PDF实现文档在线预览

原文链接:https://www.jianshu.com/p/86716c7122ef 原始需求 java-web项目某页面,用户可上传word文档,上传后的文档名在页面的表格中展示,需要提供word文档的在线预览、下载功能。 找寻解决方式 需求点主要有三个,分别是word文件的上传、预览和下载,文件的上传和下载就不多说了,主要的难点在于预览。找资料找到...

使用Aspose.Cell控件实现Excel高难度报表的生成(一)导出表格控件

时光飞逝,生活、工作、业余研究总是在不停忙碌着,转眼快到月底,该月的博客文章任务未完,停顿回忆一下,总结一些经验以及好的东西出来,大家一起分享一下。本文章主要介绍报表的生成,基于Aspose.Cell控件的报表生成。谈到报表,估计大家都有所领悟以及个人的理解,总的来说,一般的报表生成,基本上是基于以下几种方式:一种是基于微软Excel内置的引擎来实现;一...

Aspose.Words转换为PDF的时候字体丢失的问题解决

系统中明明有字体的,Word中显示也正常,就是转换为PDF以后不正常,字体丢失,被替换成了等线字体 好一番研究,终于找到原因 ,原因是WindowsFonts下的文件,有些只是虚拟的路径,真正的字体文件是在C:Users用户名AppDataLocalMicrosoftWindowsFonts 这个目录下,从而导致的这个问题 只要将用户的字体目录添加进去就可...

aspose授权亲测可用配套代码

支持excel,word,ppt,pdf using Aspose.Cells; using Aspose.Words.Saving; using ESBasic; using OMCS.Engine.WhiteBoard; using System; using System.Collections.Generic; using System.Drawi...

转载wuhuacong(伍华聪)的专栏 利用Aspose.Word控件实现Word文档的操作 (留作笔记)

Aspose系列的控件,功能都挺好,之前一直在我的Winform开发框架中用Aspose.Cell来做报表输出,可以实现多样化的报表设计及输出,由于一般输出的内容比较正规化或者多数是表格居多,所以一般使用Aspose.Cell来实现我想要的各种Excel报表输出。虽然一直也知道Aspose.Word是用来生成Word文档的,而且深信其也是一个很强大的控件,...

基于Aspose.Pdf把pdf文件每一页转换为图片

如题,直接上代码片段             //1.选择pdf文件            var dialog = new OpenFileDialog();             dialog.Filter = "pdf文件|*.pdf";             var dialogResult = dialog.ShowDialog();   ...