Spaces:
Sleeping
Sleeping
Added functionality to remove pages from a PDF
Browse files
app.py
CHANGED
|
@@ -86,6 +86,44 @@ def split_pdf(file_path, start_page, end_page):
|
|
| 86 |
zipf.close()
|
| 87 |
return zip_path, start_page + 1, end_page + 1
|
| 88 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 89 |
def process_pdf(file, start_page, end_page):
|
| 90 |
if file is None:
|
| 91 |
return "❌ No file uploaded.", None
|
|
@@ -152,6 +190,31 @@ with gr.Blocks(title="PDF Utility") as demo:
|
|
| 152 |
inputs=[pdf_uploads],
|
| 153 |
outputs=[merge_status, merged_file]
|
| 154 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 155 |
|
| 156 |
-
|
| 157 |
-
demo.launch()
|
|
|
|
| 86 |
zipf.close()
|
| 87 |
return zip_path, start_page + 1, end_page + 1
|
| 88 |
|
| 89 |
+
def remove_pages(file, pages_to_remove):
|
| 90 |
+
if file is None:
|
| 91 |
+
return "❌ No file uploaded.", None
|
| 92 |
+
|
| 93 |
+
input_pdf = PdfReader(open(file.name, "rb"))
|
| 94 |
+
writer = PdfWriter()
|
| 95 |
+
total_pages = len(input_pdf.pages)
|
| 96 |
+
|
| 97 |
+
# Parse page numbers
|
| 98 |
+
pages_to_remove = pages_to_remove.replace(" ", "")
|
| 99 |
+
remove_set = set()
|
| 100 |
+
|
| 101 |
+
try:
|
| 102 |
+
for part in pages_to_remove.split(","):
|
| 103 |
+
if "-" in part:
|
| 104 |
+
start, end = map(int, part.split("-"))
|
| 105 |
+
remove_set.update(range(start, end + 1))
|
| 106 |
+
else:
|
| 107 |
+
remove_set.add(int(part))
|
| 108 |
+
except:
|
| 109 |
+
return "❌ Invalid page format.", None
|
| 110 |
+
|
| 111 |
+
# Keep valid pages only
|
| 112 |
+
remove_set = {p for p in remove_set if 0 <= p < total_pages}
|
| 113 |
+
|
| 114 |
+
for i in range(total_pages):
|
| 115 |
+
if i not in remove_set:
|
| 116 |
+
writer.add_page(input_pdf.pages[i])
|
| 117 |
+
|
| 118 |
+
output_dir = tempfile.mkdtemp()
|
| 119 |
+
output_path = os.path.join(output_dir, "pages_removed.pdf")
|
| 120 |
+
|
| 121 |
+
with open(output_path, "wb") as f:
|
| 122 |
+
writer.write(f)
|
| 123 |
+
|
| 124 |
+
status = f"✅ Removed pages: {sorted(remove_set)}"
|
| 125 |
+
return status, output_path
|
| 126 |
+
|
| 127 |
def process_pdf(file, start_page, end_page):
|
| 128 |
if file is None:
|
| 129 |
return "❌ No file uploaded.", None
|
|
|
|
| 190 |
inputs=[pdf_uploads],
|
| 191 |
outputs=[merge_status, merged_file]
|
| 192 |
)
|
| 193 |
+
|
| 194 |
+
with gr.TabItem("Remove Pages"):
|
| 195 |
+
gr.Markdown(
|
| 196 |
+
"Remove one or more pages from a PDF.\n\n"
|
| 197 |
+
"**Examples:** `2`, `1,3,5`, `2-6`, `1,3,5-7`\n\n"
|
| 198 |
+
"⚠️ Page numbers are **0-based**."
|
| 199 |
+
)
|
| 200 |
+
|
| 201 |
+
remove_file = gr.File(label="Upload PDF", file_types=[".pdf"])
|
| 202 |
+
|
| 203 |
+
pages_input = gr.Textbox(
|
| 204 |
+
label="Pages to remove",
|
| 205 |
+
placeholder="e.g. 1,3,5-7"
|
| 206 |
+
)
|
| 207 |
+
|
| 208 |
+
remove_button = gr.Button("🗑 Remove Pages")
|
| 209 |
+
|
| 210 |
+
remove_status = gr.Textbox(label="Status", lines=2)
|
| 211 |
+
removed_pdf = gr.File(label="Download PDF")
|
| 212 |
+
|
| 213 |
+
remove_button.click(
|
| 214 |
+
fn=remove_pages,
|
| 215 |
+
inputs=[remove_file, pages_input],
|
| 216 |
+
outputs=[remove_status, removed_pdf]
|
| 217 |
+
)
|
| 218 |
+
|
| 219 |
|
| 220 |
+
demo.launch()
|
|
|