如何使用 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()
假设我有一个只有三个段落的 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 属性?我在文档中找不到它。我想知道
非常感谢您的帮助
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()