如何使用 python-docx 隐藏 Word .docx 文件中的完整段落

how to hide a full paragraph in Word .docx file using python-docx

假设我有一个只有三个段落的 Word .docx 文档:

Visible
I want to hide this one
Visible

...我想隐藏中间的,像这样:

Visible
Visible

使用 MS-Word,我通过简单地选择整个中间段落(包括段落结束标记),然后转到字体设置并选择“隐藏”来实现这一点。这将隐藏完整的段落文本,包括段落标记 .

使用 python-docx 我能够隐藏文本,但不能隐藏段落标记的结尾(因此在剩余的两个可见段落之间有不需要的换行符)。这是我的结果:

Visible

Visible

这是我的代码:

def hiddenParagraphTest():
    from docx import Document
    d = Document()
    p = d.add_paragraph("Visible")
    p = d.add_paragraph()
    r = p.add_run()
    r.text = "Hidden"
    r.font.hidden = True
    p = d.add_paragraph("Visible")
    d.save("hiddenparagraphtest.docx")

hiddenParagraphTest()

我的印象是发生这种情况是因为段落标记不是任何运行的一部分。 那么应该如何使用 python-docx 来实现呢?

某处是否有段落的 .hidden 属性?我在文档中找不到它。我想知道 (不是关于 python-docx)是否有某种相关性。

非常感谢您的帮助

PS:我的示例代码打算使用 python-docx 生成一个新文档......但我认为如果我尝试打开一个预先存在的 .docx 文件,同样的问题也适用为了完全隐藏某个段落。

你快到了。像在 MS-Word 中那样隐藏段落并检查来源 xml,它看起来像:

<w:p>
    <w:pPr>
        <w:rPr>
            <w:vanish/>
        </w:rPr>
    </w:pPr>
    <w:r>
        <w:rPr>
            <w:vanish/>
        </w:rPr>
        <w:t>Hidden</w:t>
    </w:r>
</w:p>

与您的代码生成的 docx 相比,您应该会发现额外的 w:pPr 节点,即段落 属性,起到了作用。

那么,让我们手动添加这个 属性。

from docx.oxml import OxmlElement

def setHiddenProperty(p):
    pPr = OxmlElement('w:pPr') # paragraph property
    rPr = OxmlElement('w:rPr') # run property
    v = OxmlElement('w:vanish') # hidden
    rPr.append(v)
    pPr.append(rPr)
    p._p.append(rPr)

最后,将其应用到您的代码中。

def hiddenParagraphTest():
    from docx import Document
    d = Document()
    p = d.add_paragraph("Visible")

    p = d.add_paragraph()
    setHiddenProperty(p)  # set paragraph hidden property
    r = p.add_run()
    r.text = "Hidden"
    r.font.hidden = True

    p = d.add_paragraph("Visible")
    d.save("hiddenparagraphtest.docx")

hiddenParagraphTest()