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) |