使用 Python docx 库在页眉和/或页脚 RTL 中制作表格内容

问题描述 投票:0回答:1

我有一个 Word 文档,其标题中有一个空的 1 x 3 表格(或具有任何尺寸的表格)。 我希望能够使用 python-docx 库操作表格的单元格。该文档的语言是波斯语,自然所有波斯语文本都必须从右到左开始。代码如下:

from docx import Document

document = Document("test.docx")

c = document.sections[0].header.tables[0].rows[0].cells[0]
c.text = "سلام"
document.save("output.docx")

问题是无论我使用什么样的技巧来改变文本方向,我都无法让它发挥作用。我尝试过使用

WD_TABLE_DIRECTION.RTL
标志来更改表格的方向,或使用
run.font.rtl = True
更改运行方向,甚至使用特殊的 unicode 字符(例如
u'\u202B'
u'\u202C'
)来更改方向,但是没有成功。

我什至尝试更改与标头相关的 xml,但老实说,这超出了我的能力范围,不幸的是,我的所有尝试都失败了。

我在深夜写下这个问题,我无法表达我现在对我的母语的仇恨程度。因此,任何帮助将不胜感激。

python ms-word docx python-docx
1个回答
0
投票

如果您使用 python.docx 设置

_Cell.text
,那么首先会删除所有单元格内容,然后在单元格中设置一个新段落,其中包含一个包含该文本的新文本运行。但是用于使段落文本方向从右到左的
bidi
区域设置是段落属性的一部分,在删除单元格内容时会被删除。新创建的段落将是默认段落,没有
bidi
区域设置。

因此,而不是

c.text = "سلام"
,您应该尝试在单元格中找到第一个段落 - 总是应该有一个 - 并清除该段落。然后获取找到的段落的段落属性并检查它是否设置了
w:bidi
。如果没有,请设置它。然后向段落添加新的文本运行,从段落属性复制可能现有的运行属性或创建新的运行属性并将
w:rtl
设置为该运行属性。终于定了
run.text = "سلام"
.

完整示例:

from docx import Document
from copy import copy
from docx.oxml import OxmlElement

document = Document('test_in.docx')

cell = document.sections[0].header.tables[0].rows[0].cells[0]
#c.text = "سلام"

paragraph = cell.paragraphs[0]

paragraph.clear()

ct_ppr = paragraph.paragraph_format._element.pPr

ct_ppr_has_bidi = len(ct_ppr.xpath("./w:bidi")) > 0
if not ct_ppr_has_bidi:
    ct_bidi = OxmlElement("w:bidi")
    ct_ppr.append(ct_bidi)

run = paragraph.add_run()
ct_ppr_has_rPr = len(ct_ppr.xpath("./w:rPr")) > 0
if ct_ppr_has_rPr:
    ct_rpr = copy(ct_ppr.xpath("./w:rPr")[0])
else:
    ct_rpr = OxmlElement("w:rPr")
ct_rtl = OxmlElement("w:rtl")
ct_rpr.append(ct_rtl)
run._element.append(ct_rpr)
        
run.text = "سلام"
            
document.save('output.docx')
© www.soinside.com 2019 - 2024. All rights reserved.