Search code examples
pythondocxright-to-left

Can't set font size and rtl


Using docx, I am trying to define for a run multiple attributes. When I set color, rtl, it works fine. But when I add also font size, it is ignored. If I set only font size, it works fine.

This works fine (font color changes and run is right-to-left):

run = p.add_run(line)
font = run.font
font.rtl = True
font.color.rgb = RGBColor(0x42, 0x24, 0xE9)

This also works fine (font size is modified):

run = p.add_run(line)
font = run.font
font.size = Pt(8)
#font.rtl = True # commented out

But this does not change the font's size:

run = p.add_run(line)
font = run.font
font.size = Pt(8)
font.rtl = True

I tried different order of the commands, but nothing works.


Solution

  • ok, found it! It turns out that in word, the font size for such a case has to include complex script instructions. It means that you have to add

    <w:szCs w:val="???"/> 
    

    instead (or in addition to) the normal

    <w:sz w:val="??"/> 
    

    I had to add a new attribute to the font in the docx library and it now works fine. The change is in 3 docs files:

    text/font.py
    oxml/__init.py__
    oxml/text/font.py
    

    and the usage in my view:

    run = p.add_run(line)
    font = run.font
    #font.size = Pt(8) This line is redundant - but you can leave it
    font.cs_size = Pt(8)
    font.rtl = True
    

    Added a fork to docx library. In https://github.com/Oritk/python-docx