Search code examples
pythonalignmentdocxpython-docx

python docx align both left and right on same line


This is my first question on SO and would like to thank you all in advance for any help. I'm pretty new to python, python-docx and programming in general. I am working on a GUI program (using PyQt) to generate a contract in docx format. I have most things working, but here is the problem I am having. I need to align text both left and right on the same line. In word, I believe this is done by changing to a right indent and hitting tab, then adding the text. However, I cannot figure out how to do this in python-docx. I tried:

paragraph = document.add_paragraph()
paragraph.add_run('SOME TEXT')
paragraph.alignment = 0
paragraph.add_run('SOME OTHER TEXT')
paragraph.alignment = 2

but this didn't work. I tried some other ideas per the documentation, like enum WD_PARAGRAPH_ALIGNMENT, but nothing worked.

Is this possible to do in python-docx (im using version 0.8.5)?

Thanks for any help!


Solution

  • Not sure if you're still looking for a solution, but...

    I am also generating contracts with python-docx and came across this same issue. Until the right-aligned tab stop feature is added, my workaround is to format the line as a table, using a custom table style.

    • First, open a document ('custom_styles.docx') and add a table with 1 row and 2 columns.
    • Select the table and add a new table style ('CustomTable'), where the first column is left-aligned and the last column is right-aligned. (I also made the borders invisible by setting them to 'none' or coloring them white.)
    • Delete the table and save the document, which will give you an empty document with the new 'CustomTable' style.

    The following should work for creating a line that appears to be both left-aligned and right-aligned:

    from docx import Document
    
    document = Document('custom_styles.docx')
    table = document.add_table(1, 2, style='CustomTable')
    table.cell(0,0).text = 'Left Text'
    table.cell(0,1).text = 'Right Text'
    document.save('new_document_name.docx')
    

    The trickiest part for me was figuring out how to create the table style in Word.