Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import os | |
| import tempfile | |
| import numpy as np | |
| import cv2 | |
| import img2pdf | |
| import shutil | |
| import uuid | |
| from pathlib import Path | |
| from pdf2image import convert_from_path # pip install pdf2image opencv-python numpy img2pdf | |
| # Bounding box: (x1, y1, x2, y2) in fractions of image size | |
| default_bbox = (0.75, 0.9, 0.98, 0.98) | |
| def expand_bbox(bbox, expand_factor=0.3): | |
| x_min, y_min, x_max, y_max = bbox | |
| width = x_max - x_min | |
| height = y_max - y_min | |
| new_x_min = max(0, x_min - width * expand_factor) | |
| new_y_min = max(0, y_min - height * expand_factor) | |
| new_x_max = min(1, x_max + width * expand_factor) | |
| new_y_max = min(1, y_max + height * expand_factor) | |
| return (new_x_min, new_y_min, new_x_max, new_y_max) | |
| def inpaint_image(image_np, bbox, color=(255, 255, 255)): | |
| h, w, _ = image_np.shape | |
| x1 = int(bbox[0] * w) | |
| y1 = int(bbox[1] * h) | |
| x2 = int(bbox[2] * w) | |
| y2 = int(bbox[3] * h) | |
| inpainted_image = image_np.copy() | |
| cv2.rectangle(inpainted_image, (x1, y1), (x2, y2), color, -1) | |
| return inpainted_image | |
| def process_pdf(pdf_file): | |
| try: | |
| pdf_path = pdf_file.name if pdf_file else "wifi_basics_teaching_genspark.pdf" | |
| assert os.path.exists(pdf_path), f"File not found: {pdf_path}" | |
| page_inpaint_colors = { | |
| 0: (255, 255, 255), | |
| 1: (0, 0, 0) | |
| } | |
| with tempfile.TemporaryDirectory() as tmpdir: | |
| images = convert_from_path(pdf_path, dpi=300, output_folder=tmpdir, fmt="png") | |
| output_images = [] | |
| for i, img in enumerate(images): | |
| np_img = np.array(img)[:, :, ::-1] | |
| bbox = expand_bbox(default_bbox, expand_factor=0.3) | |
| color = page_inpaint_colors.get(i, (255, 255, 255)) | |
| inpainted = inpaint_image(np_img, bbox, color=color) | |
| img_path = os.path.join(tmpdir, f"page_{i}.png") | |
| cv2.imwrite(img_path, inpainted) | |
| output_images.append(img_path) | |
| temp_pdf_path = os.path.join(tmpdir, "inpainted_output.pdf") | |
| with open(temp_pdf_path, "wb") as f: | |
| f.write(img2pdf.convert([Path(p) for p in sorted(output_images)])) | |
| # Save to persistent path | |
| final_pdf_path = f"inpainted_output_{uuid.uuid4().hex[:8]}.pdf" | |
| shutil.copy(temp_pdf_path, final_pdf_path) | |
| return final_pdf_path | |
| except Exception as e: | |
| print(f"β Error during PDF processing: {e}") | |
| return None | |
| # Gradio UI | |
| with gr.Blocks() as demo: | |
| gr.Markdown("### π§½ PDF Logo Inpainting (Solid Fill, Expand + Color Config)") | |
| with gr.Row(): | |
| pdf_input = gr.File( | |
| label="Upload PDF (or leave empty to use test.pdf)", | |
| file_types=[".pdf"], | |
| interactive=True | |
| ) | |
| pdf_output = gr.File(label="Download Inpainted PDF") | |
| run_button = gr.Button("Process and Inpaint") | |
| run_button.click(fn=process_pdf, inputs=pdf_input, outputs=pdf_output) | |
| demo.launch() | |