from PIL import Image import math import os import subprocess from .tele import SendToTele class GeneratePhoto: def __init__(self,paper_size,gap,images,img_max_width,img_max_height,raw_export): self.paper_size = paper_size self.gap = gap self.images = images self.img_max_width = img_max_width self.img_max_height =img_max_height self.raw_export = raw_export def deleteimage(self,file_path): # Check if the file exists before deleting if os.path.exists(file_path): # Delete the file os.remove(file_path) print("File deleted successfully.") else: print("File does not exist.") def export(self): paper_size = self.paper_size gap = self.gap images = self.images img_max_width = self.img_max_width img_max_height = self.img_max_height #Calculate the images that how much fit inside the paper limited_img_xaxis = int(paper_size[0] / (img_max_width + gap)) limited_img_yaxis = int(paper_size[1] / (img_max_height + gap)) limited_paper_images = limited_img_xaxis * limited_img_yaxis img_qty = 0; for (a,b) in images: img_qty += int(b) # print(math.ceil(img_qty/limited_paper_images)) # print('limited image',limited_paper_images) # print(img_qty) paper_qty = math.ceil(img_qty/limited_paper_images) sets = [] # Initialize an empty list of sets current_set = [] # Initialize an empty list to hold the images for the current set # Iterate over the images for image in images: name, count = image # Add the current image to the current set count times for i in range(int(count)): # If adding the current image would exceed the limit, add the current set to the list of sets and start a new set if len(current_set) == limited_paper_images: sets.append(current_set) current_set = [] current_set.append(name) # Add the last set to the list of sets if current_set: sets.append(current_set) # Count the duplicate image names in each set and print the sets count_set = [] for i, set in enumerate(sets): name_counts = {} for name in set: if name in name_counts: name_counts[name] += 1 else: name_counts[name] = 1 # print(f"Name counts: {name_counts}") count_set.append(name_counts) print(count_set) pname = 0 for p in count_set: a4_image = Image.new('RGB', paper_size, color='white') values_list = list(p.values()) key_list = list(p.keys()) imgs_sum = sum(values_list) index = 0 print('Img : ', self.raw_export +os.path.basename(key_list[index]) ) img = Image.open(self.raw_export + os.path.basename(key_list[index])) self.deleteimage(self.raw_export + os.path.basename(key_list[index])) #Change pictures to Thumbnail img = img.resize((int(img_max_width),int(img_max_height)),resample=Image.BICUBIC) #Resize Image print(img.size,'Image size') img.thumbnail((img_max_width,img_max_height)) for a in range(imgs_sum): x_pos = a % limited_img_xaxis y_pos = a // limited_img_xaxis print(f"({x_pos}, {y_pos})") position = (int(x_pos*img_max_width)+(gap*x_pos)+gap), int((y_pos*img_max_height)+(gap*y_pos)+gap) print(position) a4_image.paste(img,position) if a == sum(values_list[:index+1])-1: index += 1 try: img = Image.open(self.raw_export+os.path.basename(key_list[index])) img = img.resize((int(img_max_width),int(img_max_height)),resample=Image.BICUBIC) #Resize Image print(img.size,'Resize Image') img.thumbnail((img_max_width,img_max_height)) self.deleteimage(self.raw_export + os.path.basename(key_list[index])) except IndexError: print(IndexError) pname += 1 pathname = 'paper/paper'+str(pname)+'.png' a4_image.save(pathname) SendToTele(document_path=pathname) self.deleteimage(pathname)