Aspose.words 书签定位

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 中的模型图。

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

3. 查看 DOM

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

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

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

书签在word 中的样子。

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

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

在 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找到某一个书签

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

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

那么 Bookmark 与 Node 是什么关系。

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

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

这样我们可以从 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 也可以。各种尝试之后不行,可以回到源头,想一下这个需求是不是本身就有问题,是不是可以换个方式实现。“否定问题是解决问题最好的方法”。

时间: 2024-10-18 15:30:31

Aspose.words 书签定位的相关文章

4-2-word2003-Word文本操作

二.Word文本操作 1.文本清除 1.1.明白下面两个键的不同 Backspace(退格键) 删除光标以左的内容 Delete (删除键)    删除光标以右的内容 1.2.用鼠标拖选的方法,把下面两段一次性删除 拖选 开始位置单击+shift+结束位置单击     Internet源于美国,最初为了实现科研和军事部们里不同结构的计算机网络之间互联而设计,现已普及到全世界.随着通信线路的不断改进,特别是微机的普及,Internet几乎无所不在,无所不为了.    我国于1994年4月正式连入I

vim笔记2

用vim 快两年了 看过教程也不少,总的来说还是得自己多练习,当自己觉得有需要的时候,再添加功能.这里分享个看过的最好的教程,出自贴吧的某个朋友,写的很好 零 学会盲打 壹 配置文件先从最简开始,在 伍级 前别考虑配置插件,千万别硬背命令,千万别直接取用别人的配置文件 基本还是长时间待在 insert mode 下,会觉得 vim 也不过尔尔,也不好用, 这个时候,编辑效率可能比用原来的一般编辑器还低,别人问使用什麼编辑器时, 多半会回答:vim 再配一个 nano, kate, kwrite,

C#,WPF使用word模板导出word文档

使用word模板导出word文档,首先需要在word模板中插入书签: 根据创建的书签名和位置,将需要写入的内容插入到word文件中. 需要引用  Microsoft.Office.Interop.Word;在添加引用-程序集中搜索可以找到. using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Windows; usin

操作Word里的表格,提示 集合所要求的成员不存在?

操作Word里的表格,提示 集合所要求的成员不存在? 遇到的问题: c++操作cell导出的word中的表格,提示集合中所要求的成员不存在: 分析原因: word中没有插入书签,导出时不能正确定位导致: 解决办法: 查看word文件,插入书签定位:完美解决:

DocX开源WORD操作组件的学习系列三

替换文本 private static void ReplaceText() { Console.WriteLine("ReplaceText()"); File.Copy(@"docs\Lists.docx", @"docs\ReplaceText.docx", true); using (var document = DocX.Load(@"docs\ReplaceText.docx")) { //全局替换 documen

Intellij IDEA 最全实用快捷键整理

正文前: 1. IDEA内存优化(秒开的快感!!) 因机器本身的配置而配置: \IntelliJ IDEA8\bin\idea.exe.vmoptions // (根据你的配置变大!!) -----------------------------------------  -Xms2048m     -Xmx2048m  -XX:MaxPermSize=512m  -ea  -server  -Dsun.awt.keepWorkingSetOnMinimize=true ------------

C#第三方Aspose.Words.dll导出Word(书签模板)方式说明

项目有遇到需要导出Word,在别人写好的基础上去修改样式,导出后发现样式不正确不整齐,于是采用模板的方式重新导出 1.模板word文件的制作,本人用office2013,在设计好需要的整个表格之后,在你需要替换的位置"插入"--书签 并命名,此命名需要在程序中进行替换 将做好的模板word文件放在程序目录下 2.引用Aspose.Words.dll 3.新建类WordOpAp.cs 1 public class WordOpAp 2 { 3 4 static public object

aspose.word 在书签处插入符号

doc.Range.Bookmarks["CBJYQQDFS110"].Text = ""; Aspose.Words.DocumentBuilder builder = new Aspose.Words.DocumentBuilder(doc); builder.MoveToBookmark("CBJYQQDFS110"); builder.Font.Name = "Wingdings 2"; builder.Font.Si

Aspose Word模板使用总结

Aspose Word模板使用总结 1.创建word模版,使用MergeFeild绑定数据 新建一个Word文档,命名为Template.doc 注意:这里并不是输入"<”和“>”就可以了,而是必须在菜单的"插入→文档部件→域”找到MergeField并输入相应的域名 2.使用数组提供数据源 string tempPath = Server.MapPath("~/Docs/Temp/Template.doc"); string outputPath =