Skip to content

Text justify doesn't work with middle and right anchor (and last line is also always justified) #8897

@AdrianoVM

Description

@AdrianoVM

What did you do?

Used multiline_text() with alignment set to 'justify' and anchor set to 'mm'

What did you expect to happen?

I expected the resulting text to respect the anchor, and to be justified: with space added between words so that both edges of each line are aligned with each other, and for the last line in the paragraph to be aligned left.

What actually happened?

First line was fine, but second line starts at the center, ends too far, and is crushed. Last line was justified instead of left aligned, and slightly to the right.
See image at the bottom of the issue for an example.

After testing anchors 'mm', 'lm', and 'rm', none behave as expected (left anchoring only has the last line being justified as an issue, which could be by design).

What are your OS, Python and Pillow versions?

  • OS: Windows 11
  • Python: 3.12.4
  • Pillow: 11.2.1
--------------------------------------------------------------------
Pillow 11.2.1
Python 3.12.4 (tags/v3.12.4:8e8a4ba, Jun  6 2024, 19:30:16) [MSC v.1940 64 bit (AMD64)]
--------------------------------------------------------------------
Python executable is \\emplussrv1.epfl.ch\EMPLUS-PROJECTS\Moonchu-Stereo\Sentence-Processing\.venv\Scripts\python.exe
Environment Python files loaded from \\emplussrv1.epfl.ch\EMPLUS-PROJECTS\Moonchu-Stereo\Sentence-Processing\.venv
System Python files loaded from C:\Users\Admin\AppData\Local\Programs\Python\Python312
--------------------------------------------------------------------
Python Pillow modules loaded from \\emplussrv1.epfl.ch\EMPLUS-PROJECTS\Moonchu-Stereo\Sentence-Processing\.venv\Lib\site-packages\PIL
Binary Pillow modules loaded from \\emplussrv1.epfl.ch\EMPLUS-PROJECTS\Moonchu-Stereo\Sentence-Processing\.venv\Lib\site-packages\PIL
--------------------------------------------------------------------
--- PIL CORE support ok, compiled for 11.2.1
--- TKINTER support ok, loaded 8.6
--- FREETYPE2 support ok, loaded 2.13.3
--- LITTLECMS2 support ok, loaded 2.17
--- WEBP support ok, loaded 1.5.0
*** AVIF support not installed
--- JPEG support ok, compiled for libjpeg-turbo 3.1.0
--- OPENJPEG (JPEG2000) support ok, loaded 2.5.3
--- ZLIB (PNG/ZIP) support ok, loaded 1.3.1.zlib-ng, compiled for zlib-ng 2.2.4
--- LIBTIFF support ok, loaded 4.7.0
*** RAQM (Bidirectional Text) support not installed
*** LIBIMAGEQUANT (Quantization method) support not installed
*** XCB (X protocol) support not installed
--------------------------------------------------------------------
import textwrap
from PIL import Image, ImageDraw


sentence = "This is a test sentence to check the alignment of text in PIL. It should be able to handle different anchors like left, middle, right."
alignment = "justify"  # Options: "left", "center", "right", "justify"
sentence = "\n".join(textwrap.wrap(sentence, width=60))

image = Image.new('RGBA', [720, 720], color=(0, 0, 0, 255))
draw = ImageDraw.Draw(image)
draw.multiline_text((120, 150), sentence, anchor="lm", fill="white", spacing=10, font_size=20, align=alignment)
draw.multiline_text((720/2, 720/2), sentence, anchor="mm", fill="pink", spacing=10, font_size=20, align=alignment)
draw.multiline_text((720-120, 720-150), sentence, anchor="rm", fill="yellow", spacing=10, font_size=20, align=alignment)
image.save("test_multiline_text.png", "PNG")

Result:

Image

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions