簡體   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