如何让 python-docx 使用复杂的脚本?
How to get python-docx working with complex scripts?
我有一个适用于欧洲语言的有效 docx 生成器,我正在尝试添加复杂的脚本支持。我发现了另一个问题,其中包含一些要尝试的食谱:
我设法让它工作,以便以正确的字体和大小显示复杂的脚本文本,但我无法使双向(从右到左)文本工作。明显的 "x.font.rtl = True" 不起作用,另一个 post ("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>
谁能告诉我如何使从右到左的语言中的段落正常工作?
根据上面的评论,在 ROAR 的大力帮助下(谢谢,ROAR!)我一切正常。
ROAR 的配方 工作完美,除了调用 rpr.get_or_add_sz() 给了我一个不可读的 .docx 文件。将其排除在外使一切正常,并且似乎没有引起任何问题。关键缺失 link 是将以下内容添加到 样式中:
<w:bidi w:val="1">
<w:jc w:val="both"/>
有一个my_style.get_or_add_pPr()方法来获取对样式的部分的引用,然后代码类似于更新的代码:
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 进行单独运行。
我有一个适用于欧洲语言的有效 docx 生成器,我正在尝试添加复杂的脚本支持。我发现了另一个问题,其中包含一些要尝试的食谱:
我设法让它工作,以便以正确的字体和大小显示复杂的脚本文本,但我无法使双向(从右到左)文本工作。明显的 "x.font.rtl = True" 不起作用,另一个 post ("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>
谁能告诉我如何使从右到左的语言中的段落正常工作?
根据上面的评论,在 ROAR 的大力帮助下(谢谢,ROAR!)我一切正常。
ROAR 的配方
<w:bidi w:val="1">
<w:jc w:val="both"/>
有一个my_style.get_or_add_pPr()方法来获取对样式的
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 进行单独运行。