如何让python-docx使用复杂的脚本?

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

我有一个工作的docx生成器,适用于欧洲语言,我正在尝试添加复杂的脚本支持。我找到了另一个问题,尝试了一些食谱:python-docx add_style with CTL (Complex text layout) language

我设法让它工作,以便复杂的脚本文本以正确的字体和大小出现,但我不能使双向(从右到左)文本工作。显而易见的“x.font.rtl = True”不起作用,其他帖子中给出的法术也不起作用(“lang.set(qn('w:bidi'),'fa-IR')”)。我不得不从他的食谱中取出“rpr.get_or_add_sz()”行,这给我留下了一个不可读的文件,但其他一切都没有它,我不认为这与这个问题有关。

以下是生成的文档的styles.xml文件中显示的样式:

<w:style w:styleId="Hebrew" w:type="paragraph" w:customStyle="1">
    <w:name w:val="Hebrew"/>
    <w:basedOn w:val="Normal"/>
    <w:pPr>
        <w:jc w:val="right"/>
    </w:pPr>
    <w:rPr>
        <w:rFonts w:cs="Arial"/>
        <w:rtl/>
        <w:szCs w:val="24"/>
        <w:lang w:bidi="he-IL"/>
    </w:rPr>
</w:style>

任何人都可以告诉我如何使从右到左语言的段落工作?

python openxml right-to-left python-docx bidi
1个回答
1
投票

根据上面的评论,以及ROAR的大力帮助(谢谢,ROAR!)我把一切都搞定了。

ROAR的配方here工作得很好,只是调用rpr.get_or_add_sz()给了我一个不可读的.docx文件。离开它使一切工作,似乎没有造成任何问题。关键的缺失环节是添加以下内容 在风格:

<w:bidi w:val="1">
<w:jc w:val="both"/>

有一个my_style.get_or_add_pPr()方法来获取对样式的<w:pPr>部分的引用,然后代码类似于更新<w:rPr>的代码:

w_nsmap = '{'+ppr.nsmap['w']+'}'
bidi = None
jc = None
for element in ppr:
  if element.tag == w_nsmap + 'bidi':
    bidi = element
  if element.tag == w_nsmap + 'jc':
    jc = element
if bidi is None:
  bidi = OxmlElement('w:bidi')
if jc is None:
  jc = OxmlElement('w:jc')
bidi.set(qn('w:val'),'1')
jc.set(qn('w:val'),'both')
ppr.append(bidi)
ppr.append(jc)

我需要的最后一件事是处理混合语言文本,我通过将文本分成多个运行来完成。我正在处理的希伯来语文本的段落被赋予了rtl = True的修改样式,但我拆分了任何以字母开头和结尾的ASCII序列:

[A-Za-z][\u0020-\u007e]*[A-Aa-z]

使用rtl = False进入单独的运行。

© www.soinside.com 2019 - 2024. All rights reserved.