import os from PIL import Image, ImageOps, ImageChops import io import fitz # PyMuPDF from docx import Document from rembg import remove import gradio as gr def convert_image_to_jpeg(input_path): image = Image.open(input_path) image = image.convert('RGB') output_path = os.path.splitext(input_path)[0] + ".jpg" image.save(output_path, 'JPEG') return output_path def trim_whitespace(image): gray_image = ImageOps.grayscale(image) inverted_image = ImageChops.invert(gray_image) bbox = inverted_image.getbbox() trimmed_image = image.crop(bbox) return trimmed_image def convert_pdf_to_images(pdf_path, zoom=2): pdf_document = fitz.open(pdf_path) name_with_extension = os.path.basename(pdf_path) name = os.path.splitext(name_with_extension)[0] output_paths = [] for page_num in range(len(pdf_document)): page = pdf_document.load_page(page_num) matrix = fitz.Matrix(zoom, zoom) pix = page.get_pixmap(matrix=matrix) image = Image.frombytes("RGB", [pix.width, pix.height], pix.samples) trimmed_image = trim_whitespace(image) output_path = f"{name}_page_{page_num + 1}.jpg" trimmed_image.save(output_path, 'JPEG') output_paths.append(output_path) return output_paths def convert_docx_to_jpeg(docx_path): document = Document(docx_path) output_paths = [] for i, image_shape in enumerate(document.inline_shapes, start=1): image_stream = image_shape.image.blob image = Image.open(io.BytesIO(image_stream)) output_path = f"{os.path.splitext(os.path.basename(docx_path))[0]}_page_{i}.jpg" image.save(output_path, 'JPEG') output_paths.append(output_path) return output_paths def process_file(input_file): file_extension = os.path.splitext(input_file.name)[1].lower() if file_extension in ['.png', '.jpeg', '.jpg', '.bmp', '.gif']: output_path = convert_image_to_jpeg(input_file.name) return remove_background(output_path) elif file_extension == '.pdf': image_paths = convert_pdf_to_images(input_file.name) return [remove_background(path) for path in image_paths] elif file_extension in ['.docx', '.doc']: image_paths = convert_docx_to_jpeg(input_file.name) return [remove_background(path) for path in image_paths] else: return "File format not supported." def remove_background(image_path): input_image = Image.open(image_path) output_image = remove(input_image) output_path = image_path.replace('.jpg', '_no_bg.png') output_image.save(output_path, 'PNG') return output_path def gradio_interface(input_file): return process_file(input_file) iface = gr.Interface( fn=gradio_interface, inputs=gr.inputs.File(label="Upload Word, PDF, or Image"), outputs=gr.outputs.Image(type="file", label="Processed Image(s)"), title="Document to Image Converter with Background Removal" ) if __name__ == "__main__": iface.launch()