Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I print Hindi sentences(unicode) on image in Python?

I have a file named "hindi.txt". It has contents as follows. I'm using Python3.5.

कामकाजी महिलाओं के लिए देश में दिल्ली असुरक्षित, सिक्किम सबसे बेहतर: रिपोर्ट
9 साल से अटकी राफेल डील मंजूर, 59000 Cr में भारत खरीदेगा 36 फाइटर प्लेन
WhatsApp को टक्कर देने आर्टिफिशियल इंटेलिजेंस के साथ आया गूगल का Allo मैसेंजर
उड़ी हमले पर 10 खुलासे: आर्मी बेस में 150 मीटर अंदर तक घुस आए थे जैश के आतंकी
उड़ी हमलाः भारत का कड़ा रुख देखकर PAK ने LoC से सटे शहरों में कैंसल 
PAK को आतंकी देश करार देने के लिए अमेरिकी संसद में पेश हुआ बिल

I'm opening this file in and then reading line by line. Then printing this text in image. My code snippet is shown as below.

from PIL import Image, ImageDraw, ImageFont, ImageOps
import os

with open("hindi.txt", "r") as filestream:
    cnum = 1
    astr = filestream.read().splitlines()

    font5 = ImageFont.truetype('/home/SunehraBharat/filestotweet/fonts/ARIALUNI.TTF', 26)

    MAX_W, MAX_H = 1500, 1500


    foreground_image = Image.new('RGB', (MAX_W, MAX_H), (0, 0, 0, 0))
    draw = ImageDraw.Draw(foreground_image)
    image_name = str(cnum) + "_" + "image.png"

    current_h, pad = 40, 14
    c = 1
    for txtline in astr:
        line = str(c) + ").  " + txtline
        #printing on console to check if lines are coming correctly.
        print(line)
        w, h = draw.textsize(line, font=font5)
        draw.text((10, current_h), line, font=font5, fill=(255,255,255,1))
        current_h += h + pad
        c = c + 1


    #saving image
    foreground_image.save(image_name)
    cnum = cnum + 1

Output on console due to print(line) statement- Correct

कामकाजी महिलाओं के लिए देश में दिल्ली असुरक्षित, सिक्किम सबसे बेहतर: रिपोर्ट
9 साल से अटकी राफेल डील मंजूर, 59000 Cr में भारत खरीदेगा 36 फाइटर प्लेन
WhatsApp को टक्कर देने आर्टिफिशियल इंटेलिजेंस के साथ आया गूगल का Allo मैसेंजर
उड़ी हमले पर 10 खुलासे: आर्मी बेस में 150 मीटर अंदर तक घुस आए थे जैश के आतंकी
उड़ी हमलाः भारत का कड़ा रुख देखकर PAK ने LoC से सटे शहरों में कैंसल 
PAK को आतंकी देश करार देने के लिए अमेरिकी संसद में पेश हुआ बिल

Now my Image Output:

enter image description here As you can compare now, output is not with respect to input. Few words are incorrect "सिक्किम" , "महिलाओं".

I have tried different fonts. But getting the same result everytime. Can you please help me. And let me know where I'm missing.

like image 507
Pooja Avatar asked Sep 22 '16 05:09

Pooja


People also ask

How to print Unicode emojis in Python?

For example – “U+1F600” will become “U0001F600” and prefix the unicode with “\” and print it. Emojis can also be implemented by using the emoji module provided in Python. To install it run the following in the terminal. emojize () function requires the CLDR short name to be passed in it as the parameter.

How to print hexadecimal characters in Python?

In Python, Unicode characters are represented as a string type. These characters are printed using the print command. Before giving the hexadecimal value as an input value, the escape sequence \u is used before every hexadecimal value. Note that the hexadecimal value stored in the variable is taken as a string.

How do you write Unicode in Python code?

Unicode Literals in Python Source Code ¶. In Python source code, specific Unicode code points can be written using the u escape sequence, which is followed by four hex digits giving the code point. The U escape sequence is similar, but expects eight hex digits, not four: >>>.

What is an example of a Unicode string?

Some encodings have multiple names; for example, 'latin-1', 'iso_8859_1' and '8859’ are all synonyms for the same encoding. One-character Unicode strings can also be created with the chr() built-in function, which takes integers and returns a Unicode string of length 1 that contains the corresponding code point.


3 Answers

There seems an open bug for rendering the hindi (Devanagari font) text.

https://github.com/python-pillow/Pillow/issues/3191

You may try with some other library like: pyvips (I do not find the API very intuitive, but it may work for you)

import pyvips


# To install 'pyvips' refers to https://pypi.org/project/pyvips/
#  1. Intall libvips shared library from https://jcupitt.github.io/libvips/install.html
#  2. Set the PATH variable.
#  3. run pip install pyvips

def generate_tweet_image():
    cnum = 1
    output_file = "tweet_file.png"
    text = u''
    with open("hindi.txt", "r", encoding='UTF-8') as filestream:
        for l in filestream.readlines():
            text = text + f'{cnum}) {l}'
            cnum += 1

    MAX_W, MAX_H = 1500, 1500

    # See for API https://jcupitt.github.io/pyvips/vimage.html#pyvips.Image.text

    # font file: ARIALUNI.TTF
    image = pyvips.Image.text(text, width=MAX_W, height=MAX_H, font='Arial Unicode MS', dpi=96)
    image.write_to_file(output_file)
    print(f'File Written at : {output_file}')


generate_tweet_image()

Output:

enter image description here

Hope this helps.

like image 196
skadya Avatar answered Oct 08 '22 00:10

skadya


Pillow 7.0.0 provides support for rendering complex font with raqm library

To check for support:

>>> from PIL import features
>>> print(features.check("raqm"))
True

If it returns False check if library is installed:

 /sbin/ldconfig -p | grep raqm
    libraqm.so.0 (libc6,x86-64) => /usr/lib/libraqm.so.0
    libraqm.so (libc6,x86-64) => /usr/lib/libraqm.so

To Install raqm in debian based distros: sudo apt-get install libraqm-dev

To use raqm as layout engine add layout_engine option while initializing font:

font = ImageFont.truetype("foo.ttf", size=90, layout_engine=ImageFont.LAYOUT_RAQM)

The above code is tested for: Hindi, Marathi, Gujrati and Telugu fonts.

like image 41
Ash-Ishh.. Avatar answered Oct 07 '22 22:10

Ash-Ishh..


Installing Raqm, is the ultimate clean soon,check following steps

One of the following methods can be used for building Raqm:

  1. Raqm depends on the following libraries:

FreeType HarfBuzz FriBiDi

To install dependencies on Fedora:

sudo dnf install freetype-devel harfbuzz-devel fribidi-devel gtk-doc

To install dependencies on Ubuntu:

sudo apt-get install libfreetype6-dev libharfbuzz-dev libfribidi-dev \ gtk-doc-tools

On Mac OS X you can use Homebrew:

`export XML_CATALOG_FILES="/usr/local/etc/xml/catalog" # for the docs`

Once you have the source code and the dependencies, you can proceed to build. To do that, run the customary sequence of commands in the source code directory:

To do that, run the customary sequence of commands in the source code directory (configure file is not found in the package, The key was to run autogen.sh before):

$ ./autogen.sh
$ ./configure
$ make
$ make install

To run the tests:

$ make check

sudo ldconfig This step was needed!

Run the following test script: (Make sure the fonts are installed sudo apt install fonts-indic)


from PIL import Image, ImageFont, ImageDraw

im = Image.new("RGB",(160, 160))
draw = ImageDraw.Draw(im)

font_telugu = ImageFont.truetype("/usr/share/fonts/truetype/fonts-telu-extra/Pothana2000.ttf",50)
text_telugu = "నిత్య"

font_hindi = ImageFont.truetype("/usr/share/fonts/truetype/Gargi/Gargi.ttf",50)
text_hindi = "नित्य"

draw.text((10, 10), text_telugu, font=font_telugu)
draw.text((10, 90), text_hindi, font=font_hindi)
im.show()

  1. install tar file from releases If you downloaded the release tarball, you shouldn’t run ./autogen.sh at all, just run steps ./configure directly.

  2. for ubuntu >=18.04, you can install package directly- The requirements for libraqm are:

libc6   >= 2.14
libfreetype6    >= 2.4.2
libfribidi0 >= 1.0.0
libharfbuzz0b   >= 2.1.1

Install the raqm package Update the package index:

    sudo apt-get update

Install libraqm0 deb package:

sudo apt-get install libraqm0

You can test your installation by:

from PIL import features
print(features.check("raqm"))
# you should get True now
like image 2
Vidushi Agarwal Avatar answered Oct 07 '22 22:10

Vidushi Agarwal