Spaces:
Sleeping
Sleeping
| 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() | |