Spaces:
Sleeping
Sleeping
| import fitz # PyMuPDF | |
| import gradio as gr | |
| from PIL import Image, ImageEnhance, ImageFilter | |
| import io | |
| # Step 1: Convert PDF to high-quality image | |
| def pdf_to_image(pdf_file, dpi=300): # Increased DPI for better quality | |
| try: | |
| pdf_document = fitz.open(pdf_file.name) | |
| page = pdf_document.load_page(0) # Load the first page | |
| # Render the page at high DPI | |
| zoom = dpi / 72 # Scale factor based on DPI | |
| mat = fitz.Matrix(zoom, zoom) | |
| pix = page.get_pixmap(matrix=mat, alpha=False) | |
| # Convert pixmap to image | |
| image_bytes = io.BytesIO(pix.tobytes("png")) | |
| img = Image.open(image_bytes) | |
| return img | |
| except Exception as e: | |
| print(f"Error during PDF conversion: {str(e)}") | |
| return None | |
| # Helper: Convert inches to pixels | |
| def inches_to_pixels(inches, dpi=300): | |
| return int(inches * dpi) | |
| # Step 2: Adjust image dimensions, brightness, thickness, and sharpening | |
| def adjust_image(pdf_file, height_in, width_in, brightness, thickness_scale, sharpening_value): | |
| img = pdf_to_image(pdf_file) | |
| if img is None: | |
| return "Unable to convert PDF to image." | |
| try: | |
| # Crop the image to focus on the area of interest (inside the thick black borders) | |
| # You may need to adjust these coordinates based on your specific diagram layout | |
| left, top, right, bottom = 50, 50, img.width - 50, img.height - 50 # Example crop values | |
| img_cropped = img.crop((left, top, right, bottom)) | |
| # Convert dimensions from inches to pixels | |
| height_px = inches_to_pixels(height_in) | |
| width_px = inches_to_pixels(width_in) | |
| # Resize with high-quality resampling | |
| img_resized = img_cropped.resize((width_px, height_px), Image.LANCZOS) | |
| # Apply anti-aliasing filter for smooth edges | |
| img_smoothed = img_resized.filter(ImageFilter.SMOOTH) | |
| # Adjust brightness | |
| enhancer = ImageEnhance.Brightness(img_smoothed) | |
| img_bright = enhancer.enhance(brightness) | |
| # Apply sharpening | |
| sharpener = img_bright.filter(ImageFilter.SHARPEN) | |
| # Save the final image as a PDF without losing quality | |
| output_pdf_path = "processed_output.pdf" | |
| sharpener.save(output_pdf_path, "PDF", quality=100) | |
| return output_pdf_path # Return the path of the saved PDF | |
| except Exception as e: | |
| print(f"Error during image adjustment: {str(e)}") | |
| return "Error adjusting the image." | |
| # Gradio Interface | |
| iface = gr.Interface( | |
| fn=adjust_image, | |
| inputs=[ | |
| gr.File(label="Upload PDF"), | |
| gr.Number(label="Height (inches)", value=5.0), | |
| gr.Number(label="Width (inches)", value=4.0), | |
| gr.Slider(minimum=1, maximum=5, step=0.1, value=1.0, label="Brightness"), | |
| gr.Slider(minimum=1, maximum=2, step=0.1, value=1.0, label="Thickness Scale"), | |
| gr.Slider(minimum=1, maximum=5, step=0.1, value=1.0, label="Sharpening"), | |
| ], | |
| outputs="file", # Change output type to 'file' to return the processed PDF | |
| title="Plate Design Creation - Convert & Adjust PDF Page", | |
| description="Upload a PDF containing a technical diagram or nameplate. Adjust the dimensions, brightness, thickness, and sharpening for optimal clarity." | |
| ) | |
| # Launch the interface | |
| iface.launch() | |