4

我目前正在开发一个库,该库将 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>

    这似乎是为超链接指定 url 的唯一方法(在.xml.rels文件中定义了 id)

到目前为止一切顺利,我的问题是我遇到了文件,它们简单地指定了“超链接”的 rStyle(在 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)实际上是否有效,或者只是我所拥有的文件的作者做错了什么?

4

1 回答 1

3

当您说 docx 格式模糊且缺乏文档时,您是否查看过规范?http://www.ecma-international.org/publications/standards/Ecma-376.htm(虽然我确实发现它们在关键点上含糊不清。)

我知道至少有两种创建链接的方法。w:hyperlink 就是其中之一。

w:hyperlink元素要么在内部链接,要么在外部链接,并且或多或少地按照您发现的方式工作。

在外部超链接的情况下,它将有一个关系 id,以及该文档的关系中的一个条目,该条目标记为具有 uri 的外部。规范说如果超链接是外部的,锚属性应该被忽略,但在实践中,我发现Word会在这里粘贴外部url的锚部分。例如,将在没有关系的http://example.com/page#myAnchor情况下存储 uri ,并且属性将具有“myAnchor”而没有“#”。您可能需要同时检查两者。#myAnchoranchorhyperlink

对于内部超链接,锚点应该与元素的name属性相 匹配w:bookmarkStart,或者是一个特殊的值,如“_GoBack”或“_top”。

第二种情况是链接的图像,不幸的是,这要复杂得多。将有一个w:drawing用于图像的docPr元素,该hlinkClick元素将具有与目标的关系 id。此时规范似乎有点不清楚,但看看 Word 做了什么,看起来如果关系是内部的,它将是一个书签名称(带有 '#' 前缀),如果是外部的,一个 uri。

于 2013-03-18T18:44:49.903 回答