ilyakanyshev

Text writer on paper

Nov 26th, 2020 (edited)
690
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. from PIL import Image, ImageDraw,ImageFont
  2.  
  3.  
  4. class TextWriter:
  5.     font = None
  6.     images = None
  7.     image_url = r"fon.jpg"
  8.     font_url = r'Abram.ttf'
  9.     flag_rotate = False
  10.     line = 0
  11.     limit_line_count = 19
  12.     limit_pixels_x = 610
  13.     draw = None
  14.    
  15.     # Инициализация класса
  16.     def __init__(self, rotation=False):
  17.         self.font = ImageFont.truetype(self.font_url, size=40)
  18.         self.images = []
  19.         self.flag_rotate = rotation
  20.         self.new_page(rotation=180*int(self.flag_rotate))
  21.        
  22.     # Метод создания новой страницы
  23.     def new_page(self, rotation: int = 0):
  24.         tmp = Image.open(self.image_url)
  25.         tmp = tmp.rotate(rotation)
  26.         self.draw = ImageDraw.Draw(tmp)
  27.         self.images.append(tmp)
  28.         return True
  29.    
  30.     # Метод добавления текста
  31.     def add_text(self, text: str = '', fill: str = '#1a03ad'):
  32.         # Разбиваем текст на параграфы
  33.         text = text.split('\n')
  34.        
  35.         # Каждый параграф разбиваем на слова и разбиваем длину параграфа по строчкам
  36.         # Каждая строчка может достигать установленного предела по пикселям(self.limit_pixels_x)
  37.         # И так каждый параграф
  38.         # В результате получаем массив result_text, в котором каждый каждый элемент - один параграф,
  39.         # а каждый элемент параграфа - одна строчка из этого параграфа
  40.         result_text = []
  41.         for paragraph in text:
  42.             splited_paragraph = []
  43.             line = ''
  44.             for word in paragraph.split(' '):
  45.                 if self.font.getsize(f"{line} {word}")[0] <= self.limit_pixels_x:
  46.                     line += ' ' + word
  47.                 else:
  48.                     splited_paragraph.append(line)
  49.                     line = word
  50.             if len(line) > 0:
  51.                 splited_paragraph.append(line)
  52.             if len(splited_paragraph) > 0:
  53.                 result_text.append(splited_paragraph)
  54.            
  55.         # Осталось только добавить этот текст на листы
  56.         for paragraph in result_text:
  57.             for number, line in enumerate(paragraph):
  58.                 if self.line >= self.limit_line_count:
  59.                     self.new_page(rotation=180*int(not self.flag_rotate))
  60.                     self.flag_rotate = not self.flag_rotate
  61.                     self.line = 0
  62.                 self.draw.text(
  63.                     (14 + 100*int(self.flag_rotate), 8 + 46*self.line),
  64.                     line,
  65.                     font=self.font,
  66.                     fill=fill
  67.                 )
  68.                 self.line += 1
  69.         return True
  70.                
  71.    
  72.     # Метод сохранения. Принимает в себя параметр file_name - имя файла
  73.     def save(self, file_name: str = 'image.jpg'):
  74.         file_name = file_name.split('.')
  75.         file_name = [
  76.             ''.join(
  77.                 (_+".") for _ in file_name[:-1]
  78.             )[:-1],
  79.             file_name[-1]
  80.         ]
  81.         result = []
  82.         for number, image in enumerate(self.images):
  83.             if number == 0:
  84.                 tmp = f"{file_name[0]}.{file_name[1]}"
  85.             else:
  86.                 tmp = f'{file_name[0]}_{number}.{file_name[1]}'
  87.             result.append(tmp)
  88.             image.save(tmp)
  89.         return result
  90.  
  91.  
  92. writer = TextWriter()
  93. writer.add_text(
  94.     "Hello, my dear friend!\n"
  95.     "My name is Ilya. I am from Russia, Moscow. I like play basketball, write something program. What are you like do?\n"
  96. )
  97. writer.add_text(
  98.     "Oh, I am sorry, I forgot to say you that you are 'dolboyeb ebaniy'"
  99. )
  100. writer.save('file1.jpg')
RAW Paste Data