繁体   English   中英

了解 docx 文件中的书签

[英]Understanding bookmarks in docx file

我正在尝试从 Docx 文件中提取书签,我编写了一段代码,用于提取某些 Docx 文件中的书签,但在某些 docx 文件中找不到任何书签。 我正在使用 python-docx

我基本上是找到w:bookmarkStart标签并转到其父标签并检索段落中的所有运行。 但是有些文档既没有w:bookmarkStart也没有超链接标签,但是 Docx 查看器能够识别书签。

这是段落的XML内容,它是 docx 查看器中的书签,但不包含任何书签或超链接标签。

注意:我提到的代码适用于使用 Google Docs 创建的 Docx 文件。

    from docx.oxml.shared import qn
    from docx import Document

    def get_toc(self):
        doc_element = self.document.part._element
        bookmarks_list = doc_element.findall('.//' + qn('w:bookmarkStart'))
        for bookmark in bookmarks_list:
            par = bookmark.getparent()
            runs = par.findall(qn('w:r'))
            for run in runs:
                try:
                    print(' ', run.find(qn('w:t')).text, end=' ')
                except:
                    pass
            print('\n','-'*50)

我是不是遗漏了什么,还是需要找一些其他的标签?

如果没有,在这种情况下如何识别书签?

在 Open XML 文档中,书签由一对匹配的w:bookmarkStart和一个w:bookmarkEnd元素定义,其中每个元素都有一个具有相同值的w:id属性。

这是一个带有书签的示例段落,其中仅包含文本“第二个”而不是段落的全文(例如,“第一、第二和第三”)。

<w:p>
  <w:r>
    <w:t xml:space="preserve">First, </w:t>
  </w:r>
  <w:bookmarkStart w:id="1" w:name="MyBookmarkName" />
  <w:r>
    <w:t>second</w:t>
  </w:r>
  <w:bookmarkEnd w:id="1" />
  <w:r>
    <w:t>, and third.</w:t>
  </w:r>
</w:p>

这意味着:

  • 没有那些w:bookmarkStartw:bookmarkEnd元素就没有书签(所以你链接的段落不包含书签)和
  • 检索w:p只是因为您发现w:bookmarkStart元素不正确。

还有更多需要注意的地方:

  • 一个书签可以跨越多个段落,留出一个或多个龙头的运行w:p含有w:bookmarkStart和一个或多个尾随的运行w:p含有w:bookmarkEnd
  • w:bookmarkStartw:bookmarkEnd甚至都可以出现在w:p元素之外,例如,作为w:body子元素。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM