Update app.py
Browse files
app.py
CHANGED
|
@@ -2,39 +2,35 @@ import gradio as gr
|
|
| 2 |
import PyPDF2
|
| 3 |
import os
|
| 4 |
import io
|
| 5 |
-
import fitz # PyMuPDF
|
| 6 |
from reportlab.pdfgen import canvas
|
| 7 |
from reportlab.lib.pagesizes import A4
|
| 8 |
from reportlab.lib import colors
|
| 9 |
|
| 10 |
-
# --- हेल्पर फ़ंक्शन 1: सभी PDF से प
|
| 11 |
-
def
|
| 12 |
if not main_pdf:
|
| 13 |
-
return None,
|
| 14 |
|
| 15 |
all_files = [main_pdf] + (additional_pdfs if additional_pdfs else [])
|
| 16 |
-
|
|
|
|
| 17 |
|
| 18 |
try:
|
| 19 |
-
os.makedirs("previews", exist_ok=True)
|
| 20 |
for file_index, pdf_file in enumerate(all_files):
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
pix.save(img_path)
|
| 27 |
-
previews.append(img_path)
|
| 28 |
-
# लेबल में फ़ाइल नंबर और पेज नंबर दोनों शामिल करें
|
| 29 |
page_labels.append(f"File{file_index+1}-Page{page_index+1}")
|
| 30 |
-
doc.close()
|
| 31 |
|
| 32 |
status = f"{total_page_count} पेज {len(all_files)} फाइलों से पाए गए. जिन पेजों को रखना है, उन्हें चुनें."
|
| 33 |
-
|
|
|
|
| 34 |
except Exception as e:
|
| 35 |
-
return None,
|
| 36 |
|
| 37 |
-
# --- मुख्य PDF प्रोसेसिंग फ़ंक्शन ---
|
| 38 |
def process_pdf(main_pdf, additional_pdfs, selected_pages, split_pdf, style, custom_left, custom_right, x_pos, y_pos):
|
| 39 |
if not main_pdf:
|
| 40 |
raise gr.Error("मुख्य PDF फ़ाइल गायब है!")
|
|
@@ -45,17 +41,13 @@ def process_pdf(main_pdf, additional_pdfs, selected_pages, split_pdf, style, cus
|
|
| 45 |
all_files = [main_pdf] + (additional_pdfs if additional_pdfs else [])
|
| 46 |
readers = [PyPDF2.PdfReader(f.name) for f in all_files]
|
| 47 |
|
| 48 |
-
# चरण 1: चुने हुए पेजों को फ़िल्टर और मर्ज करें
|
| 49 |
filtered_writer = PyPDF2.PdfWriter()
|
| 50 |
for label in selected_pages:
|
| 51 |
-
# लेबल को पार्स करें: 'FileX-PageY' -> file_idx=X-1, page_idx=Y-1
|
| 52 |
parts = label.replace("File", "").split("-Page")
|
| 53 |
file_idx, page_idx = int(parts[0]) - 1, int(parts[1]) - 1
|
| 54 |
-
|
| 55 |
if 0 <= file_idx < len(readers) and 0 <= page_idx < len(readers[file_idx].pages):
|
| 56 |
filtered_writer.add_page(readers[file_idx].pages[page_idx])
|
| 57 |
|
| 58 |
-
# चरण 2: इस नई, फ़िल्टर की गई PDF पर पुनः-नंबरिंग करें
|
| 59 |
final_writer = PyPDF2.PdfWriter()
|
| 60 |
filtered_pdf_stream = io.BytesIO()
|
| 61 |
filtered_writer.write(filtered_pdf_stream)
|
|
@@ -86,7 +78,6 @@ def process_pdf(main_pdf, additional_pdfs, selected_pages, split_pdf, style, cus
|
|
| 86 |
with open(final_numbered_path, "wb") as f:
|
| 87 |
final_writer.write(f)
|
| 88 |
|
| 89 |
-
# चरण 3: यदि चुना गया है तो इस अंतिम PDF को विभाजित करें
|
| 90 |
if split_pdf:
|
| 91 |
reader = PyPDF2.PdfReader(final_numbered_path)
|
| 92 |
odd_writer, even_writer = PyPDF2.PdfWriter(), PyPDF2.PdfWriter()
|
|
@@ -107,20 +98,20 @@ def process_pdf(main_pdf, additional_pdfs, selected_pages, split_pdf, style, cus
|
|
| 107 |
except Exception as e:
|
| 108 |
raise gr.Error(f"एक गंभीर त्रुटि हुई: {e}")
|
| 109 |
|
| 110 |
-
# --- Gradio इंटरफ़ेस ---
|
| 111 |
with gr.Blocks(theme=gr.themes.Default(primary_hue="blue")) as demo:
|
| 112 |
-
gr.Markdown("# 🚀 PDF वर्कफ़्लो स्टेशन
|
| 113 |
|
| 114 |
# चरण 1: अपलोड
|
| 115 |
gr.Markdown("### 1. अपनी PDF फाइलें अपलोड करें")
|
| 116 |
main_pdf_input = gr.File(label="मुख्य PDF", file_types=[".pdf"])
|
| 117 |
additional_pdfs_input = gr.File(label="(वैकल्पिक) जोड़ने के लिए और PDF", file_count="multiple", file_types=[".pdf"])
|
| 118 |
-
|
| 119 |
|
| 120 |
-
# चरण 2:
|
| 121 |
-
with gr.Column(visible=False) as
|
| 122 |
gr.Markdown("### 2. अंतिम PDF में रखने के लिए पेज चुनें")
|
| 123 |
-
|
| 124 |
page_selector = gr.CheckboxGroup(label="पेज चुनें")
|
| 125 |
|
| 126 |
# चरण 3: सेटिंग्स और प्रोसेसिंग
|
|
@@ -140,16 +131,16 @@ with gr.Blocks(theme=gr.themes.Default(primary_hue="blue")) as demo:
|
|
| 140 |
|
| 141 |
# चरण 4: आउटपुट
|
| 142 |
with gr.Column():
|
| 143 |
-
pdf_output_final = gr.File(label="अंतिम PDF डाउनलोड करें
|
| 144 |
with gr.Row():
|
| 145 |
pdf_output_odd = gr.File(label="विषम पेज (Odd) डाउनलोड करें")
|
| 146 |
pdf_output_even = gr.File(label="सम पेज (Even) डाउनलोड करें")
|
| 147 |
|
| 148 |
# --- UI Logic ---
|
| 149 |
-
|
| 150 |
-
fn=
|
| 151 |
inputs=[main_pdf_input, additional_pdfs_input],
|
| 152 |
-
outputs=[
|
| 153 |
)
|
| 154 |
|
| 155 |
def toggle_custom_style(style): return gr.update(visible=(style == "Custom..."))
|
|
|
|
| 2 |
import PyPDF2
|
| 3 |
import os
|
| 4 |
import io
|
|
|
|
| 5 |
from reportlab.pdfgen import canvas
|
| 6 |
from reportlab.lib.pagesizes import A4
|
| 7 |
from reportlab.lib import colors
|
| 8 |
|
| 9 |
+
# --- हेल्पर फ़ंक्शन 1: सभी PDF से पेजों की सूची बनाने के लिए (बिना इमेज के) ---
|
| 10 |
+
def list_all_pages(main_pdf, additional_pdfs):
|
| 11 |
if not main_pdf:
|
| 12 |
+
return None, gr.update(visible=False), "कृपया पहले मुख्य PDF अपलोड करें."
|
| 13 |
|
| 14 |
all_files = [main_pdf] + (additional_pdfs if additional_pdfs else [])
|
| 15 |
+
page_labels = []
|
| 16 |
+
total_page_count = 0
|
| 17 |
|
| 18 |
try:
|
|
|
|
| 19 |
for file_index, pdf_file in enumerate(all_files):
|
| 20 |
+
# PyPDF2 का उपयोग करके पेजों की संख्या प्राप्त करें
|
| 21 |
+
reader = PyPDF2.PdfReader(pdf_file.name)
|
| 22 |
+
num_pages = len(reader.pages)
|
| 23 |
+
total_page_count += num_pages
|
| 24 |
+
for page_index in range(num_pages):
|
|
|
|
|
|
|
|
|
|
| 25 |
page_labels.append(f"File{file_index+1}-Page{page_index+1}")
|
|
|
|
| 26 |
|
| 27 |
status = f"{total_page_count} पेज {len(all_files)} फाइलों से पाए गए. जिन पेजों को रखना है, उन्हें चुनें."
|
| 28 |
+
# केवल चेकबॉक्स ग्रुप और सेक्शन को अपडेट करें
|
| 29 |
+
return gr.update(choices=page_labels, value=page_labels), gr.update(visible=True), status
|
| 30 |
except Exception as e:
|
| 31 |
+
return None, gr.update(visible=False), f"फ़ाइल पढ़ने में त्रुटि: {e}. क्या यह एक वैध PDF है?"
|
| 32 |
|
| 33 |
+
# --- मुख्य PDF प्रोसेसिंग फ़ंक्शन (कोई बदलाव नहीं) ---
|
| 34 |
def process_pdf(main_pdf, additional_pdfs, selected_pages, split_pdf, style, custom_left, custom_right, x_pos, y_pos):
|
| 35 |
if not main_pdf:
|
| 36 |
raise gr.Error("मुख्य PDF फ़ाइल गायब है!")
|
|
|
|
| 41 |
all_files = [main_pdf] + (additional_pdfs if additional_pdfs else [])
|
| 42 |
readers = [PyPDF2.PdfReader(f.name) for f in all_files]
|
| 43 |
|
|
|
|
| 44 |
filtered_writer = PyPDF2.PdfWriter()
|
| 45 |
for label in selected_pages:
|
|
|
|
| 46 |
parts = label.replace("File", "").split("-Page")
|
| 47 |
file_idx, page_idx = int(parts[0]) - 1, int(parts[1]) - 1
|
|
|
|
| 48 |
if 0 <= file_idx < len(readers) and 0 <= page_idx < len(readers[file_idx].pages):
|
| 49 |
filtered_writer.add_page(readers[file_idx].pages[page_idx])
|
| 50 |
|
|
|
|
| 51 |
final_writer = PyPDF2.PdfWriter()
|
| 52 |
filtered_pdf_stream = io.BytesIO()
|
| 53 |
filtered_writer.write(filtered_pdf_stream)
|
|
|
|
| 78 |
with open(final_numbered_path, "wb") as f:
|
| 79 |
final_writer.write(f)
|
| 80 |
|
|
|
|
| 81 |
if split_pdf:
|
| 82 |
reader = PyPDF2.PdfReader(final_numbered_path)
|
| 83 |
odd_writer, even_writer = PyPDF2.PdfWriter(), PyPDF2.PdfWriter()
|
|
|
|
| 98 |
except Exception as e:
|
| 99 |
raise gr.Error(f"एक गंभीर त्रुटि हुई: {e}")
|
| 100 |
|
| 101 |
+
# --- Gradio इंटरफ़ेस (UI में बदलाव) ---
|
| 102 |
with gr.Blocks(theme=gr.themes.Default(primary_hue="blue")) as demo:
|
| 103 |
+
gr.Markdown("# 🚀 PDF वर्कफ़्लो स्टेशन v5.0 (लाइट) 🚀\nतेज, बिना प्रीव्यू वाला संस्करण!")
|
| 104 |
|
| 105 |
# चरण 1: अपलोड
|
| 106 |
gr.Markdown("### 1. अपनी PDF फाइलें अपलोड करें")
|
| 107 |
main_pdf_input = gr.File(label="मुख्य PDF", file_types=[".pdf"])
|
| 108 |
additional_pdfs_input = gr.File(label="(वैकल्पिक) जोड़ने के लिए और PDF", file_count="multiple", file_types=[".pdf"])
|
| 109 |
+
list_pages_button = gr.Button("📂 सभी पेजों की सूची जेनरेट करें")
|
| 110 |
|
| 111 |
+
# चरण 2: चयन (बिना इमेज के)
|
| 112 |
+
with gr.Column(visible=False) as selection_section:
|
| 113 |
gr.Markdown("### 2. अंतिम PDF में रखने के लिए पेज चुनें")
|
| 114 |
+
gr.Markdown("<p style='color:red;'>ध्यान दें: जिन पेजों को आप अनचेक करेंगे, वे अंतिम फ़ाइल से हटा दिए जाएंगे.</p>")
|
| 115 |
page_selector = gr.CheckboxGroup(label="पेज चुनें")
|
| 116 |
|
| 117 |
# चरण 3: सेटिंग्स और प्रोसेसिंग
|
|
|
|
| 131 |
|
| 132 |
# चरण 4: आउटपुट
|
| 133 |
with gr.Column():
|
| 134 |
+
pdf_output_final = gr.File(label="अंतिम PDF डाउनलोड करें")
|
| 135 |
with gr.Row():
|
| 136 |
pdf_output_odd = gr.File(label="विषम पेज (Odd) डाउनलोड करें")
|
| 137 |
pdf_output_even = gr.File(label="सम पेज (Even) डाउनलोड करें")
|
| 138 |
|
| 139 |
# --- UI Logic ---
|
| 140 |
+
list_pages_button.click(
|
| 141 |
+
fn=list_all_pages,
|
| 142 |
inputs=[main_pdf_input, additional_pdfs_input],
|
| 143 |
+
outputs=[page_selector, selection_section, status_output]
|
| 144 |
)
|
| 145 |
|
| 146 |
def toggle_custom_style(style): return gr.update(visible=(style == "Custom..."))
|