kuroiikimono commited on
Commit
af64171
·
verified ·
1 Parent(s): fad0d5b

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +84 -0
app.py ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ from pypdf import PdfReader, PdfWriter
3
+ import io
4
+
5
+ # ページごとに分割する関数
6
+ def split_pdf_by_pages(reader):
7
+ total_pages = len(reader.pages)
8
+ split_files = {}
9
+
10
+ for page_num in range(total_pages):
11
+ try:
12
+ writer = PdfWriter()
13
+ writer.add_page(reader.pages[page_num])
14
+ output_pdf = io.BytesIO()
15
+ writer.write(output_pdf)
16
+ output_pdf.seek(0)
17
+ split_files[page_num] = output_pdf
18
+ st.write(f"Page {page_num + 1} processed.") # Streamlit での表示
19
+ except Exception as e:
20
+ st.error(f"Error processing page {page_num + 1}: {e}") # Streamlit でのエラー表示
21
+ raise
22
+
23
+ return split_files
24
+
25
+ # グループごとにマージする関数
26
+ def merge_pdfs_in_groups(split_files, group_size=50):
27
+ pdf_files = sorted(split_files.keys())
28
+ merged_files = {}
29
+
30
+ for i in range(0, len(pdf_files), group_size):
31
+ group = pdf_files[i:i + group_size]
32
+ try:
33
+ writer = PdfWriter()
34
+ for page_num in group:
35
+ pdf_file = split_files[page_num]
36
+ reader = PdfReader(pdf_file)
37
+ for page in reader.pages:
38
+ writer.add_page(page)
39
+
40
+ output_pdf = io.BytesIO()
41
+ writer.write(output_pdf)
42
+ output_pdf.seek(0)
43
+ merged_files[i // group_size] = output_pdf
44
+ st.write(f"Merged group {i // group_size + 1} processed.") # Streamlit での表示
45
+ except Exception as e:
46
+ st.error(f"Error merging group {i // group_size + 1}: {e}") # Streamlit でのエラー表示
47
+ raise
48
+
49
+ return merged_files
50
+
51
+ # ファイルをダウンロード用リンクとして表示する関数 (Streamlit 版)
52
+ def create_download_link(file_data, display_name):
53
+ st.download_button(
54
+ label=f"Download {display_name}",
55
+ data=file_data,
56
+ file_name=display_name,
57
+ mime="application/pdf"
58
+ )
59
+
60
+ # メイン処理
61
+ def main():
62
+ st.title("PDF Splitter and Merger with Streamlit")
63
+
64
+ uploaded_file = st.file_uploader("Upload a PDF file", type="pdf")
65
+
66
+ group_size = st.number_input("Group size (pages per group)", min_value=1, value=20)
67
+
68
+ if uploaded_file is not None:
69
+ try:
70
+ file_bytes = uploaded_file.read()
71
+ reader = PdfReader(io.BytesIO(file_bytes))
72
+ split_files = split_pdf_by_pages(reader)
73
+ merged_files = merge_pdfs_in_groups(split_files, group_size)
74
+
75
+ for i, file_obj in split_files.items():
76
+ create_download_link(file_obj.getvalue(), f"page_{i+1}.pdf")
77
+ for i, file_obj in merged_files.items():
78
+ create_download_link(file_obj.getvalue(), f"group_{i+1}.pdf")
79
+
80
+ except Exception as e:
81
+ st.error(f"Error processing PDF: {e}")
82
+
83
+ if __name__ == "__main__":
84
+ main()