कुछ सप्ताह पहले मेरे पर्यवेक्षक ने मुझे यह देखने की चुनौती दी थी कि क्या मैं हमारी किसी विशेष समस्या के लिए कोई वर्कफ़्लो बना सकता हूँ। हम अपने एसएमएस (छात्र प्रबंधन प्रणाली) में प्री/एसीटी पत्र प्राप्त करना चाहते थे, जो हमारे मामले में स्काईवर्ड था। हमें जिस समस्या का सामना करना पड़ा वह यह है कि प्री/एसीटी पत्र या तो एक बड़े पीडीएफ में या प्रति व्यक्तिगत पीडीएफ में होते हैं, और स्काईवर्ड में जाने के लिए हमें प्रत्येक छात्र के नाम के लिए उनके आईडी नंबर के रूप में एक पीडीएफ की आवश्यकता होगी। इसे पूरा करने के लिए मैंने यूआई के लिए स्ट्रीमलिट का उपयोग करते हुए पायथन में एक प्रोग्राम लिखने का फैसला किया।
आइए पीडीएफ से शुरू करके उन समस्याओं पर नजर डालें जिनका हमें समाधान करना है। अक्षरों के बड़े पैमाने पर एकल पीडीएफ निर्यात को हासिल करना अधिक सार्थक था, इसका मतलब था कि हमें थोक निर्यात को अलग-अलग पीडीएफ में विभाजित करने की आवश्यकता थी। जबकि प्रत्येक अक्षर आम तौर पर 2 पृष्ठों का होता है, ऐसा हमेशा नहीं होता है, इसलिए एक साधारण विराम से हर दूसरा पृष्ठ त्रुटि-प्रवण होने की संभावना है।
दूसरा मुद्दा प्रत्येक छात्र की पीडीएफ को पढ़ना और उसका संबंधित आईडी नंबर पर नाम बदलना था। यह ज्यादातर रेगेक्स पैटर्न पर निर्भर करता है जो मुझे जो चाहिए था वह खींच लेता है।
चूंकि यह भी एक समय की चुनौती थी इसलिए मैंने कोड तैयार करने में मदद के लिए एआई के साथ काम किया। ध्यान दें: यह आपके द्वारा उपयोग किए जा रहे तर्क और भाषा को जानने का प्रतिस्थापन नहीं है। एआई/एलएलएम के साथ इसे लिखते समय मैंने चेन-ऑफ-थॉट दृष्टिकोण का उपयोग किया, जो मैं चाहता था उसके छोटे-छोटे टुकड़े देता था, और फिर अधिक जोड़ने से पहले प्रत्येक टुकड़े को डिबग और परीक्षण करता था। नीचे दिया गया कोड अंतिम कोड है जिसका उपयोग किया गया था, मैं प्रत्येक अनुभाग को अनुभाग दर अनुभाग तोड़ दूँगा। यदि आप इसे अपने जिले में समाधान के रूप में लागू करना चाहते हैं तो इस पोस्ट के अंत में टीएलडीआर देखें।
यह हिस्सा काफी सीधा है और यही वह आधार है जिस पर प्रोग्राम चलता है।
आवश्यकताओं की सामग्री.txt
streamlit pypdf2 fitz pymupdf
app.py आयात करता है
import PyPDF2 import fitz # PyMuPDF import re from pathlib import Path import concurrent.futures import streamlit as st import shutil import zipfile import os
यह अगला स्निपेट बल्क पीडीएफ में आईडी खोजने और उन्हें विभाजित करने के लिए उपयोग किए जाने वाले पृष्ठों की एक सूची बनाने से संबंधित है, यह वह हिस्सा है जो रेगेक्स पर निर्भर करता है और आपकी स्थिति के लिए इसे बदलने की आवश्यकता हो सकती है।
&&&]
def find_id_pages(input_pdf): doc = fitz.open(input_pdf) id_pages = [] id_pattern = re.compile(r'\(ID#:\s*(\d )\)') for i, page in enumerate(doc): text = page.get_text() if id_pattern.search(text): id_pages.append(i) return id_pages
जैसा कि शीर्षक में कहा गया है, इसका उपयोग पीडीएफ को विभाजित करने के लिए किया जाता है। यह प्रत्येक व्यक्तिगत पीडीएफ के लिए नाम निकालने के लिए एक फ़ंक्शन का उपयोग करेगा। आप यह भी देखेंगे कि यह प्रदर्शन को बेहतर बनाने के लिए उन्हें एक समय में 10 तक समानांतर में विभाजित करता है।
def split_pdf(input_pdf, output_folder, progress_callback): input_path = Path(input_pdf) output_folder = Path(output_folder) output_folder.mkdir(parents=True, exist_ok=True) # Find pages with IDs id_pages = find_id_pages(input_pdf) if not id_pages: st.error("No ID pages found in the PDF.") return pdf_reader = PyPDF2.PdfReader(str(input_path)) total_pages = len(pdf_reader.pages) temp_pdfs = [] for i in range(len(id_pages)): start_page = id_pages[i] end_page = id_pages[i 1] if i 1def extract_and_rename_pdf(pdf_path, output_folder): doc = fitz.open(pdf_path) text_first_page = doc[0].get_text() # Extract ID using a regex pattern for the format (ID#: 01234) match_first_page = re.search(r'\(ID#:\s*(\d )\)', text_first_page) if match_first_page: id_value = match_first_page.group(1) new_pdf_path = output_folder / f'{id_value}.pdf' pdf_path.rename(new_pdf_path) else: new_pdf_path = output_folder / f'unknown_{pdf_path.stem}.pdf' pdf_path.rename(new_pdf_path)वहाँ लगभग
अगले कुछ छोटे कार्य हैं, एक सभी विभाजित पीडीएफ को ज़िप करने के लिए (यदि आप इसे आंतरिक सर्वर पर चलाना चाहते हैं), और एक किसी भी अस्थायी फ़ाइलों को साफ़ करने के लिए ताकि कोई पीआईआई छात्र जानकारी इधर-उधर न लटके इसे जीने की जरूरत नहीं है।
def zip_output_folder(output_folder, zip_name): shutil.make_archive(zip_name, 'zip', output_folder)def clean_up(output_folder, zip_name): shutil.rmtree(output_folder) os.remove(f"{zip_name}.zip")यूआई का निर्माण
कोड का अंतिम बिट यूआई के लिए है। स्ट्रीमलाइट बहुमुखी प्रतिभा के लिए एक वेबयूआई है (हाँ आप इसे अकेले चला सकते हैं)। कुछ प्रयासों और प्रयोज्यता पर विचार करने के बाद। इसे सरल रखते हुए मैंने इसे एक अपलोड बटन, एक एक्शन बटन (यानी स्प्लिट) और ज़िप्ड पीडीएफ प्राप्त करने के लिए एक डाउनलोड बटन में बदल दिया।
# Streamlit App Portion st.title("PDF Splitter and Renamer") uploaded_file = st.file_uploader("Choose a PDF file", type="pdf") output_folder = "output_folder" if st.button("Split and Rename PDF"): if uploaded_file and output_folder: try: # Save uploaded file temporarily with open("temp_input.pdf", "wb") as f: f.write(uploaded_file.getbuffer()) progress_bar = st.progress(0) def update_progress(progress): progress_bar.progress(progress) split_pdf("temp_input.pdf", output_folder, update_progress) zip_name = "output_pdfs" zip_output_folder(output_folder, zip_name) st.success("PDF split and renamed successfully!") with open(f"{zip_name}.zip", "rb") as f: st.download_button( label="Download ZIP", data=f, file_name=f"{zip_name}.zip", mime="application/zip" ) # Remove temporary file Path("temp_input.pdf").unlink() clean_up(output_folder, zip_name) except Exception as e: st.error(f"An error occurred: {e}") else: st.error("Please upload a PDF file and specify an output folder.")उठने और चलने के लिए टीएलडीआर
चीजों को चालू करने और चलाने के लिए बस निम्नलिखित कमांड का उपयोग करें (यह Linux, WSL और MacOS मानता है)। और आप http://localhost:8501 पर जाकर ऐप तक पहुंच सकेंगे।
git clone https://github.com/Blacknight318/act-to-sms.git cd act-to-sms python3 -m venv venv source venv/bin/activate pip install -r requirements.txt streamlit run app.pyसमापन का वक्त
यदि आप K12 स्कूल में हैं तो मुझे आशा है कि आपको यह उपयोगी लगेगा। यदि ऐसा है तो ताली बजाओ या मेरे लिए कॉफ़ी खरीदने पर विचार करो। अगली बार तक, अच्छी हवाएं और समुद्र का अनुसरण।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3