Skip to content

Issue with Diacritics/Harakat positions and placement and tested on 6 fonts #95

Description

@bossxero

Hello,

I have been trying to produce arabic text using the python reshaper but was unable to get the diacritics to show well in any of the text generated. I have tested with different fonts but it has not worked properly so far. I would be grateful if I could get some help from the community to resolve this issue. Please find the test code i have used and the generated image. I am using PIL to place the text on the image. As we can see in the image below, the diacritics often overlaps the letters or other symbols. The Shift_Harakat_Position did not solve the issue.

List of fonts which I tested are Amiri, Arabic Typesetting, Arial,NotoSansArabic, Traditional Arabic and Zekr Quran
fonts.zip

textgeneration


# -*- coding: utf-8 -*-

from __future__ import unicode_literals

import os
import unittest
import sys
from arabic_reshaper import ArabicReshaper
from bidi.algorithm import get_display
from PIL import Image, ImageFont, ImageDraw, ImageEnhance

all_fonts = [i for i in os.listdir() if (i[i.find(".") + 1:]).lower() in ["ttf"]]

text_to_be_reshaped = u"هَذِهِ الأَفْكارِ المَغْلوطَةِ"

configuration = {
    'delete_harakat': False,
    'delete_tatweel': False,
    'support_ligatures': True,
    'support_zwj': True,
    'shift_harakat_position': False,
    'use_unshaped_instead_of_isolated': True
}

reshaper      = ArabicReshaper(configuration=configuration)
reshaped_text = reshaper.reshape(text_to_be_reshaped)       # Arabic Reshaper
reshaped_text = get_display(reshaped_text)                  # Bidi

img        = Image.new('RGBA', (1000,1000), "black")
draw_layer = ImageDraw.Draw(img)

text_h_sum   = 50
line_spacing = 16

for i, font in enumerate(all_fonts) :

    font = ImageFont.truetype(font, 50)

    space_taken_by_text = draw_layer.textbbox(xy = (0, 0), text = reshaped_text, font = font)

    text_w      = space_taken_by_text[0] + space_taken_by_text[2]
    text_h      = space_taken_by_text[1] + space_taken_by_text[3]

    if i != 0 :
        text_h_sum = text_h_sum + (text_h + (i * line_spacing))

    draw_layer.text(
        xy   = (50, text_h_sum),
        text = reshaped_text,
        fill = (255, 255, 255, 128),
        font = font
        )
img.show()

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions