Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import fitz | |
| import numpy as np | |
| import tempfile | |
| import os | |
| def parse_page_selection(selection): | |
| pages = set() | |
| for part in selection.split(','): | |
| if '-' in part: | |
| start, end = map(int, part.split('-')) | |
| pages.update(range(start - 1, end)) # Convert to 0-based index | |
| else: | |
| pages.add(int(part) - 1) # Convert to 0-based index | |
| return sorted(pages) | |
| def invert_colors(pix): | |
| img = np.frombuffer(pix.samples, dtype=np.uint8) | |
| img = 255 - img # Invert colors | |
| return fitz.Pixmap(pix.colorspace, pix.width, pix.height, img.tobytes(), pix.alpha) | |
| def invert_pdf_pages(input_pdf, output_pdf, page_selection): | |
| pages_to_invert = parse_page_selection(page_selection) | |
| doc = fitz.open(input_pdf) | |
| for page_num in pages_to_invert: | |
| if 0 <= page_num < len(doc): | |
| page = doc[page_num] | |
| pix = page.get_pixmap() | |
| inverted_pix = invert_colors(pix) | |
| img_rect = page.rect | |
| page.clean_contents() | |
| page.insert_image(img_rect, stream=inverted_pix.tobytes()) | |
| doc.save(output_pdf) | |
| doc.close() | |
| def invert_pdf_document(input_file, page_selection, output_name): | |
| print(f"[LOG] Starting PDF inversion for {input_file} on pages: {page_selection}") | |
| if hasattr(input_file, "read"): | |
| with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") as tmp_in: | |
| tmp_in.write(input_file.read()) | |
| tmp_in_path = tmp_in.name | |
| cleanup = True | |
| print(f"[LOG] Created temporary input file: {tmp_in_path}") | |
| else: | |
| tmp_in_path = input_file | |
| cleanup = False | |
| with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") as tmp_out: | |
| tmp_out_path = tmp_out.name | |
| print(f"[LOG] Created temporary output file: {tmp_out_path}") | |
| invert_pdf_pages(tmp_in_path, tmp_out_path, page_selection) | |
| print(f"[LOG] Successfully inverted pages: {page_selection}") | |
| if cleanup: | |
| os.remove(tmp_in_path) | |
| final_output_path = os.path.join(os.path.dirname(tmp_out_path), output_name) | |
| os.rename(tmp_out_path, final_output_path) | |
| print(f"[LOG] Output saved as: {final_output_path}") | |
| return final_output_path | |
| iface = gr.Interface( | |
| fn=invert_pdf_document, | |
| inputs=[ | |
| gr.File(label="Input PDF"), | |
| gr.Textbox(label="Page Selection", value="1-12,14-20,22-32,56,66-78,82-97"), | |
| gr.Textbox(label="Output Name", value="inverted_output.pdf") | |
| ], | |
| outputs=gr.File(label="Output PDF"), | |
| title="PDF Color Inverter", | |
| description="Upload a PDF, specify the pages to invert, and a custom output name." | |
| ) | |
| if __name__ == "__main__": | |
| iface.launch(share=True) |