阻止Word 2010保存o:gfxdata base64或uuencoded VML?

时间:2013-01-28 23:35:03

标签: ms-word vml wordprocessingml opentbs drawingml

我正在使用.docx文件,其中包含插入了图像的几个绘图画布以及在Word 2010中绘制的一些线条和箭头。我使用的是2010格式,没有兼容模式。

Word会在每个o:gfxdatav:shape元素中插入v:group属性,并使用ascii编码的内容填充它。根据我的阅读,它可能是描述v:shapev:group的VML的副本。我不知道我是否只是不知道该寻找什么,但我无法确定这些数据是什么,因为它的删除对我在Word 2003,2007或2010中阅读或编辑文档的能力没有明显影响。

它会使document.xml膨胀到几乎两倍(明显的)必要大小。这个相当会减慢OpenTBS的处理速度,所以我想删除它,如果可能的话。有谁知道告诉Word 2010退出保存这些额外数据的方法?或者它是为了什么?我真的很难找到this post以外的任何文档。

修改

这是sample .docx。 document.xml大约为141KB,OpenTBS平均需要10.35秒才能创建一个包含21次子模板的文件。如果删除所有o:ogfxdata属性,文件大小将减少到~37KB,而OpenTBS只需2.99秒即可生成相同的文件。

编辑2:

经过进一步调查后,似乎删除了o:gfxdata可能会导致安装了较旧的Compatibilty Pack的Word 2003反对该文件,并出现以下错误:

  

“这是兼容包的预发行版本,可以打开   仅预发布Office 2007文件。你想检查一下吗?   兼容包的版本?“

我已经能够通过安装更新​​的兼容包来打开文件 - 虽然它会提示用户有关不兼容性并转换文件以便打开它。这不会损坏我的文件,但需要注意的事项。

1 个答案:

答案 0 :(得分:1)

在网络中记录的属性o:ogfxdata很少。 根据您的调查,这是一种兼容性附加信息。

您可以使用OpenTBS删除模板中的这些属性。 清理可以在模板上完成一次而不进行任何合并,然后将清理后的模板另存为新模板。或者,您可以在每次打开模板时执行清洁。

清洁DOCX文件:

while ($x = clsTbsXmlLoc::FindStartTagHavingAtt($TBS->Source, 'o:gfxdata', 0) ) {
  $x->ReplaceAtt('o:gfxdata', '');
  $TBS->Source = str_replace(' o:gfxdata=""', '', $TBS->Source);
}

请注意,类clsTbsXmlLoc随OpenTBS一起提供,并且未记录。 代码应该从OpenTBS 1.8.0开始工作。 (目前处于稳定的测试版)。

我注意到,由于删除了属性o:gfxdata,因此在编辑docx时它们不会立即返回。