背景技术
现在很多电子文档格式采用“物理容器+文档模型”的架构来描述和存储数据,其中,文档模型中包括各类数据描述文件,比如,文档主入口文件、安全性描述文件、资源描述文件等,物理容器主要用于存储数据,就好像一个虚拟存储系统(Virtual Storage System),将文档模型中的各类数据描述文件组织起来。大多数的电子文档格式采用Zip包作为物理容器,比如微软的OOXML和XPS等。也有一些电子文档格式采用其它的物理容器,比如Adobe的PDF采用文本文件作为物理容器。
在电子文档应用中,往往会涉及到对文档进行修改。考虑到数据存储效率,采用增量修改的方式对文档进行修改。增量修改是指将用户编辑修改的数据作为一个增加的部分进行存储,而不是对被编辑的对象数据直接进行修改。增量修改的优点在于,一是由于不需要对文档整体进行重新存储,只需要在文档中附加增加部分的数据即可,所以可最大限度地减少文件需要移动的数据量,提高数据存储的效率;二是保留了所有的历史数据,这样可以对文档的历史版本进行追溯,在很多修订的场景下非常有用。
但是,对于采用Zip包作为物理容器的电子文档,由于Zip无法实现增量修改的功能,因此也无法对文档的历史版本进行追溯。而对于现有的支持增量修改的电子文档,比如PDF和DOC,尽管支持增量修改,但是它们是直接通过文档格式中的某些数据结构来进行历史追溯的,这种方式是和文档模型直接耦合的。比如,PDF采用交叉索引表(Cross-reference Table)来进行历史追溯,而交叉索引表是基于PDF的页面对象(object)的索引,页面对象描述在文档模型中定义,因此交叉索引表与文档模型直接耦合。如图1所示,每次对PDF文档进行一次增量修改,在物理容器中就增加一个交叉索引表,通过这些交叉索引表获取文档的历史版本。如果有另外一种文档格式想复用PDF的增量修改和历史版本追溯模型,就必须完全采用PDF的页面对象组织方式。也就是说,对于不同的文档格式,由于其文档模型不同,我们往往需要设计新的增量修改和历史版本追溯方式。
此外,由于版本追溯方式和文档模型耦合太紧密,导致无法很好地区分开物理容器的历史版本和文档模型的历史版本,这样,就无法实现对于真正的文档历史的追溯。如图1所示,物理容器中的交叉索引表与文档模型直接耦合,因此难以分离物理容器的历史版本和文档模型的历史版本。举例来讲,每次对文档进行增量修改时,可能会认为物理容器和文档模型都会增加一个历史版本,但实际上文档模型的版本可能并没有改变,应用系统可能是通过数字签名等方式来确定文档模型的历史版本。在这种情况下,就不能正确地进行文档的历史版本追溯。另外,物理容器版本和文档模型版本耦合太紧密还会造成这样的问题,即,不同的文档模型难以复用同一个物理容器,同一个文档模型难以选用不同的物理容器。
发明内容
为了解决现有技术中的上述问题,本发明提出了一种电子文档的历史版本数据处理方法及装置,以通过降低物理容器和文档模型之间的版本信息耦合性来实现便于不同的文档格式复用的历史版本追溯方法。
为了实现以上目的,本发明提供一种电子文档的历史版本数据处理方法,该方法包括以下步骤:在电子文档中建立历史映射表,所述历史映射表表示物理容器的历史版本和文档模型的历史版本的映射关系;和当物理容器的历史版本和文档模型的历史版本同时更新时,更新历史映射表。
可在电子文档文档模型的入口位置之前建立历史映射表。历史映射表可由二元组序列组成,每个二元组序列包括物理容器的历史版本号和文档模型的历史版本号。所述更新历史映射表的步骤可包括将更新的物理容器的历史版本号和文档模型的历史版本号组成所述二元组添加到历史映射表中的步骤。
对经过上述处理的电子文档进行历史版本追溯时,根据需要得到的文档模型的历史版本,在历史映射表中查找对应的物理容器的历史版本,然后在物理容器中提取对应版本的数据。
根据本发明的电子文档的历史版本数据处理装置包括:历史映射表建立单元,在电子文档中建立历史映射表,所述历史映射表表示物理容器的历史版本和文档模型的历史版本的映射关系;和历史映射表更新单元,当物理容器的历史版本和文档模型的历史版本同时更新时,更新历史映射表。
该装置还可包括:电子文档保存单元,每次更新历史映射表时,保存电子文档;和历史版本追溯单元,根据需要得到的文档模型的历史版本,在历史映射表中查找对应的物理容器的历史版本,然后在物理容器中提取对应版本的数据。
本发明通过为物理容器和文档模型建立一个历史映射表来降低物理容器和文档模型之间的版本信息耦合性,从而实现“一个物理容器+多个文档模型”的技术架构,即,不同的文档格式可采用同一套容器结构。在这种技术架构下,对于支持增量修改的物理容器,通过上述历史映射表,可方便地对这些格式的文档进行历史版本的追溯。
具体实施方式
本发明适用于采用“物理容器+文档模型”技术架构的电子文档格式,其物理容器需要支持增量修改和历史版本追溯,比如,CEBX、UOF、XPS等。其中,CEBX为方正技术研究院将于2009年发布的新一代版式文档格式,CEBX和OOXML、XPS等文档格式类似,也是采用“物理容器+文档模型”的整体技术架构,其物理容器支持增量修改和历史版本追溯,简称为XDA(XML-based Document Archive),以下将在实施例中对其进行描述。应该指出,CEBX满足本发明的适用条件,无论其具体内容如何,都不影响本发明的应用。
为了降低物理容器和文档模型的耦合性,根据本发明的电子文档的历史版本数据处理方法包括以下步骤:
第一步,在电子文档文档模型的入口位置之前建立历史映射表,该历史映射表表示物理容器的历史版本和文档模型的历史版本的映射关系。
所述历史映射表建立在文档模型的入口位置之前,所以它独立于物理容器和文档模型,可记录物理容器和文档模型各自的历史版本,从而将物理容器和文档模型分离,降低物理容器和文档模型的历史版本信息的耦合性。
第二步,当物理容器的历史版本和文档模型的历史版本同时更新时,更新历史映射表。
关于物理容器的历史版本和文档模型的历史版本的更新,根据不同的应用采用不同的判定方法。一般而言,每次对电子文档进行增量修改时,可认为增加一个物理容器的历史版本。而关于文档模型的历史版本的更新,可采用数字签名来确定文档模型的历史版本,也可采用添加修订标记、版本标记、用户标记等操作来确定文档模型的历史版本。例如,在采用数字签名确定文档模型的历史版本的情况下,每进行一次数字签名,就认为增加了一个文档模型的历史版本。在历史映射表中,可通过版本号来记载物理容器和文档模型的映射关系。
第三步,对经过上述处理的电子文档进行历史版本追溯时,根据需要得到的文档模型的历史版本,在历史映射表中查找对应的物理容器的历史版本,然后在物理容器中提取对应版本的数据。
此外,在文档模型中涉及到和历史版本相关的部分,可引用历史映射表中的历史版本,从而简化数据描述。
以下将参考附图描述本发明的实施例。
在本发明的实施例中,电子文档采用一种简称为XDA(XML-basedDocument Archive)的物理容器,有关XDA的内容可参见于2008年10月14日提交到中国专利局的申请号为200810224424.0的专利申请《一种文件打包的方法和装置》。与Zip相比,XDA在增量修改、数据线性化以及压缩效率方面都具备一定的优势。
图2显示了支持增量修改的物理容器XDA的结构。如图1所示,XDA由文件头(header)、文件流入口描述(entry)和各文件的内容流(bitstream)组成,其中,文件头描述版权信息、版本号、包含的历史版本数量等一些最基本的信息,文件流入口描述描述每个文件流在物理容器中的位置以及文件相关信息,各文件的内容流是文件流入口描述中记录的多个文件流的顺序组合。在XDA中,文件流入口描述(entry)和各文件的内容流(bitstream)成对出现,形成一组修改的历史记录,文件流入口描述(entry)中包括指向下一个文件流入口描述(entry)的起始位置的next指针。
图3显示了物理容器XDA进行增量修改的示意图。如图3所示,首先在XDA的原尾部增加新的文件流入口描述(entry)和各文件的内容流(bitstream),然后将原来最后一个文件流入口描述(entry)的next指针指向这个新增加的文件流入口描述(entry)的起始位置。这样,XDA的历史版本可根据文件流入口描述(entry)的个数来确定,也就是说,每进行一次增量修改,就增加一个文件流入口描述(entry),可以认为XDA就增加一个历史版本。
关于文档模型的历史版本,在本发明的实施例中,采用数字签名来确定文档模型的历史版本。每进行一次数字签名,就认为增加了一个文档模型的历史版本。
图4显示了在文档模型的入口位置之前建立历史映射表的示意结构图。如图4所示,文档对象DocBody节点代表了CEBX文件中的文档模型入口位置,在主入口文件中每个DocBody节点之前为每个文档对象建立一个对应的历史映射表RevisionTrack,该历史映射表由一个二元组序列组成,每个二元组表示物理容器的历史版本和文档模型的历史版本的映射关系。
图5显示了历史映射表的示意结构图。如图5所示,历史映射表RevisionTrack包括一个DocRevision序列,每个DocRevision由一个PhysicalSeqNumber和一个RevisionNumber组成,可表示为(PhysicalSeqNumber,RevisionNumber),其中,PhysicalSeqNumber表示物理容器XDA的历史版本号,从1开始,RevisionNumber表示文档模型的历史版本号,也是从1开始。在文档模型定义中涉及到和历史版本相关的部分,可引用上述历史映射表中的历史版本号PhysicalSeqNumber和RevisionNumber。相应地,在数字签名中定义RevisionNumber属性,用于引用上述历史映射表中的文档模型的历史版本号RevisionNumber。
在用户对采用XDA的电子文档进行编辑之后进行保存日寸,应用系统对电子文档进行增量修改,这时XDA中会增加一个历史版本,记为Vp。如果这时用户对该电子文档进行了数字签名,则认为文档模型增加了一个历史版本,记为Vd。此时,应用系统在历史映射表中增加一个DocRevision二元组,其中,在PhysicalSeqNumber中记录Vp,在RevisionNumber中记录Vd,即,增加一个二元组(Vp,Vd)。
如果需要对历史版本进行追溯,比如需要得到文档模型历史版本Vd’(1<=Vd’<=Vd)的数据,则可以通过历史映射表查到与Vd’对应的物理容器历史版本Vp’,然后在物理容器XDA中取得与Vp’对应的数据。
图6显示了本发明的电子文档的历史版本数据处理装置的结构图。如图6所示,该装置包括:历史映射表建立单元,在电子文档中建立历史映射表,所述历史映射表表示物理容器的历史版本和文档模型的历史版本的映射关系;和历史映射表更新单元,当物理容器的历史版本和文档模型的历史版本同时更新时,更新历史映射表。
该装置还可包括:电子文档保存单元,每次更新历史映射表时,保存电子文档;和历史版本追溯单元,根据需要得到的文档模型的历史版本,在历史映射表中查找对应的物理容器的历史版本,然后在物理容器中提取对应版本的数据。
通过以上实施例可看出,本发明通过在文档模型的入口位置之前为每个文档对象建立一个表示物理容器历史版本和文档模型历史版本的映射关系的历史映射表,降低了物理容器和文档模型之间的版本信息耦合性,从而实现了“一个物理容器+多个文档模型”的技术架构。在这种技术架构下,不同的文档格式可采用同一套容器结构。对于支持增量修改的物理容器,通过上述历史映射表,可方便地对这些格式的文档进行历史版本的追溯。也就是说,对于采用支持增量修改的物理容器的电子文档,通过如上建立历史映射表,可复用根据本发明的历史版本追溯方法,而无需针对每种文档格式设计不同的历史版本追溯方法。此外,由于物理容器和文档模型之间的版本信息耦合性降低,所以除了不同的文档模型可复用同一个物理容器之外,同一文档模型也可选用不同的物理容器。在这种情况下,通过如上建立历史映射表,也可方便地实现历史版本的追溯。
尽管以上参考实施例描述了本发明,但是,应该理解,本发明不限于所公开的实施例,任何类似的替换和修改都应包括在本发明中。例如,除了在文档模型的入口位置之前建立历史映射表之外,还可以在电子文档的其它位置建立历史映射表,只要能够方便获取历史映射表并且历史映射表和文档模型相对独立即可。更新历史映射表的方式和历史映射表中的映射关系表示不限于实施例所公开的更新方式和映射表示,只要能反映物理容器的历史版本和文档模型的历史版本之间的对应关系即可。本发明所适用的电子文档的物理容器不限于XDA,也就是说,本发明适用于采用任何支持增量修改的物理容器的电子文档。