shriarul5273 commited on
Commit
c4b0122
·
verified ·
1 Parent(s): a73fb0d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +35 -12
app.py CHANGED
@@ -1,22 +1,32 @@
1
  import gradio as gr
2
- from PyPDF2 import PdfReader, PdfWriter
3
  import tempfile
4
  import os
5
  import atexit
6
 
7
- def merge_pdfs(pdf_files, order):
8
  pdf_writer = PdfWriter()
9
 
10
  # Sort the PDF files based on the specified order, skipping files marked with '0'
11
  sorted_pdfs = [pdf_files[i-1] for i in order if i != 0]
12
 
 
 
 
 
13
  # Read and add each PDF file to the writer in the specified order
14
- for pdf in sorted_pdfs:
15
  pdf_reader = PdfReader(pdf.name)
 
 
 
 
 
 
16
  for page in pdf_reader.pages:
17
  pdf_writer.add_page(page)
18
 
19
- # Create a named temporary file for the merged PDF as 'combine.pdf'
20
  temp_file_path = os.path.join(tempfile.gettempdir(), "combine.pdf")
21
  with open(temp_file_path, 'wb') as temp_file:
22
  pdf_writer.write(temp_file)
@@ -25,14 +35,17 @@ def merge_pdfs(pdf_files, order):
25
 
26
  # Create Gradio interface
27
  with gr.Blocks() as demo:
28
- gr.Markdown("# PDF Merger and Viewer")
29
  pdf_input = gr.File(label="Upload PDF Files to Merge", file_types=[".pdf"], file_count="multiple")
30
  order_input = gr.Textbox(label="Enter the order of PDFs as comma-separated numbers, skip the number if you want to skip the file", placeholder="1,2,3,... or 3,1,2")
31
- merge_button = gr.Button("Merge PDFs")
 
 
 
 
32
  merged_result = gr.File(label="Download Merged PDF")
33
 
34
- # Set button action to merge PDFs and then display the first page
35
- def merge_and_preview(pdf_files, order):
36
  n = len(pdf_files)
37
 
38
  if not order:
@@ -49,11 +62,21 @@ with gr.Blocks() as demo:
49
  if any(i < 0 or i > n for i in order):
50
  return gr.Error(f"Order values must be between 0 and {n} (0 means to skip the file).")
51
 
52
- # Adjust order by removing '0' entries and merging only the specified files
53
- merged_pdf_path = merge_pdfs(pdf_files, order)
54
  return merged_pdf_path
55
 
56
- merge_button.click(merge_and_preview, inputs=[pdf_input, order_input], outputs=[merged_result])
 
 
 
 
 
 
 
 
 
 
57
 
58
  # Launch the Gradio app
59
  demo.launch()
@@ -65,4 +88,4 @@ def cleanup_temp_files():
65
  if filename.endswith('.pdf'):
66
  os.remove(os.path.join(temp_dir, filename))
67
 
68
- atexit.register(cleanup_temp_files)
 
1
  import gradio as gr
2
+ from PyPDF2 import PdfReader, PdfWriter, PageObject
3
  import tempfile
4
  import os
5
  import atexit
6
 
7
+ def merge_pdfs(pdf_files, order, start_on_odd=False):
8
  pdf_writer = PdfWriter()
9
 
10
  # Sort the PDF files based on the specified order, skipping files marked with '0'
11
  sorted_pdfs = [pdf_files[i-1] for i in order if i != 0]
12
 
13
+ # Define default page size (A4)
14
+ default_width = 595.276 # 8.27 inches
15
+ default_height = 841.890 # 11.69 inches
16
+
17
  # Read and add each PDF file to the writer in the specified order
18
+ for i, pdf in enumerate(sorted_pdfs):
19
  pdf_reader = PdfReader(pdf.name)
20
+
21
+ # If start_on_odd is True and it's not the first PDF and the current total page count is odd, add a blank page
22
+ if start_on_odd and i > 0 and len(pdf_writer.pages) % 2 != 0:
23
+ blank_page = PageObject.create_blank_page(width=default_width, height=default_height)
24
+ pdf_writer.add_page(blank_page)
25
+
26
  for page in pdf_reader.pages:
27
  pdf_writer.add_page(page)
28
 
29
+ # Create a named temporary file for the merged PDF
30
  temp_file_path = os.path.join(tempfile.gettempdir(), "combine.pdf")
31
  with open(temp_file_path, 'wb') as temp_file:
32
  pdf_writer.write(temp_file)
 
35
 
36
  # Create Gradio interface
37
  with gr.Blocks() as demo:
38
+ gr.Markdown("# PDF Merger")
39
  pdf_input = gr.File(label="Upload PDF Files to Merge", file_types=[".pdf"], file_count="multiple")
40
  order_input = gr.Textbox(label="Enter the order of PDFs as comma-separated numbers, skip the number if you want to skip the file", placeholder="1,2,3,... or 3,1,2")
41
+
42
+ with gr.Row():
43
+ merge_button = gr.Button("Merge PDFs (Normal)")
44
+ merge_odd_button = gr.Button("Merge PDFs (Each PDF starts on odd page)")
45
+
46
  merged_result = gr.File(label="Download Merged PDF")
47
 
48
+ def merge_and_preview(pdf_files, order, start_on_odd=False):
 
49
  n = len(pdf_files)
50
 
51
  if not order:
 
62
  if any(i < 0 or i > n for i in order):
63
  return gr.Error(f"Order values must be between 0 and {n} (0 means to skip the file).")
64
 
65
+ # Merge PDFs with the specified start_on_odd option
66
+ merged_pdf_path = merge_pdfs(pdf_files, order, start_on_odd)
67
  return merged_pdf_path
68
 
69
+ merge_button.click(
70
+ lambda *args: merge_and_preview(*args, False),
71
+ inputs=[pdf_input, order_input],
72
+ outputs=[merged_result]
73
+ )
74
+
75
+ merge_odd_button.click(
76
+ lambda *args: merge_and_preview(*args, True),
77
+ inputs=[pdf_input, order_input],
78
+ outputs=[merged_result]
79
+ )
80
 
81
  # Launch the Gradio app
82
  demo.launch()
 
88
  if filename.endswith('.pdf'):
89
  os.remove(os.path.join(temp_dir, filename))
90
 
91
+ atexit.register(cleanup_temp_files)