我有一个工作的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>
有人可以建议我如何使从右到左语言的段落起作用吗?
答案 0 :(得分: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_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)
我需要做的最后一件事是处理混合语言的文本,这是通过将文本分成多个部分来完成的。我正在处理的希伯来语文本的paras带有rtl = True的修改后的样式,但是我拆分了以字母开头和结尾的所有ASCII序列:
[A-Za-z][\u0020-\u007e]*[A-Aa-z]
使用rtl = False分开运行。