Spaces:
Sleeping
Sleeping
File size: 4,124 Bytes
dab1b3c 0ef500d 3c90beb c9de9d6 9f18e13 3c90beb eb2e9b2 c9de9d6 3c90beb c9de9d6 9f18e13 a5ae0cd c9de9d6 21e4481 c9de9d6 9f18e13 59c254c a5ae0cd 9f18e13 c9de9d6 59c254c 3c90beb 9f18e13 59c254c 9f18e13 59c254c 9f18e13 59c254c 9f18e13 3c90beb c9de9d6 9f18e13 3c90beb 9f18e13 c9de9d6 3c90beb 59c254c 3c90beb c9de9d6 a5ae0cd c9de9d6 59c254c 9f18e13 c9de9d6 9f18e13 59c254c c9de9d6 a5ae0cd 59c254c | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | import gradio as gr
import os
import tempfile
from PyPDF2 import PdfReader, PdfWriter
from reportlab.pdfgen import canvas
from PIL import Image, ImageDraw
import shutil
class MultiDocMerger:
def __init__(self):
self.temp_dir = tempfile.mkdtemp()
self.documents = []
self.pages = []
def add_document(self, file):
file_path = os.path.join(self.temp_dir, file.name)
with open(file_path, 'wb') as f:
f.write(file.file.read()) # Use file.file.read() instead of file.read()
self.documents.append(file_path)
self._extract_pages(file_path)
return self._generate_preview()
self.documents.append(file_path)
self._extract_pages(file_path)
return self._generate_preview()
def _extract_pages(self, file_path):
reader = PdfReader(file_path)
for page_num, page in enumerate(reader.pages):
temp_pdf = os.path.join(self.temp_dir, f"page_{len(self.pages)}.pdf")
writer = PdfWriter()
writer.add_page(page)
with open(temp_pdf, 'wb') as f:
writer.write(f)
self.pages.append(temp_pdf)
def rearrange_documents(self, order):
self.documents = [self.documents[i] for i in order]
return self._generate_preview()
def rearrange_pages(self, order):
self.pages = [self.pages[i] for i in order]
return self._generate_preview()
def delete_page(self, index):
if 0 <= index < len(self.pages):
del self.pages[index]
return self._generate_preview()
def add_blank_page(self):
blank_path = os.path.join(self.temp_dir, f"blank_{len(self.pages)}.pdf")
can = canvas.Canvas(blank_path)
can.showPage()
can.save()
self.pages.append(blank_path)
return self._generate_preview()
def generate_index(self):
index_content = "Index Page\n\n"
for i, doc in enumerate(self.documents):
index_content += f"{i + 1}. {os.path.basename(doc)}\n"
index_pdf = os.path.join(self.temp_dir, "index.pdf")
can = canvas.Canvas(index_pdf)
can.drawString(100, 750, index_content)
can.save()
self.pages.insert(0, index_pdf)
def export_merged_pdf(self):
self.generate_index()
output = PdfWriter()
for page in self.pages:
reader = PdfReader(page)
output.add_page(reader.pages[0])
output_path = os.path.join(self.temp_dir, 'merged_output.pdf')
with open(output_path, 'wb') as f:
output.write(f)
return output_path
def _generate_preview(self):
return [os.path.basename(page) for page in self.pages]
def cleanup(self):
shutil.rmtree(self.temp_dir)
merger = MultiDocMerger()
with gr.Blocks() as demo:
gr.Markdown("# Multi-Document Merger and Organizer")
with gr.Column():
file_upload = gr.File(label="Upload Files", file_count="multiple")
preview_gallery = gr.Gallery(label="Document Preview and Reordering", interactive=True)
delete_index = gr.Number(label="Delete Page Index")
blank_button = gr.Button("Add Blank Page")
merge_button = gr.Button("Merge and Export PDF")
output_file = gr.File()
def upload_files(files):
paths = []
for file in files:
paths = merger.add_document(file)
return paths
def merge_and_export():
return merger.export_merged_pdf()
def delete_page(index):
return merger.delete_page(index)
def add_blank_page():
return merger.add_blank_page()
def reorder_pages(order):
return merger.rearrange_pages(order)
file_upload.upload(upload_files, inputs=file_upload, outputs=preview_gallery)
delete_index.submit(delete_page, inputs=delete_index, outputs=preview_gallery)
blank_button.click(add_blank_page, outputs=preview_gallery)
preview_gallery.change(reorder_pages, inputs=preview_gallery, outputs=preview_gallery)
merge_button.click(merge_and_export, outputs=output_file)
demo.launch()
|