完成 WordML 规范






2.55/5 (10投票s)
2005年1月11日
5分钟阅读

70219
在微软沉默的地方,尝试扩展文档。
引言
WordML 规范可能永远不会完全完成。但是,在这里,我们尝试在微软沉默的地方扩展文档。
RTF 规范由于在某些地方不完整,在其他地方含糊不清,在还有的地方是错误的(即与 Word 的行为不匹配)而变成了一个巨大的混乱。因此,每个编写代码读取/写入 RTF 文件的程序员都做出了不同的合理假设,导致我们得到一个可移植性不强的规范。
我希望在 WordML 的情况下,我们能让大多数开发人员做出相同的假设。这样,最坏的情况下,我们实际上会有两个 WordML 规范:一个是由所有非微软开发人员使用的通用假设,另一个是由 Word 团队的开发人员使用的假设。所以,当你做出自己的假设时,请 发邮件给我,告诉我你做了什么,我会将其添加到规范中,前提是你的假设不与已列出的假设相冲突。
注意:本文档的最新版本可以在 http://dave.thielen.com/articles/The%20WordML%20Spec.htm 找到。
问题
- 要在 WordML 文档中存储图像,.chm 文件说要使用
<pict>
,它有一个 <binData> 子节点。它列出了几个其他子节点,但对于位图图像,它们都无关紧要。WordProcessingML.doc 和 Word 保存的任何 XML 文件都显示了<v:shapetype>
和<v:shape>
子节点。但两者都没有解释这两个节点的任何属性或子节点。VML 模式列出了所有属性和子节点,但没有对其中任何一个进行描述。要在 WordML 文件中存储位图,需要设置哪些属性和子节点,以及使用什么值?如果我只是根据保存的多个文件来猜测,这里有太多未记录的元素,我肯定会在某些地方猜错(下面有关于我如何认为应该编写图像的详细信息)。 <instrText>
- 在哪里可以找到 Word 使用此字段的列表,以及如何设置每种情况下的所有属性和子节点?- 对于
<w:fldSimple w:instr=
,在哪里可以找到 Word 2003 支持的所有值的列表?以及每个值,它需要和/或使用的子节点列表。 - 当我在 Word 中创建超链接时,它会使用
<fldChar>
/<instrText>
/<fldChar>
...<fldChar>
的方式在 WordML 中保存它。为什么它这样做而不是使用hlink
(这是文档显示的内容)? - 阅读WordProcessingML.doc 和OfficeXML.chm 文件,似乎水平合并单元格应该使用
<hmerge>
节点创建。但是,当 Word 创建 XML 文件时,它使用gridSpan
。何时应该使用其中一个而不是另一个?(我假设既然它同时存在,就有原因,并且存在需要使用一个的情况,而另一些情况则需要使用另一个。)
假设
wx:
元素似乎是 w: 或 o: 元素的重复,用于使 Word 以外的程序(Internet Explorer?)更容易使文档显示相同。由于它们是冗余信息,并且在某些地方可能不正确(wx:bdrwidth
被指定为磅,但 Word 似乎以 twips 写入),我的方法是永远不要写入wx:
元素或属性,并在读取文档时从不使用它们。- 如果你只需要一个页眉或页脚,而不是奇数页和偶数页的页眉/页脚,只需创建一个奇数页页眉。由于 Word 就是这样做的,而且规范对此问题保持沉默,我的方法是创建一个仅偶数页的页眉是错误的。对于仅在偶数页上的页眉,请创建一个空白的奇数页页眉。
- 对于
<w:font>
,请不要读取/写入usb-0
…csb-1
属性。它们是不需要的,并且不能保证你系统上字体的数值在另一个人的系统上是相同的。 - 显然,没有办法设置文档的默认语言(与 RTF 不同)。你可以逐段设置。
- 当我在 WordML 文件中的文本节点中写入 "\u2003\u2002\u2009"(em,1/2em,1/6 em)时(使用 Courier,所以是固定宽度)
- em - 略小于 2 个字符宽度的空格。
- 1/2 em - 1 个字符宽度的空格。
- 1/6 em - 一个方框(未知字符符号)1 个字符宽。
- 使用 Arial 和 Times New Roman 时看起来都一样。1/6 em 的方框绝对是错误的,而其他间距也不是你通常得到的。不知道为什么,但 Word 的做法就是这样。
<w:pBrdr><w:top w:space='#'>
的单位被列为 1/8 磅。然而,Word 似乎将其解释为 1 磅。它确实接受并处理实数,所以你可以有<w:pBrdr><w:top w:space='3.5'>
。- Word 创建
<w:lvlText w:val="%1.%2.$3."/>
,其中格式化似乎将级别 1 数字放在 %1,级别 2 数字放在 %2,依此类推。Word 只允许 9 个级别,所以 %10 应该被认为是无效的。 - 字符 0x2011(不间断连字符)显示为未知字形框。如果你对“未知字形”框使用
ToggleCharacterCode
= Ctrl+X 两次,它会正确显示和工作。所以使用<w:noBreakHyphen/>
代替。
图像
这相当多,所以我将其放在自己的部分。我在这里的内容是有效的——但我不得不做出很多假设。我几乎肯定其中一些与微软的假设不符。
GIF
<w:pict>
<w:binData w:name="wordml://01000006.gif">R0lGODlhEAAQALMAAAAAAIAAAACAAICAAAA
AgIAAgACAgICAgMDAwP8AAAD/AP//AAAA//8A/wD//////yH5BAEAAA0ALAAAAAAQABAAAARaMJxJ
Z7u4ncf7Axm2ASRAIGCofQ7DnGk4ui+qrkSeV5WG/L+NhwM6lEijo03YGTkMhsMSoah8oFFb4wgYV
bSalBQIjBkvRm63e1gM2ENOGuBGUnnnbUxNakQAADs=
</w:binData> <v:shape id="_1" type="#_x0000_t75"
style="width:12pt;height:12pt">
<v:imagedata src="wordml://01000006.gif" o:title="networ6"/>
</v:shape>
</w:pict>
binData
是 GIF 图像的 uuencode
。不要更改 type="#_x0000_t75"
。wordml:name.gif 必须匹配。style="width:12pt;height:12pt"
指定了文档中的大小。
PNG
<w:pict>
<w:binData w:name="wordml://03000001.png">iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBA
MAAADt3eJSAAAAB3RJTUUH1QEDFRoyw+VrogAAAAlwSFlzAAALEgAACxIB0t1+/AAAACdQTFRF/w
D/AAAA//8AgIAAgICAwMDAAP8A////AICAAP//AACAAAD/gAAA6ZmItQAAAAF0Uk5TAEDm2GYAAA
BoSURBVHjaNcvBDYAgDIXhugEvwUTikUVsUsIEbOAOrOAgemEFrw5mC9rTn/R79IjIRnq51up6AN
eIcH+x/tHa2X0qZXgG1M/O5jkcyVHaJS8Wk768aBCbLz3Ug0mitzkTItQLE8E83Atm2Rvlc68eJA
AAAABJRU5ErkJggk==</w:binData>
<v:shape id="_x0000_i1025" type="#_x0000_t75" style="width:12pt;height:12pt">
<v:imagedata src="wordml://03000001.png" o:title="network"/>
</v:shape>
</w:pict>
在 WordML 中,相同的类型,不同的扩展名。此外,.NET uuencode
以 ...BJRU5ErkJggg==
结尾。不知道这是什么类型的错误(如果有的话)!!!
JPG
<w:pict>
<w:binData w:name="wordml://02000001.jpg">/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAA
UDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEP
ERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4e
Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCAAQABADASIA
AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA
AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3
ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm
p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA
AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx
BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK
U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3
uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDOl8Se
I5Pinonh7whceF7nRRcadamxiXR3ldBBbrcReXIv2gOJBcbiW9MbQuTmWVgtj4cikufFHhrVJ7SC
BbprHXbe9lZ2eOEPtjdnIMkijcR/ECcVf8P+PvElv4w0Yy+P7m90lIY7ldPvJPItLNoZX2x3mId9
um1I3QsCSqlvmyoONq914c0/wTc6ZpXiTwlfzw29qkUVt4jnu7q5+zSRSRxIjWUSszGJU4YYDZAb
AU/R4DN6uXVIqmoreLaTfNyzabd9b3XRdtD6HKswx3D+NSptNTbUnq9FJrRWu9fuTXof/9k=
</w:binData>
<v:shape id="_x0000_i1025" type="#_x0000_t75" style="width:12pt;height:12pt">
<v:imagedata src="wordml://02000001.jpg" o:title="network"/>
</v:shape>
</w:pict>
本文档的最新版本可以在 http://dave.thielen.com/articles/The%20WordML%20Spec.htm 找到。
本文档可以自由分发,只要完整分发。