|
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)) |
|
else: |
|
pages.add(int(part) - 1) |
|
return sorted(pages) |
|
|
|
def invert_colors(pix): |
|
img = np.frombuffer(pix.samples, dtype=np.uint8) |
|
img = 255 - img |
|
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) |