我目前正在开发一个将docx文件作为输入并使用它构建html页面的库,由于模糊和缺乏docx文档,我必须严重依赖示例输出来决定如何处理确定的事情。其中一个是超链接。
据我所知,到目前为止,docx至少有两种做超链接的方法:
主播 - <w:hyperlink w:anchor="_Toc000000000" history="1"></w:hyperlink>
这似乎是做toc-links这类事情的最佳方式。
Id - <w:hyperlink w:id="rId7" history="1"></w:hyperlink>
这似乎是为超链接指定网址的唯一方法(ID在.xml.rels
文件中定义)
到目前为止一直很好,我的问题是我遇到了文件,他们只是简单地指定了一个rStyle(在textrun对象上)的值“Hyperlink”然后似乎相信这会使文本充当一个超链接到在textrun中指定的标题。
例如,文档可以包含以下内容:
<w:p>
<w:pPr>
<w:pStyle w:val="Heading1"/>
</w:pPr>
<w:r>
<w:t>Introduction</w:t>
</w:r>
</w:p>
然后再往下走:
<w:p>
<w:r>
<w:t>This is a hyperlink to </w:t>
</w:r>
<w:r>
<w:rPr>
<w:rStyle w:val="Hyperlink"/>
</w:rPr>
<w:t>Introduction</w:t>
</w:r>
<w:r>
<w:t>.</w:t>
</w:r>
</w:p>
所以我的问题是,这些“超链接”(w:p
而不是w:hyperlink
)实际上是有效的,还是只是某些文字或我所拥有的文件的作者做错了?
答案 0 :(得分:3)
如果您说docx格式模糊且缺乏文档,您是否看过规格? http://www.ecma-international.org/publications/standards/Ecma-376.htm(虽然我发现它们在关键点上含糊不清。)
我至少有两种创建链接的方法。 w:超链接就是其中之一。
w:hyperlink
元素可以内部或外部链接,也可以或多或少地发挥作用。
在外部超链接的情况下,它将具有关系id,并且该文档的关系中的条目标记为具有uri的外部。规范说如果超链接是外部的,应该忽略anchor属性,但实际上,我发现Word将在这里粘贴外部URL的锚点部分。例如。 http://example.com/page#myAnchor
会在关系中存储不包含#myAnchor
的uri,而anchor
的{{1}}属性将包含“myAnchor”而不包含“#”。你可能想要检查两者。
对于内部超链接,锚点应该与hyperlink
元素的name
属性匹配,或者是一个特殊值,如“_GoBack”或“_top”。
第二种情况是链接的图像,遗憾的是,这种图像要复杂得多。图像将有一个w:bookmarkStart
,其中w:drawing
元素带有docPr
元素,该元素与目标的关系ID。规范似乎有点不清楚,但看看Word的作用,看起来如果关系是内部的,它将是一个书签名称(前缀为'#'),如果是外部的,则为uri。